代码之家  ›  专栏  ›  技术社区  ›  vulkanino

ER继承建模

  •  2
  • vulkanino  · 技术社区  · 14 年前

    供应场可以有运输凭证。如果存在,它可以是两种类型之一:内部或外部。两个文档共享一些公共数据,但有不同的专门字段。

    我想用这样一种OO风格来建模: alt text http://www.arsmaior.com/tmp/mod1.png

    在文档表中,两个文档标识中的一个为空,另一个为具有相应表的外键。

    这与公共数据冗余的其他模式相反: alt text http://www.arsmaior.com/tmp/mod2.png

    我试图发现这两种方法的优缺点。

    在这两种情况下,我如何选择了解所有内部文档?我们有一种互斥的外键,连接并不那么琐碎。

    第一种方法是否完全不可靠?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Walter Mitty    14 年前

    经典的ER建模不包括外键,您问题的要点在于外键将如何工作。我认为您真正要做的是关系建模,即使您使用的是ER图。

    在关系建模方面,有第三种方法来建模继承。也就是说,对专门化表使用与通用表相同的ID。然后,doc_internal表的id字段既是doc_internal表的主键,也是引用supply_farm表的外键。对于Doc_外部表,同上。

    supply_farm表中的id字段既是supply_farm表的主键,也是引用doc_internal或doc_external表的外键,具体取决于。联接可以神奇地将正确的数据组合在一起。

    设置这个需要一些编程,但它是值得的。

    更多细节,我建议你谷歌“泛化专业化关系建模”。网上有一些关于这个主题的优秀文章。

        2
  •  1
  •   Gopi    14 年前

    这两种方法都是正确的,它们的使用将完全取决于用例、要存储的数据的类型和数量,以及您最希望触发的查询的类型。当继承层次结构复杂时,您还可以考虑将这两种策略结合起来。

    我认为,第一种方法比较可取的一个用例是,当您希望搜索所有文档时,例如,基于描述或任何公共字段。

    This 文档(尽管特定于Hibernate)可以提供关于不同继承建模策略的更多信息。

        3
  •  0
  •   user359040    14 年前

    如果我正确理解了这一点,那么Supply Farm对应于0或1个文档,该文档始终是内部或外部文档(绝不是两者)。

    如果是这样,那么为什么不使用一个单独的表,就像这样:

    **SUPPLY_FARM_DOC**
    ID Int (PK)
    DOC_ID Int
    INTERNAL_FLAG Boolean
    DESCRIPTION Varchar(40)
    SOME_DATA Varchar(40)
    OTHER_DATA Varchar(40)
    etc.