我有一个场景: 有两个(或更多)表代表独立项。让我们说用户和公司
这两个表都需要存储地址。每个人都可以有一个或多个地址
在正常的1到多场景中,地址表woudl只有UserId或CompanyId创建正常的1对多关系。
在这种情况下,我有一些我能想到的方法
地址表可以包含UserId和CompanyId,每条记录只能使用一个。
可以使用2个键ObjectId和ObjectType因此,对象ID将具有UserId或CompanyId,而ObjectType将是User或Company
创建一个ObjectTable并将ObjectId添加到Users和Companies。然后,地址将具有OjbectId
我真的不喜欢这些解决方案。我想知道这里最好的方法是什么。
另一方面,我很可能会为我的数据访问层使用linqtosql。
答案 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