如何在数据库中建模面向对象的设计?

How to model an object oriented design in a database?

假设我们有如下三个概念:

概念(属性 1、属性 2、..)

A (a, b, c, d)

B (a, b, c, d, e )

C (a, b, c, d, f )

在数据库中对这三个概念建模有三个选项:

1) 按原样建模

Table { column1, column2, ... }

A { id, a, b, c, d }

B { id, a, b, c, d, e }

C { id, a, b, c, d, f }

缺点:存在数据冗余。

2) 模型合二为一 table

A { id, object_type, a, b, c, d, e, f }

缺点:某些概念的某些字段为空。

3) 使用tables

之间的关系

A { parent_id, a, b, c, d }

B { id, parent_id, e }

C { id, parent_id, f }

缺点: 增加查询复杂度以加入 tables.

您会使用哪种方法?你有其他解决方案吗?您认为第三种方法性能较差吗?

推动开发者说,那个选项2 "is the most efficient implementations from a SQL and query performance perspective, but is limited to a small number of inherited fields" http://propelorm.org/Propel/documentation/09-inheritance.html

显然,您的选项 1 是最糟糕的选择。这里的主要问题是您需要复制 ABC 的所有行,从而造成严重的维护问题。

你的选项2叫做Single Table Inheritance模式,在子表没有的情况下推荐使用(m) 任何其他列。

您的选项 3 称为 Joined Tables Inheritance 模式,其中子表(代表子class es) 通过他们的主键连接到他们的超级表,也是引用超级表的外键。

因此,对于您的抽象示例,选项 2 似乎是推荐的方法,因为您的表 BC 只有一个附加列。

请注意,根据 Joined Tables Inheritance 方法,无需添加主键属性(与 id 一样)在 BC 中)。您只需使用与超表相同的主键,并使其也成为引用超表的外键。因此,在这种方法中,架构将是

A { id PK, 
    a, b, c, d 
}
B { id PK REFERENCES A, 
    e 
}
C { id PK REFERENCES A, 
    f 
}

您可以在我关于使用 class 层次结构开发前端 Web 应用程序的教程的 Subtyping and Inheritance with Database Tables 部分阅读更多相关信息。