模拟数据库中的一对多关系

时间:2012-06-13 19:57:51

标签: sql database design-patterns orm relational

我正在尝试找到一个合适的模式来模拟从多个表到公共表的一对多关系。

EntityA,EntityB和其他实体有一个或多个GenericInfo。

  • EntityA(0..1)------(1..N)GenericInfo
  • EntityB(0..1)------(1..N)GenericInfo
  • EntityC(0..1)------(1..N)GenericInfo

    选项1:这些实体不同,所以我不能使用超级表来建模关系

  • SuperEntity(S_Id pk)
  • EntityA(S_Id pk fk)
  • EntityB(S_Id pk fk)
  • GenericInfo(G_Id pk,S_id fk)


    选项2:我不希望通过从GenericInfo表中删除外键约束来丢失参照完整性。

  • EntityA(S_Id pk fk)
  • EntityB(S_Id pk fk)
  • GenericInfo(G_Id pk,unique_id non-fk)


    选项3:我目前正在使用关联表进行关系映射。

  • EntityA(A_Id pk)
  • EntityB(B_Id pk)
  • EntityAInfo(A_Id pk fk,G_Id pk fk)
  • EntityBInfo(B_Id pk fk,G_Id pk fk)
  • GenericInfo(G_Id pk)

    我不喜欢这个解决方案,因为必须在数据库中创建太多的表,其目的是保留链接/关系。

    选项4:我能想到的另一种方法是使用像这样的单个Id属性创建一个映射表,

  • EntityA(A_Id pk,I_id fk nullable)
  • EntityB(B_Id pk,I_id fk nullable)
  • InfoMapping(I_Id pk)
  • GenericInfo(G_Id pk,I_Id fk)

    我很喜欢你的专家意见和建议。

    谢谢,

    更新

    Vasek,谢谢你的评论。

    我试图解决的问题是:如何为暴露一组对象的接口实现建立对象关系映射?

    我们每个类策略使用一个表来进行OR映射。因此,示例中的每个表都是从一个类映射的。假设我们有以下类型定义和表格(遗憾的是我不能在这里发布贬义)


    公共接口IGenericInfoProvider
    {
    GenericInfo [] GenericInfoArray {get; set;}
    }


    public class BaseClassForA {} -------------------------------------- -------表BaseEntityForA
    公共类BaseClassForB {} ----------------------------------------- ----表BaseEntityForB
    公共类ClassA:BaseClassForA,IGenericInfoProvider {} ---表EntityA
    公共类ClassB:BaseClassForB,IGenericInfoProvider {} ---表EntityB
    公共类GenericInfo {} ----------------------------------------- -----------表GenericInfo

    我试图模拟EntityA / EntityB和GenericInfo之间的一对多关系。这种关系在我们的域模型中非常常见。
    Option1不被认为是因为这会导致创建一个超级表来包含来自许多表的所有ID,并且它在OO世界中没有任何意义。 由于参照完整性,Option2是不可接受的。
    Option3是我目前使用的模式。
    我正在考虑Option4,但不确定这是否是朝着正确方向发展的方法。

  • 2 个答案:

    答案 0 :(得分:1)

    我不确定你想要实现什么,但我想尝试使用一些数据库设计工具来创建包含表格,主要/外来/备用键,复合键,关系等的结构可能是有用的。图片值得千言万语:)你可以快速创建各种设计,生成SQL代码并思考如何存储样本数据。

    对我来说,第一个场景(选项3)似乎代表了M:N关系。第二种情况(选项4)代表不同的情景 - 不同的参照完整性,因此这两种情况不具有可比性。

    尝试创建样本数据库,插入样本记录并编写查询。

    答案 1 :(得分:0)

    您当前的解决方案是正确的解决方案。它是保持数据完整性的最佳方式,这是数据库中最关键的功能。制作更多表格甚至不应该是设计考虑因素。