ER继承建模

时间:2010-08-10 09:00:31

标签: sql data-modeling entity-relationship

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

我虽然以这样的OO-ish方式对其进行建模: alt text http://www.arsmaior.com/tmp/mod1.png

在文档表中,两个doc _ * _ id之一为null,另一个是具有相应表的外键。

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

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

如何在两种情况下选择知道所有内部文档?我们有一种相互排斥的外键,JOIN并不是那么简单。

第一种方法完全是垃圾吗?

3 个答案:

答案 0 :(得分:1)

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

第一种方法首选的一个用例我认为是您想要搜索所有文档,例如,基于描述或任何常见字段。

This文档(虽然特定于hibernate)可以提供有关不同继承建模策略的更多信息。

答案 1 :(得分:1)

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

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

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

设置它需要一些编程,但它非常值得。

有关详细信息,我建议您使用google“泛化专业化关系建模”。网上有一些关于这个主题的优秀文章。

答案 2 :(得分:0)

如果我已正确理解,那么供应农场对应于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.