Sql 与多个表相关的一对多关系
我有一个场景: 有两个或多个表表示独立项。比如说用户和公司 这两个表都需要存储地址。每一个都可以有一个或多个地址 在一个普通的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外键和地址外键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
请注意,如果用户或公司只能有一个地址,则在用户表或公司表中只有一个地址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 他的塞尔科职务: