2016-03-10 33 views
1

所以我正在阅读一本关于数据库设计原理的书,并且谈到了有关继承的一章,但是我对如何在MySQL中“连接”子类和它们的超类感到困惑?如何在MySQL中使用继承?

表结构将,例如,像这样enter image description here

那么,如何将涉及这两个子类与他们的超类,这样我可以轻松地做类似的查询到:“嘿,给我一个正确的他被分配到的人的合同类型“。

如果一个人是一名兼职兼职的学生,并且为其学生提供资金,或者某位讲师在某种程度上额外的课程(所以他是一个学生和讲师)。

+0

合同可能有与学生和讲师合同有关的person_id,contract_type_id。 –

+0

这不会限制一个人只能同时拥有Student_Contract或Lecturer_Contract而不是两个? –

+0

不,不会,因为一个人可以有多个合同。它只会限制合同本身,因为合同必须是学生或讲师类型。 – Shadow

回答

2

有多种方法可以解决这个问题;象Hibernate这样的OR映射器实现了它们。但您也可以手动执行此操作:

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

    • 不能使用只存在于叶子类型中的一种
    • 具有很多列宽的表中的列NOT NULL约束变得更新类型更广泛,这会降低整体性能
  2. 第二个名为“Join Inheritance”,它反映了您的UML模型。您将有一个表“合同”,一个表“student_contract”和一个表“lecturer_contract”,每个表只保留与该类型相关的数据,而不是超类型。您将使用SQL JOIN来选择一种特定类型的数据。 这种方法使您能够拥有小表(快速),但随着更多继承(更多JOIN)的增加,复杂性也在不断增加。核心tradedoff是:(!这反正是不好的风格)

    • 数据分配好
    • 可怕的SQL上非常复杂的继承结构
  3. 最后一种方法是“每实体表”和这意味着您将为每种叶片类型创建一个表格 - 在您的情况下为“Student_Contract”和“Lecturer_Contract”。这是一个很好的方法,但要小心,还有一个折衷办法;-)必须在所有表中安全地生成关键值(例如,通过使用SEQUENCE)。每个数据库都不支持此构造(例如,mysql不支持将SEQUENCES作为可沿多个表重复使用的构造)。

对于学术的目的,我建议你去尝试1)简单

起见,对于真正的项目,明智的选择 - 我做了基于2大多数项目)

编辑:

例如,您将结束向上取决于人与合同之间的关系 - 在这样的事情:

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

(M到N的关系,如果该人可以乘法分配给合同)

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

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

+0

这是一个简单的解决方案太多的信息。 –

+0

我不同意,这个平台并不打算解决其他ppls作业。仅仅是作者被要求提供一种如何找到解决方案的方法。事实上,有三种方法可以解决数据库中的继承问题。你的解决方案很简单,但只匹配1/3的可能解决方案(实际上,它是数字1)在我的文本)。 – gorefest

-1

合同成板需要3个新领域:person_idcontract_typecontract_type_id

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

首个解决方案:有不同的优势ID的名称

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

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

二解决方案:使用SQL Joins

对数据库进行组合来自多个表的数据的指令。

+0

只是我的2美分:你可以有分离的ID前缀,但这不是强制性的。您可以模拟Person(#ID,姓名,电话)(1) - (*)合同(#ID,...)。该关系只包含外键Student_Contract(#(PERSON_ID,CONTRACT_ID))。选择通常包括表格上的JOIN。最后,你的方法是ER方法而不是OO方法。由于输入是对象模型,因此对象模型和数据库中的表格表示之间会存在差异。 – gorefest