Nov*_*vic 4 mysql database inheritance design-patterns
所以我正在阅读一本关于数据库设计原则的书,并阅读了关于继承的章节,但我对如何在 MySQL 中“连接”子类与它们的超类感到困惑?
那么我如何将这两个子类与它们的超类相关联,以便我可以轻松地执行类似于“嘿,为他分配给的人员获取正确的合同类型”的查询。
一个人可以有一个,甚至两个都有,例如,如果一个人是一名学生,同时兼任讲师和资助其学业,或者是某种额外课程的讲师(所以他既是学生又是讲师)。
有多种方法可以解决这个问题;像 Hibernate 这样的 OR-Mappers 实现了它们。但是您也可以手动执行此操作:
最简单的一种叫做“单表继承”。这包括使用鉴别器列,它允许您存储类型名称或其他类型标识符,以便能够分离类型。这是最简单的工作方式,但请注意,存在以下权衡:
第二个称为“加入继承”,它反映了您的 UML 模型。您将有一个表“Contract”,一个表“student_contract”和一个表“lecturer_contract”,每个表只保留与类型相关的数据,而不是与超类型相关的数据。您将使用 SQL JOIN 来选择一种特定类型的数据。这种方法使您能够拥有小表(快速)但随着更多继承(更多 JOIN)而增加复杂性。核心权衡是:
最后一种方法是“每个实体的表”,这意味着您将为每种叶类型创建一个表 - 在您的情况下是“Student_Contract”和“Lecturer_Contract”。这是一个不错的方法,但要注意,也有一个折衷;-) 您必须沿着所有表安全地生成键值(例如,通过使用 SEQUENCE)。并非每个数据库都支持此构造(例如,mysql 不支持 SEQUENCES 作为可沿多个表重用的构造)。
出于学术目的,为了简单起见,我建议您尝试 1)
对于实际项目,请明智地选择 - 我所做的大多数项目都是基于 2)
编辑:
你的例子最终会 - 取决于 Person 和 Contract 之间的关系 - 像这样:
PERSON (1) ----- (N) PERSON_CONTRACT (N) ---- (1) CONTRACT
Run Code Online (Sandbox Code Playgroud)
(M对N的关系,如果这个人可以多次分配到一个合同)
或者
PERSON (1) --------- (N) CONTRACT
Run Code Online (Sandbox Code Playgroud)
(1:N 人与人之间的关系一个合同。一个合同只能有一个人,一个人可以有多个合同)