Database-Design

儲存一個人的多個聯繫地址

  • December 1, 2021

簡化圖供參考。 簡化圖供參考

我的數據庫以下列方式儲存有關人員的資訊。有一個 Person包含常用個人資訊欄位的表格;姓名、出生日期、性別等。

ContactInformation每個人的聯繫資訊以 1:1 的關係保存在表中。

最後,對於我們儲存數據的組織中的每種特定類型的人,都有單獨的表,與它們的關係為 1:1Person

Student我的桌子有點問題。基本上,我的客戶現在想為學生儲存家庭地址和學期地址。但我不確定如何解決這個問題。

我看到三個可能的選項/解決方案:

  • 連接表- 在和之間創建連接表(例如ContactAddressMapping)。Person``ContactInformation
  • 新表- 創建一個TermTimeAddress與 1:1 關係的表Student
  • 新欄位- 向表中添加額外欄位以Student保存學期時間地址。

現在這是我在每個選項中看到的主要“問題”:

聯結表將允許為一個人儲存多個地址,但我們只需要為學生執行此操作(目前)。如果不使用某種布爾欄位,也無法確定哪個地址是家庭/學期時間地址,這在該表中似乎是無意義的資訊,因為它僅對學生來說是唯一的。

創建一個新表將術語時間地址與主地址分開,但這些感覺像是重複,因為我基本上是在創建具有相同欄位的特定類型的地址,減去電話號碼和電子郵件地址等內容。

將欄位添加到Student似乎我在表格中添加了應該在其他地方的資訊。該表應僅用於提供有關該學生的資訊,例如他們的學校、學習領域以及他們安置的開始和結束日期。

其中哪一個是最合適的選擇,還是我還沒有看到其他解決方案?

無論如何,我不會將 ContactInformation 一對一地連結到 Person ;在 ContactInformation 中儲存多個這樣的地址違反了正常形式。相反,我將使用其自己的 PK 的 ContactInformation,將 PersonID 的 FK 返回到 Person 表,並根據需要為每個 Person 儲存盡可能多的聯繫人。

CREATE TABLE ContactInformation (
   ContactID int IDENTITY(1,1) PRIMARY KEY,
   PersonID int FOREIGN KEY REFERENCES Person(id),
   ContactInfo nvarchar(250),
   ContactType char(2)
)

用 PersonID 填充 ContactInformation 表,然後是電子郵件地址/電話號碼/郵寄地址/推特句柄/等,並用 ContactType 標記它。這可能是“MA”代表郵寄地址,“EM”代表電子郵件,“TW”代表 Twitter,“TT”代表您的問題。

觸發器可以驗證任何插入以確保聯繫人沒有 TT(學期時間)地址,除非他們是學生。

希望這可以幫助您跳出框框思考。如果您已經深入應用程序,那麼此時進行這些更改可能太難了。

編輯:我覺得我沒有正確解決您的直接問題。如果我是你並且此時進行更深層次的更改是不可能或不可行的,我會將 TermTime 地址添加到學生表中。

它屬於那裡,因為 1) 它僅適用於學生,因此將其放在 Person 或 Contact 表中(因為它們現在存在)不太理想,並且 2) 每個學生都應該有一個,因此它已經是他們學生記錄的一部分,並且 3 ) 這可以在對現有模式的破壞最小的情況下完成。

引用自:https://dba.stackexchange.com/questions/144991