2010-05-20 117 views
1

我有一個方案,其中: 有兩個(或多個)表代表獨立項目。可以說用戶和公司與許多表相關的一對多關係

這兩個表都需要存儲地址。每個人可以有一個或多個地址

在正常的1到很多情況下地址表woudl只是有一個UserId或一個CompanyId創建一個正常的1對多關係。

在這種情況下,我有我能想到的

  1. 地址表可以同時擁有一個用戶名和一個CompanyId幾個辦法,只有一個將用於每個記錄。

  2. 2鍵可以使用的ObjectId和對象類型因此對象ID將有一個用戶ID或CompanyId和對象類型woudl是用戶或公司

  3. 創建ObjectTable並添加到的ObjectId用戶和公司。地址然後將有一個OjbectId

我真的不喜歡任何這些解決方案。我想知道這裏最好的方法是什麼。

在另一個說明我很可能用戶linqtosql我的數據訪問層。

回答

2

我不確定有關Linq-to-SQL的含義,但解決此問題的一種模式是使用多個Junction Tables

對於您的情況,您將有一個名爲AddressUsers的表,它具有兩列:AddressId和UserID以及一個名爲AddressCompanies的表,其中具有AddressId和CompanyId列。

1

去許多一對多:

地址表,具有獨特的合成ID(例如,自動增量)。

user_address表,具有唯一的合成id(例如,自動增量),user_id外鍵和地址外鍵。

一個company_address表,具有唯一的合成id(例如,自動增量),company_id外鍵和地址外鍵。

(請注意,如果用戶(或公司)可能有只有一個地址,你就必須在user表中的ADDRESS_ID外鍵(或德公司表),這是不是你的使用情況。)

1

你有什麼是多態關聯。我不熟悉linqtosql,但是如果它支持這種類型的關係的參照完整性,那麼不要害怕,要做任何地圖。

在標準實踐中,多態關聯通常可以通過反轉來克服。您應該爲每個用戶和公司分別添加一個路口(路口)表,以將它們加入地址。這類似於多對多關係,交集表中的每一行都指一個用戶和一個地址。

如果使用交集表,爲了避免多對多(但保持一對多)在交集表中的地址關鍵字上設置唯一約束。

如果您有ORM問題,請使用與UserAddress和CompanyAddress結合的父地址表。

1

我推薦遵循tpdi的建議,但在用戶/公司和地址之間使用一對多關係;至少您的所有關鍵數據類型都是相同的。

添加我的答案的主要原因是響應您的第二個建議,即存儲ObjectID和ObjectType - 屬性拆分是一個壞主意,請避免!

請仔細閱讀以下Celel文章: http://www.tdan.com/view-featured-columns/9852