2011-12-09 121 views
1

我是新來設置關係數據庫。MySQL多個外鍵

我想在MySQL,USER表和COMPANY表中創建兩個表。兩者都應該能夠有多個電話號碼與他們關聯,所以我創建了一個PHONE表,並希望從COMPANY到PHONE和從USER到PHONE都有一對多的關係。

目前似乎只是兩個選項中我試圖做的事:

  1. 請PHONE兩個外鍵,一個引用的公司,一個引用用戶。他們都默認爲NULL,每個都在PHONE中創建一個新行時,我只填寫我需要的一行。

  2. 有兩個不同的表,USER_PHONE和COMPANY_PHONE。

這兩個選項對我來說似乎都不是最佳選擇。選項1看起來很亂,容易出現冗餘問題。方案2似乎很重複且不必要。我傾向於認爲選項2是做事的「官方」方式(開始懷疑這是爲什麼我聽到有關MySQL的負面信息)。

有人嗎?謝謝,

-Matt

回答

2

我不喜歡提出瞭如下設計(就像你):

首先,我們將有三個表

USER -- UserId, other fields 
COMPANY -- CompanyId, other fields 
PHONE -- PhoneId, PhoneNumber 

然後有兩個表用於存儲關係

COMPANY_PHONE -- CompanyId, PhoneId 
USER_PHONE -- UserId, PhoneId 
+0

你先生,非常優秀。 – mag725

1

有兩個不同的電話號碼錶引發 一些問題。

  • 你必須在多個地方查找電話號碼。
  • 如果一個人和一家公司共用一個電話號碼,並且電話號碼 發生變化,您可能會忘記在所有表格中更新它。
  • 它違反了Principle of Orthogonal Design,它鬆散地表示「不要有意義重疊的表」。

改爲使用supertype/subtype schema。 (鏈接答案包括實現模式的示例SQL。)這種模式認識到用戶和公司並不完全相同,但它們並沒有完全不同。