与许多表相关的一对多关系

时间:2010-05-20 20:13:10

标签: sql linq-to-sql

我有一个场景: 有两个(或更多)表代表独立项。让我们说用户和公司

这两个表都需要存储地址。每个人都可以有一个或多个地址

在正常的1到多场景中,地址表woudl只有UserId或CompanyId创建正常的1对多关系。

在这种情况下,我有一些我能想到的方法

  1. 地址表可以包含UserId和CompanyId,每条记录只能使用一个。

  2. 可以使用2个键ObjectId和ObjectType因此,对象ID将具有UserId或CompanyId,而ObjectType将是User或Company

  3. 创建一个ObjectTable并将ObjectId添加到Users和Companies。然后,地址将具有OjbectId

  4. 我真的不喜欢这些解决方案。我想知道这里最好的方法是什么。

    另一方面,我很可能会为我的数据访问层使用linqtosql。

4 个答案:

答案 0 :(得分:2)

我不确定Linq-to-SQL的含义,但解决此问题的一个模型是使用多个Junction Tables

在您的情况下,您将拥有一个名为AddressUsers的表,它有两列:AddressId和UserID以及一个名为AddressCompanies的表,其中包含AddressId和CompanyId列。

答案 1 :(得分:1)

多对多:

地址表,具有唯一的合成ID(例如,自动增量)。

user_address表,具有唯一的合成ID(例如,自动增量),user_id外键和地址外键。

company_address表,具有唯一的合成ID(例如,自动增量),company_id外键和地址外键。

(请注意,如果用户(或公司)只能 一个地址,那么您只需在用户表(或公司表)中使用address_id外键。这不是您的用例。 )

答案 2 :(得分:1)

你拥有的是多态关联。我不熟悉linqtosql,但是如果它支持这种关系的参照完整性,那么不要担心,做任何地图。

在标准实践中,通常可以通过反转来克服多态关联。您应该使用一个交叉点(联结)表,每个表用于用户和公司将它们加入到地址。这类似于多对多关系,其中交集表中的每一行指的是一个用户和一个地址。

如果使用交集表,要避免多对多(但保持一对多)对交集表中的地址键设置唯一约束。

如果您遇到ORM问题,请使用与UserAddress和CompanyAddress连接的父地址表。

答案 3 :(得分:1)

我建议遵循tpdi的建议,但使用用户/公司和地址之间的一对多关系;至少那时你所有的关键数据都是一样的。

添加我的答案的主要原因是回应你存储ObjectID和ObjectType的第二个建议 - 属性拆分是一个坏主意,避免!

阅读这篇Celko帖子: http://www.tdan.com/view-featured-columns/9852