假设我们有如下三个概念:
概念(attribute1, attribute2, ..)
A (a, b, c, d)
B (a, b, c, d, e)
C (a, b, c, d, f)
在数据库中对这三个概念建模有三个选项:
1) 按原样建模
表 { column1, column2, ... }
A { id, a, b, c, d }
B { id, a, b, c, d, e }
C { id, a, b, c, d, f }
缺点:存在数据冗余。
2) 在一张表中建模
A { id, object_type, a, b, c, d, e, f }
缺点:某些概念的某些字段仍为空。
3)使用表之间的关系
A { parent_id, a, b, c, d }
B { id, parent_id, e }
C { id, parent_id, f }
缺点:增加连接表的查询复杂性。
您会使用哪种方法?你有其他解决方案吗?您认为第三种方法性能较差吗?
最佳答案
显然,您的选项 1 是最糟糕的选择。这里的主要问题是您需要复制 B
的所有行。和 C
在A
,从而造成严重的维护问题。
您的选项 2 称为单表继承 模式,建议在子表没有 (m) 任何额外列的情况下使用。
您的选项 3 称为Joined Tables Inheritance 模式,其中子表(代表子类)通过它们的主键连接到它们的超表,同时也是引用超表的外键.
因此,对于您的抽象示例,似乎选项 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
}
您可以在 Subtyping and Inheritance with Database Tables 部分阅读更多相关信息关于使用类层次结构开发前端 Web 应用程序的教程。
关于mysql - 如何在数据库中建模面向对象的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28211235/