2013-04-29 45 views
0

一種DB設計問題:簡單的嘉賓名單數據庫設計

在嘉賓名單黨,我們將有主機(那些誰組織和參加黨)和客人(那些誰是剛剛參加派對) 。

有兩種類型的嘉賓:

  1. 客戶機上使用的邀請卡:那些在自己的家園物理接到邀請卡,並

  2. 客人沒有邀請卡:那些誰需要陪同邀請持有邀請卡的客人蔘加派對。

據瞭解,有必要註冊第一類賓客的地址,因爲有必要知道在哪裏放棄邀請卡。 此外,對於每個訪客,都需要知道誰邀請他們的主持人或訪客ID。

問題是:
我應該創建多少個表?
一個人,所有的觀衆在裏面嗎?
兩張桌子:一個給主人,一個給客人?
三個表格:一個用於主持人,一個用於邀請卡的客人,另一個用於沒有邀請卡的客人?

我在第三個解決方案(三張表)中看到的優點是,我避免爲沒有邀請卡的客人留下字段「地址」,並且我可以使用邀請卡註冊訪客ID將要採取他們。

我很樂意閱讀您的意見和想法。

回答

0

五張桌子,至少。

Host 
---- 
Host ID 
Host Name 
... 

Invited Guest 
------------- 
Invited Guest ID 
Invited Guest Name 
Invited Guest Address 
... 

Guest 
----- 
Guest ID 
Guest Name 
... 

Party 
----- 
Party ID 
Host ID 
Party Time stamp 
Party Address 
... 

Party Guest 
----------- 
Party Guest ID 
Party ID 
Invited Guest ID 
Guest ID 
... 

我總是將表的主(集羣)鍵定義爲自動遞增整數或長整數。

外鍵應該是顯而易見的名稱。 Party Guest表中的Guest ID外鍵是可空的外鍵。被邀請的客人可以邀請客人,但不必。

另外兩張表可以幫助減少上述五張表中的重複數量。

Name 
---- 
Name ID 
Name 

Address 
------- 
Address ID 
Address 

由於一方的訪客可能是另一方的主機,因此這些表可最大限度地減少數據重複。

您只需用名稱ID和地址列中的每個地址列替換每個名稱列。

0

總是有一個解決方案來解決問題(好吧,大多數情況下)。所以你可以用很多方式做到這一點,一個表,兩個或三個。你可以把他們全部放在一張桌子上,設置一個主持人的旗幟,邀請客人和帶賓客的標誌,還有一個'邀請人'的字段指向他受邀的人(主持人或受邀客人)的ID在)。 你可以使用兩個表,一個用於主機,一個用於客人。通過這種方式,您可以將「帶來」賓客引薦給受邀客人,將所有客人引薦給他們相應的主持人。它還使您能夠捕獲帶客人的地址,這絕不是一個壞主意。 您可以使用三個表格:主持人,賓客,賓客2主持人。與上面相同,但是主機和來賓之間的多對多關係(在guests2hosts表中),這使您可以邀請受邀參加多方的來賓。 我想如果你想更進一步,你可以想出更多可能的DB佈局。 創建數據庫是您需要仔細考慮的問題,關於當前的需求以及未來可能的需求。許多系統現在運行良好,但由於糟糕的數據庫設計而無法擴展。

+0

感謝您的快速答覆。我知道桌子的數量可以是任意的,但我正在尋找可以讓我將主持人與客人以及客人與「客人」連接起來的表格數量。關於使用持有多對多關係的表的想法對於多方來說是很好的。 – 2013-04-29 14:36:50

0

確定這裏是一個更通用的選擇:

person 
----------- 
person_id 
name 

event 
----------- 
event_id 
name 
event_begin_datetime 
event_end_datetime 

person_event 
-------------- 
person_id 
event_id 
role_code <-- use this to indicate which type of guest or host 
invitation_mailed <-- helpful flag which may otherwise be derivable based on role 

address 
-------------- 
address_id 
other address fields 

person_address 
------------- 
person_id 
address_id 

event_address 
-------------- 
event_id 
address_id