![]() |
1
3
这种问题在数据建模中反复出现。在ER建模中称为“泛化/专门化”,在对象建模中称为“超类/子类”。 对象建模师使用对象模型中内置的继承特性来非常轻松地解决问题。子类只是扩展了超类。 关系建模师面临一个问题。如何设计表以模拟继承带来的好处?这就是你提出的问题。 最简单的技术称为单表继承。关于所有子类的数据都被分组到超类的一个表中。有一列object\u type,它将单个类型的所有对象分组在一起。任何对象都不能属于多个类型。如果一列与其中一个子类无关,则与该子类相关的行中该列将保留为NULL。 这种简单的解决方案适用于更小更简单的情况。大量空值的存在会增加一点点存储开销,也会增加一点点检索开销。如果对可空列进行布尔测试,开发人员可能必须学习SQL三值逻辑。起初,这可能令人困惑,但人们会习惯它。 还有另一种技术,称为类表继承。在这个设计中,除了所有专用子类的组合表之外,每个专用子类都有单独的表。当需要有关特定类型对象的所有数据时,可以将常规表与相应的专用表连接起来。此设计中的空值较少,但要进行更多的连接。这种技术在更大、更复杂的情况下效果更好。 还有第三种技术称为共享主键。这种技术通常与类表继承结合使用。子类的专用表具有通用表中相应条目的主键副本作为其主键。此id列可以声明为主键和外键。 当要添加新对象时,这需要一些额外的编程,但它使连接变得简单、容易和快速。 超类和子类在现实世界中经常发生。使您的设计简单、合理。测试初始设计的性能。如果需要,可以调整它。 |
![]() |
Community wiki · SQL语法新手 1 年前 |
|
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
![]() |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
![]() |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |