14

今天,我研究了大约2种数据库设计继承方法:

  1. 单表继承
  2. 类表继承

在我的学生看来,单表继承使数据库比其他方法更小,因为它只使用 1 个表。但我读到更有利的方法是根据 Bill Karwin的类表继承。

单表继承的优缺点是什么,应该在什么情况下使用?

4

2 回答 2

20

在我的学生看来,单表继承使数据库比其他方法更小,因为她只使用 1 个表。

不必要。如果您的层次结构的实体没有太多共同的属性,这将导致许多空列并浪费大量空间。

但我读到更喜欢的方法是 Bill Karwin 的类表继承。

恕我直言,没有单一的答案,不同的策略(每个层次一个表,每个具体类一个表,每个类一个表)具有所有优点和缺点,并且选择一个或另一个取决于上下文。

单表继承的优缺点,在什么情况下使用?

当您需要“多态”查询(不需要连接或联合)时,此策略很好,只要您可以最小化可空列的数量(并让 DBA 相信非规范化模式从长远来看不会成为问题) .

实际上,我建议查看Scott Ambler(关于 ORM 的参考论文的作者)的Mapping Objects to Relational Databases: O/R Mapping In Detail ,尤其是第2.6 节比较策略——解释他没有意义。

他对单表策略的总结:

优点:

  • 简单的方法。
  • 易于添加新类,您只需为其他数据添加新列。
  • 通过简单地更改行的类型来支持多态性。
  • 数据访问速度很快,因为数据在一个表中。
  • 临时报告非常简单,因为所有数据都在一张表中。

缺点:

  • 类层次结构内的耦合增加了,因为所有类都直接耦合到同一个表。一个类的变化会影响表,然后会影响层次结构中的其他类。
  • 数据库中可能浪费的空间。
  • 当类型之间存在显着重叠时,指示类型变得复杂。
  • 对于大型层次结构,表可以快速增长。

何时使用:

  • 对于简单和/或浅类层次结构来说,这是一个很好的策略,其中层次结构中的类型之间几乎没有重叠。

但我强烈建议阅读整篇论文。

于 2010-05-31T23:47:13.707 回答
1

当子类没有很多属性或与其他类的关联时,单表继承是一种很好的方法。否则,该表将充满仅对表的某些元组有意义的属性,并且您需要添加各种约束以检查它们是否仅包含适当“类型”的元组的值。

此外,只需要处理其中一个子类的实例的所有查询都需要附加子句来根据类型值选择它们。

于 2012-02-09T08:40:25.043 回答