如何在数据库中建模面向对象的设计?
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 是最糟糕的选择。这里的主要问题是您需要复制 A
中 B
和 C
的所有行,从而造成严重的维护问题。
你的选项2叫做Single Table Inheritance模式,在子表没有的情况下推荐使用(m) 任何其他列。
您的选项 3 称为 Joined Tables Inheritance 模式,其中子表(代表子class es) 通过他们的主键连接到他们的超级表,也是引用超级表的外键。
因此,对于您的抽象示例,选项 2 似乎是推荐的方法,因为您的表 B
和 C
只有一个附加列。
请注意,根据 Joined Tables Inheritance 方法,无需添加主键属性(与 id
一样)在 B
和 C
中)。您只需使用与超表相同的主键,并使其也成为引用超表的外键。因此,在这种方法中,架构将是
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 部分阅读更多相关信息。
假设我们有如下三个概念:
概念(属性 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 是最糟糕的选择。这里的主要问题是您需要复制 A
中 B
和 C
的所有行,从而造成严重的维护问题。
你的选项2叫做Single Table Inheritance模式,在子表没有的情况下推荐使用(m) 任何其他列。
您的选项 3 称为 Joined Tables Inheritance 模式,其中子表(代表子class es) 通过他们的主键连接到他们的超级表,也是引用超级表的外键。
因此,对于您的抽象示例,选项 2 似乎是推荐的方法,因为您的表 B
和 C
只有一个附加列。
请注意,根据 Joined Tables Inheritance 方法,无需添加主键属性(与 id
一样)在 B
和 C
中)。您只需使用与超表相同的主键,并使其也成为引用超表的外键。因此,在这种方法中,架构将是
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 部分阅读更多相关信息。