重叠 Object/Data 实体类型的最佳实践

Best Practices for Overlapping Object/Data Entity Types

偶尔,我 运行 会遇到以下所有条件都适用于两个高度相似但不完全相同的实体或对象的情况。这让我很难决定如何对它们进行建模,无论是在数据库端还是在对象建模方面。我将尝试详细说明问题和我的问题,因为我发现它是一个非常难以定义的建模问题。我正在尝试对这些实体进行数据和对象建模,因此我将稍微宽松地使用这两个学科的术语。

1) 两个实体共享许多相同的属性,但有一些其他实体所没有的独特属性。

2) 一个不是另一个的超类型或子类型。

3) 重叠不是由于对象继承。

4) 这些对象在同一域中用于不同的目的,但在任何工作流程中通常都非常接近。这经常导致那些具有中等领域知识的人混淆实体。另一方面,这种用途上的精细分离导致关联对象的方法之间的差异比它们的属性之间的差异更大。

5) 在某些情况下,可以在数据库端创建桥 table 来表达实体之间的 M2M 关系。然而,它们有很多共同的属性(或列,在数据库端),将它们存储在相同的 table.

中可能是有意义的

我 运行 涉及的一些案例包括: 1) "Product vs. Project confusion" - 特别是在软件营销中,产品和项目共享许多相同的属性。通常一个产品会有多个关联的项目,但一个项目被多个产品使用也是不常见但可以想象的。

2) Features和Components在软件开发中的细微差别。从客户的角度来看,功能是以开发人员为中心的一种提供利益的方式,而组件是在开发人员方面实现功能的一种方式。这是一个非常微妙的区别,但仍然很重要。如需进一步讨论,请参阅 Rod Maupin 在 http://www.installationdeveloper.com/347/features-and-components-101/

的 post

3) 许多不同问题领域中的模板与类型。例如,当通过 TypeID 列识别吉他类型时,它所指的 TypeTable 可能具有与颜色、弦长、琴体形状等对应的列。另一方面,模板是您构建吉他的东西from,因此它的方法与 Type 不同,可能链接到 "Apply Template" 或 "Make Item from Template" 菜单命令。然而,它会有许多与类型相同的列或属性,例如颜色、形状、字符串大小等。这种区别在许多问题域中的数千种不同对象类型和模板中引起了注意,而不仅仅是这个狭窄的例子。更复杂的是,在某些情况下,将多个模板与特定类型相关联可能会有所帮助,and/or 反之亦然。

我没有 运行 经常遇到重叠实体的问题,但是当它确实发生时,它就会成为一个真正的瓶颈,并导致大量浪费时间重构数据和对象模型。我已经阅读了关于这两个主题的书籍,并在 data/object 建模网页上搜索了很多有关该问题的内容,但尚未看到对其进行讨论。我在 Whosebug 上能找到的 "overlap" 和 "data model" 的唯一命中是为了区分一个 table 或实体中的相似列,而不是跨 table 或实体。我的问题是:

1)这个问题有正式名称吗?

2) 是否有简单的捷径或交易技巧来在建模过程开始时识别此类重叠实体,而不是在后期识别使重构成为问题时更深入地识别?

3) 应该如何处理这种重叠的实体?我假设就 OOP 而言,它们应该有单独的对象,因为它们的方法往往不同。但是,从另一个继承一个会很尴尬。一个更困难的问题是在数据库端使用单独的 table 是否有意义。当它们没有共同点的 properties/columns 保留为空时,将它们组合起来可能需要一系列复杂的视图以及浪费存储 space。如果公共属性可以存储在单个列中,则将它们存储在单独的 table 中也可能是一种浪费。

这是一个很难识别的问题,更不用说处理了。我在 data/object 建模方面只有中等的经验,所以真正知道自己在做什么的人的意见会有所帮助。谢谢:)

您的问题涉及数据库建模方面和 object-oriented(编程)建模方面。让我们从抽象的角度出发。

你说:

1) Both entities share many identical properties, but have a few unique ones not found in the other.

2) One is not a supertype or subtype of another.

和:

3) The overlap is not due to object inheritance.

但是注意 inheritance 不应与 subtyping 混淆,即使很多时候它们是捆绑在一起的!例如参见 [​​=12=]].

换句话说,即使A不是B的子类型,B也不是A的子类型,你也可以找到A和B都继承属性的C。

因此,您可以将此 C 视为 A 和 B 的“抽象超类型”;但无论如何,将它视为共同祖先是很方便的,至少从数据库的角度来看,这样可以将共同属性分解为“supertable”。

然后,从 object-oriented 编程方面,您可以将 A 或 B 视为 C 的子类型或简单地视为两种不同的东西,具体取决于 Object-Relational 映射工具的特性,从手头的问题等

当然,这种建模方式并不禁止A和B除了继承自C之外,还存在一种或多种关系,就像你做的例子Products-Projects。

所以,这是我对你最后四个问题的回答:

1) 对,就叫继承

2) 您可以检查两个实体是否具有大量共同属性。

3) 你可以在数据库中用一个共同的 table 对它们进行建模,这可能有一些共同的 属性 比如完整性约束,并且有两个 table 有一个外国它的关键。当然这条规则不是盲目适用的,而是可以有例外的,就像所有的人类规则一样。另一方面,从编程的角度来看,您可以决定是否使用超类型对它们进行建模。这取决于很多因素,应该根据具体情况来决定。