簡體   English   中英

數據庫設計-3個表之間的外鍵和主鍵關系

[英]Database Design - Foreign Key and Primary Key relationships across 3 tables

作為我自己的個人項目,我正在嘗試將正在使用的現有Access數據庫工具之一重新設計到VB.net中。 這包括從頭開始重新設計數據庫,因為當前數據庫絕對是一團糟。

這是我目前在SQL Server中重新設計時的當前數據庫:

在此處輸入圖片說明

現在使關系清楚:

在“ Client表上,“ Client_ID是主鍵。 這與Contracts.Client_ID作為其外鍵有關系。 這也與Sites.Client_ID作為Sites.Client_ID鍵有關系。

在“ Sites表上, Site_ID是主鍵。 這與Contracts.Site_ID作為其外鍵有關系。

每個表中的每個主鍵在每次創建記錄時都會自動增加一個。

這里的想法是一個簡單的客戶/站點/合同結構。 例如,客戶:Microsoft,站點:Reading總公司,合同(可以適用於整個公司或單個站點的任何類型的合同)。

沒有客戶,您將無法擁有一個網站。 您應該能夠將合同鏈接到客戶或站點。 目前,我在合同中允許將Site_IDClient_ID都設置為Null來簡化此操作,因為我找不到任何方法來確保至少填寫了一個。

這種設計看起來合理並遵循最佳實踐嗎? 我已嘗試按照網絡上發現的許多不同建議遵循最佳實踐,為不同類型的數據命名表。 任何輸入將不勝感激

我建議您簽出創建和更改CHECK約束 一個簡單的條件(“ Client_ID不為空或Site_ID不為空”)

附帶說明,該結構應適用於業務規則。 客戶可以在沒有網站的情況下簽訂合同嗎? 這有意義嗎? 如果是這樣,那么繼續使用您擁有的內容,如果沒有,我建議您要求合同的站點信息(您將發票發送到哪里?),因此您可以從合同中刪除client_id。

鑒於這里的情況如此簡單,我不會再考慮其他問題,例如是否應該將電話號碼附加到站點或聯系人上? 我想說,聯系是續簽人員的電話號碼,可能與簽有合同的號碼有很大不同。

我會做類似的事情

客戶端

ClientID PK,名稱

僅特定於客戶的屬性

Client_Contracts

ClientID FK [客戶(ClientID)],ContractID FK(Contrats [ContractID])

Contratcs

ContractID(PK),StartDate,EndDate,SiteID FK(站點[SiteID])

僅合同必須具有的屬性。

網站

SiteID PK,網站的所有列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM