繁体   English   中英

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

[英]One-to-many relationship related to many tables

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

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

在正常的一对多情况下,Addresss表woudl仅具有一个UserId或CompanyId,可创建一个正常的一对多关系。

在这种情况下,我可以想到几种方法

  1. 地址表可以同时具有UserId和CompanyId,并且每条记录只能使用一个。

  2. 可以使用2个键来使用ObjectId和ObjectType,因此Object id可以具有UserId或CompanyId,而ObjectType可以是User或Company

  3. 创建一个ObjectTable并将ObjectId添加到用户和公司。 地址将具有一个OjbectId

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

另一方面,我很可能将用户linqtosql用于我的数据访问层。

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

在您的情况下,您将有一个名为AddressUsers的表,该表有两列:AddressId和UserID,还有一个名为AddressCompanies的表,其列为AddressId和CompanyId。

多对多:

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

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

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

(请注意,如果用户(或公司) 只能有一个地址,你就必须在user表中的ADDRESS_ID外键(或德公司表),这是不是你的使用情况。)

您拥有的是一个多态关联。 我对linqtosql不熟悉,但是如果它在这种类型的关系上支持引用完整性,那么不要担心,请执行任何映射。

在标准实践中,通常可以通过反转多态关联来克服它。 您应该为用户和公司提供一个交集(交汇处)表,以将它们加入到地址中。 这类似于多对多关系,交集表中的每一行都引用一个用户和一个地址。

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

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

我建议遵循tpdi的建议,但要在用户/公司与地址之间使用一对多关系; 至少您的所有关键数据类型都相同。

添加我的答案的主要原因是为了响应您关于存储ObjectID和ObjectType的第二建议-属性拆分是个坏主意,请避免!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM