2009-08-24 79 views
0

我有幾個數據庫表,它們只需要引用另一個表的唯一標識,例如我是否需要爲每個表定義一個新的主鍵字段?

Customer  Holiday 
********  ******* 
ID (PK) ---> CustomerID (PK) 
Forename  From 
Surname  To 
.... 

這些表格,如假日,只存在用於存放有關客戶的信息。因此,我是否需要指定一個單獨的字段來保存假期的ID?即

Holiday 
******* 
ID (PK) 
CustomerID (FK) 
... 

不然我就ok了,在這種情況下,只設置在客戶作爲表的主鍵?

Regards, James。

回答

3

這真的取決於你在做什麼。

如果每個客戶只能有1個假期,那麼是的,您可以使customerid爲主鍵。

如果每個客戶可以有多個節假日,那麼不,你會想添加一個新的ID列,使它成爲主要的。這使您可以選擇每個客戶的假期,並通過其唯一ID選擇單個記錄。

此外,如果每個客戶只能有1個假期,我只是將節假日信息添加到表中,因爲一對一關係通常是不必要的。

+0

好的,在這個特殊的例子中,客戶可以有多個節假日。但是,當客戶在該表中只能有1條記錄時,第一個例子會是最合適的? – James 2009-08-24 21:08:38

+1

詹姆斯 - 可能。如果每個客戶只有1條記錄,我幾乎建議將其添加到客戶表。除非有一對一的關係的強制性理由。 – 2009-08-26 13:58:43

+0

+1好點!我有一張桌子,每個顧客只能有一個記錄,而我將它分成一張桌子的原因是因爲有很多關於這個特定桌子的信息,我只是不覺得它們屬於客戶桌子。 – James 2009-09-02 19:06:50

0

如果我正確理解您的問題,那麼您只能在假期中使用客戶表作爲主鍵,如果從未是表中該客戶的任何其他假期。換句話說,一個客戶的兩個假期會將客戶ID用作主鍵。

0

如果會有與此數據庫相關的面向對象的程序,每個實體(每行)都必須有一個唯一的鍵。

您的第二個設計確保每個Holiday節點都可以由OO應用程序使用簡單的對象關係映射進行唯一標識和處理。

通常,最好確保數據庫中的每個實體都有一個唯一的,不可變的系統分配(「代理」)鍵。其他「自然」鍵可以具有唯一的索引,約束等,以適應業務邏輯。

0

以前的答案是正確的,但也請記住,每個表中可以有2個獨立的主鍵,而「假期」表將具有CustomerId的外鍵。

然後,您可以在代碼中管理爲客戶分配的假期,以確保只有一個假期可以分配給客戶,但這會帶來問題併發性,即2人爲客戶添加假期同一時間最有可能導致有2個假期的客戶。

你甚至可以放置在客戶表節日領域,如果一個客戶只能與一個節日來創建的,而這樣的設計是凌亂,而在你的問題2不是真的勸

所以再次,選擇仍然是最好的方式去,只是給你你的選擇。

+0

我不是依賴代碼來強制執行隱式數據庫約束的忠實粉絲。編碼缺陷,SQL腳本和其他力量很容易破壞這些假定的約束/關係。 – Mayo 2009-08-24 19:29:07

+0

我也不是一個粉絲,但對於這樣一個簡單的問題,它的價值儘可能多的變化 – Neil 2009-08-25 11:37:01

0

在實踐中,我發現每個表都應該有一個唯一的主鍵來標識這些表中的記錄。所有與其他表格的關係都應該明確聲明。

這有助於他人更好地理解關係,特別是如果他們使用工具將模式逆向工程化爲可視表示。

此外,它爲您提供更大的靈活性來擴展您的解決方案。您現在可能每個客戶只有一個假期,但如果您將客戶ID作爲主鍵,則這一點更難改變。

如果要在假期表中指定客戶的唯一性,請在該外鍵上創建唯一索引。事實上,當查詢客戶ID時,這可以提高性能(儘管我猜測你不會看到足夠的記錄來注意到這種改進)。

相關問題