用於建構與記錄的多個關聯的選項
這是 101 級的東西,我保證以後會讀一本書,但與此同時,給定以下三個表格:
Product --------- ProductId (uniqueidentifier) User --------- UserId (uniqueidentifier) Company --------- CompanyId (uniqueidentifier)
如果可以將產品分配給不同的“所有者”(即,使用者、公司等),我可以想到兩個表結構來完成此操作:
解決方案 1(所有所有者 1 個表):
ProductAssignment --------- ProductId, OwnerId (constraint to ensure either UserId, CompanyId, etc.)
解決方案 2(每個所有者 1 個表):
UserProduct --------- UserId, ProductId CompanyProduct --------- CompanyId, ProductId
解決方案 2 提供了更多“合適的”模型,但我們有很多這樣的場景,這將導致我們的數據庫中充斥著數十種此類表。編寫程式碼也很痛苦,因為每次添加新的所有者表時我都需要創建一個新的冗餘查詢。我覺得解決方案 1 的維護和編碼會容易得多,但也許我錯了?
對於它的價值,大部分數據訪問將通過 LINQ to SQL(ASP.NET Web 窗體項目)和實體框架(ASP.NET MVC 項目)。很少有sprocs之類的。
- 每個解決方案我缺少哪些優點和缺點?
- 如果我選擇解決方案 1,我會遇到不好的事情嗎?即,穿著黑色西裝和太陽鏡的人出現在辦公室讓我“消失”?
- 有解決方案3嗎?
我不完全確定我是否正確,但據我所知,解決方案 1 將不起作用,因為您不能在同一列中添加兩個外鍵,即使值可能會重疊,例如現有的 a
UserId = 1
和 aCompanyId = 1
導致您不知道它們中的哪一個是真實的,此外,考慮一個大的解決方案,您甚至可能會影響只希望公司擁有或使用者擁有的查詢的性能。解決方案 2 對我來說似乎更加健壯和高效。
有兩種方法可以用相對較少的努力實現這一目標。哪個更好取決於所有權的性質。
多個所有者
如果一個產品可以有多個擁有它的實體(兩個或多個共享所有權的人,或者一個人和一個公司,或者兩個或多個公司),那麼我會用一個包含多個列的父子連結表來建模它區分涉及的所有者類型。
ProductOwner ------------ ProductOwnerID PK Not Null ProductID FK UserID FK CompanyID FK ...
因此,對於每個產品,您將在 ProductOwner 表中為每個所有者創建一個條目。如果所有者是一家公司,則該表將在 ProductOwnerKey、ProductID 和 CompanyID 欄位中具有值,而其他 ID 欄位將為空。
因此,對於產品的每個所有者,此表中都會有一個條目,其中一些欄位始終為空。可能存在其他列,例如創建日期、修改日期、修改使用者 ID 等…
單身業主
如果產品只能有一個所有者,那麼我會將外鍵直接添加到產品表中。
Products -------- ProductID PK Not Null UserID FK CompanyID FK ...
因此,如果產品只有一個所有者,那麼只需將連結到每個潛在所有者表的外鍵值直接放在產品表中,然後只填充適當的 FK 值,而將其他所有者 FK 留空。