如何在MySQL中使用继承?

时间:2016-03-10 14:01:10

标签: mysql database inheritance design-patterns

所以我正在阅读一本关于数据库设计原则的书,并出现在关于继承的章节中,但我对如何将子类与MySQL中的超类“连接”感到困惑?

例如,表结构看起来像enter image description here

那么我如何将这两个子类与他们的超类联系起来,以便我可以轻松地进行类似于“嘿,为我分配给他的人获得正确的合同类型”的查询。

一个人可以拥有每个人中的一个,甚至两个人,例如,如果一个人是一名学生做兼职工作作为讲师以及资助它的学者奖学金,或者是某个额外的讲师当然(所以他既是学生也是讲师)。

4 个答案:

答案 0 :(得分:3)

有各种方法可以解决这个问题;像Hibernate这样的OR-Mappers可以实现它们。但您也可以手动执行此操作:

  1. 最简单的称为“单表继承”。这包括使用一个鉴别器列,它允许您存储类型名称或另一个类型标识符,以便能够分离类型。这是最简单的工作方式,但要注意,有这些权衡:

    • 您不能在仅存在于其中一种叶类型
    • 中的列中使用NOT NULL约束
    • 包含许多列的广泛表格在新类型中变得更加广泛,这将降低整体效果
  2. 第二个称为“Join Inheritance”,它反映了您的UML模型。您将拥有一个表“Contract”,一个表“student_contract”和一个表“lecturer_contract”,每个表只保留与该类型相关的数据,而不是它的超类型。您将使用SQL JOIN来选择一种特定类型的数据。 这种方法使您可以拥有小表(快速)但复杂性越来越高(更多JOIN)。核心交易是:

    • 良好的数据分发
    • 非常复杂的继承结构上的可怕的sql(无论如何都是糟糕的风格!)
  3. 最后一种方法是“每个实体的表”,这意味着您将为每种叶类型创建一个表 - 在您的情况下为“Student_Contract”和“Lecturer_Contract”。这是一个很好的方法,但要注意,还有一个权衡;-)你必须在所有表格中安全地生成关键值(例如使用SEQUENCE)。每个数据库都不支持此构造(例如,mysql不支持SEQUENCES作为可沿多个表重用的构造)。

  4. 出于学术目的,我建议你为了简单起见尝试1)

    对于真实项目,明智地选择 - 我基于2制作的大多数项目

    编辑:

    你的例子最终将取决于人与合同之间的关系 - 就像这样:

    PERSON (1) ----- (N) PERSON_CONTRACT (N) ---- (1) CONTRACT 
    

    (M到N的关系,如果这个人可以多次分配给合同)

    PERSON (1) --------- (N) CONTRACT
    

    (1:N人与合同之间的关系。合同只能有一个人,一个人可以有多个合同)

答案 1 :(得分:2)

第一个解决方案:拥有不同的显性ID名称

你让这个问题变得太复杂了。解决方案是使用不同的id名称命名每个db 。例如:

  • person_id =>人
  • contract_type_id =>合同
  • student_contract_id => student_contract
  • lecturer_contract_id => lecturer_contract

第二个解决方案:使用SQL Joins

  

指向数据库以组合来自多个表的数据的指令。

答案 2 :(得分:0)

要实现父类型和子类型,必须首先将所有公共属性提取到父类型中。接下来,创建一个查找表,其中包含对超类中包含的每个子类型的引用。每个子类型都是一对一的关系,超类型与主键共享相同的ID。 没有一些严重的触发器废话,就不能在RDBMS中实现。 因此,明智的做法是在应用程序代码中,在业务层中的子级内部实现,该子级从表示任何表的抽象表类扩展而来。不要忘记为该用例的条目实现事务。

答案 3 :(得分:-1)

与董事会签订合同需要3个新字段:person_idcontract_typecontract_type_id

person_id INT foreign_key
contract_type ENUM('student', 'lecturer')
contract_type_id INT foreign_key