Sql 与多个表相关的一对多关系

Sql 与多个表相关的一对多关系,sql,linq-to-sql,Sql,Linq To Sql,我有一个场景: 有两个或多个表表示独立项。比如说用户和公司 这两个表都需要存储地址。每一个都可以有一个或多个地址 在一个普通的1对多方案中,地址表只有一个用户ID或一个公司ID来创建一个普通的1对多关系 在这种情况下,我可以想出一些方法 Addresses表可以同时具有UserId和CompanyId,并且每个记录只能使用一个 ObjectId和ObjectType可以使用2个键,因此对象id将有一个UserId或CompanyId,ObjectType将是User或Company 创建Obje

我有一个场景: 有两个或多个表表示独立项。比如说用户和公司

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

在一个普通的1对多方案中,地址表只有一个用户ID或一个公司ID来创建一个普通的1对多关系

在这种情况下,我可以想出一些方法

Addresses表可以同时具有UserId和CompanyId,并且每个记录只能使用一个

ObjectId和ObjectType可以使用2个键,因此对象id将有一个UserId或CompanyId,ObjectType将是User或Company

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

我真的不喜欢这些解决方案中的任何一个。我想知道这里最好的方法是什么

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

多对多:

地址表,具有唯一的合成id,例如自动递增

用户地址表,具有唯一的合成id,例如自动递增、用户id外键和地址外键

公司地址表,具有唯一的合成id,例如自动递增、公司id外键和地址外键

请注意,如果用户或公司只能有一个地址,则在用户表或公司表中只有一个地址id外键。这不是您的用例。

多对多:

地址表,具有唯一的合成id,例如自动递增

用户地址表,具有唯一的合成id,例如自动递增、用户id外键和地址外键

公司地址表,具有唯一的合成id,例如自动递增、公司id外键和地址外键


请注意,如果用户或公司只能有一个地址,则在用户表或公司表中只有一个地址id外键。这不是您的用例。

我不确定Linq对SQL的影响,但解决此问题的一个模型是使用多个


在您的例子中,有一个名为AddressUsers的表,它有两列:AddressId和UserID,还有一个名为AddressCompanys的表,它有AddressId和CompanyId列。

我不确定Linq对SQL的影响,但解决此问题的一个模型是使用多个


在您的例子中,有一个名为AddressUsers的表,它有两列:AddressId和UserID,还有一个名为AddressCompanys的表,它有AddressId和CompanyId列。

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

在标准实践中,多态关联通常可以通过逆转来克服。您应该为用户和公司分别提供一个交叉点连接表,以便将它们连接到地址。这类似于多对多关系,其中交集表中的每一行都引用一个用户和一个地址

如果使用交集表,为避免多对多,但保持一对多,请在交集表中的地址键上设置唯一约束


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

您拥有的是多态关联。我不熟悉linqtosql,但是如果它支持这种类型的关系的引用完整性,那么就不用担心,做任何映射

在标准实践中,多态关联通常可以通过逆转来克服。您应该为用户和公司分别提供一个交叉点连接表,以便将它们连接到地址。这类似于多对多关系,其中交集表中的每一行都引用一个用户和一个地址

如果使用交集表,为避免多对多,但保持一对多,请在交集表中的地址键上设置唯一约束


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

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

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

请阅读此Celko帖子:

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

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

读一读t 他的塞尔科职务: