所以我正在阅读一本关于数据库设计原理的书,并且谈到了有关继承的一章,但是我对如何在MySQL中“连接”子类和它们的超类感到困惑?如何在MySQL中使用继承?
那么,如何将涉及这两个子类与他们的超类,这样我可以轻松地做类似的查询到:“嘿,给我一个正确的他被分配到的人的合同类型“。
如果一个人是一名兼职兼职的学生,并且为其学生提供资金,或者某位讲师在某种程度上额外的课程(所以他是一个学生和讲师)。
所以我正在阅读一本关于数据库设计原理的书,并且谈到了有关继承的一章,但是我对如何在MySQL中“连接”子类和它们的超类感到困惑?如何在MySQL中使用继承?
那么,如何将涉及这两个子类与他们的超类,这样我可以轻松地做类似的查询到:“嘿,给我一个正确的他被分配到的人的合同类型“。
如果一个人是一名兼职兼职的学生,并且为其学生提供资金,或者某位讲师在某种程度上额外的课程(所以他是一个学生和讲师)。
有多种方法可以解决这个问题;象Hibernate这样的OR映射器实现了它们。但您也可以手动执行此操作:
最简单的称为“单表继承”。这包括使用鉴别器列,它允许您存储类型名称或其他类型标识符,以便能够分离类型。这是工作,但要注意的最简单的方法,有这些折衷:
第二个名为“Join Inheritance”,它反映了您的UML模型。您将有一个表“合同”,一个表“student_contract”和一个表“lecturer_contract”,每个表只保留与该类型相关的数据,而不是超类型。您将使用SQL JOIN来选择一种特定类型的数据。 这种方法使您能够拥有小表(快速),但随着更多继承(更多JOIN)的增加,复杂性也在不断增加。核心tradedoff是:(!这反正是不好的风格)
最后一种方法是“每实体表”和这意味着您将为每种叶片类型创建一个表格 - 在您的情况下为“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人的合同关系。合同只能有一个人,一个人可以有多个合同)
这是一个简单的解决方案太多的信息。 –
我不同意,这个平台并不打算解决其他ppls作业。仅仅是作者被要求提供一种如何找到解决方案的方法。事实上,有三种方法可以解决数据库中的继承问题。你的解决方案很简单,但只匹配1/3的可能解决方案(实际上,它是数字1)在我的文本)。 – gorefest
合同成板需要3个新领域:person_id
,contract_type
和contract_type_id
person_id INT foreign_key
contract_type ENUM('student', 'lecturer')
contract_type_id INT foreign_key
首个解决方案:有不同的优势ID的名称
你让这个问题太复杂了。解决方案是使用不同的id名称命名每个db 表。例如:
二解决方案:使用SQL Joins
对数据库进行组合来自多个表的数据的指令。
只是我的2美分:你可以有分离的ID前缀,但这不是强制性的。您可以模拟Person(#ID,姓名,电话)(1) - (*)合同(#ID,...)。该关系只包含外键Student_Contract(#(PERSON_ID,CONTRACT_ID))。选择通常包括表格上的JOIN。最后,你的方法是ER方法而不是OO方法。由于输入是对象模型,因此对象模型和数据库中的表格表示之间会存在差异。 – gorefest
合同可能有与学生和讲师合同有关的person_id,contract_type_id。 –
这不会限制一个人只能同时拥有Student_Contract或Lecturer_Contract而不是两个? –
不,不会,因为一个人可以有多个合同。它只会限制合同本身,因为合同必须是学生或讲师类型。 – Shadow