2013-08-23 35 views
0

我頭腦風暴如何重組數據庫的聯繫信息。如您所知,電話號碼可以鏈接到一個人(手機),一個家庭(家庭電話),一個組織/企業等。邏輯上,電話號碼是電話號碼是電話號碼。手機號碼和家庭電話號碼之間沒有真正的區別。一個人可以有多部手機,一個家庭可以有多條電話線,而一個組織可以有許多電話線。如何確保記錄只能是一個記錄的孩子,當它可以是多個表格的孩子時?

通常,在設計表格時,這意味着應該有一個電話號碼錶。它應該以一對多的方式與個人或家庭或組織聯繫起來。問題是,有人會如何強制實施:電話記錄只屬於單親記錄,無論該記錄是人記錄還是家庭記錄還是組織記錄?

在我看來,我發現的唯一兩種方法是kludges。我想要一個優雅的解決方案

第一個是創建3個表格,PersonPhones,FamilyPhones和OrganizationPhones。然後你有3個表,其任務是存儲基本相同的數據。

第二個是創建一個奇怪結構的單個電話表。它將具有電話號碼,用於個人ID的可空字段,用於家庭ID的第三字段以及用於組織Id的第三字段。然後添加一個約束,強制這3箇中的2個爲NULL。

任何想法?

回答

0

你可以在你的PhoneTable(Person_Id,Phone_Number和Phone_Details)中有3列。在Phone_Details列中,您可以提及其手機,家庭或組織。然後你可以在Person_Id和Phone_Details的組合上定義一個唯一的密鑰。

+0

抱歉,這不是一個好主意 - 數據庫管理系統將無法執行外鍵。 –

0

一般有兩種方法來處理這樣的情況:

  • 一種方法是使用繼承 - 箱子一個「PhoneOwner」表,這將是一個人,家庭的邏輯父,組織和任何其他需要能夠擁有電話的實體。然後,將手機連接到PhoneOwner。
  • 另一種是使用獨家外鍵,你已經在你的問題中描述過。

既不是理想的,你必須決定哪一個更適合你的需求。

參見:"What is the best design for a database table that can be owned by two different resources, and therefore needs two different foreign keys?"

相關問題