【问题标题】:ER to Relational model: what happens when a subclass has its own PK?ER 到关系模型:当子类有自己的 PK 时会发生什么?
【发布时间】:2017-05-08 16:17:12
【问题描述】:

Conceptual Model |我无法找到任何具有自己 PK 的子类示例。我知道主键person_id是从超类继承的,但是不知道是否结合子类的PK,employee_id,在子类的关系模型中创建一个复合的PK。

基本上,哪个是正确的?

员工(employee_idperson_id、姓名、薪水)

员工(employee_id、person_id、姓名、薪水)

假设层次结构不是强制性的。

这只是一个帮助我理解过程的简单示例,所以不要担心概念模型的好处。

【问题讨论】:

  • 前提是有缺陷的。概括必须在所有情况下都成立,但 Person 并不总是 Employee。让角色(员工)专门化一个人也不是一个好主意。它们应该是两个单独的表。

标签: relational-database entity-relationship composite-primary-key conceptual-model


【解决方案1】:

首先,正如 Jim L 所指出的,EmployeePerson 的子类型,而不是相反!

从概念上讲,如果对象类型 B 是 A 的子类型/子类,它会继承其属性、方法和约束,包括其唯一标识符/键,但不一定是其标准 ID(“PK”),因为 PK 是强制密钥的任意选择,因此它不是纯粹的概念/逻辑特征,而是用户声明/约定。

作为约束的键是继承的,但不是 PK!

因此,即使子类型Employee继承了强制键person_id,你也不必选择它作为它的PK。由于Employee 恰好有另一个强制密钥employee_id,您可以选择这个作为PK(并且,正如reaanb 所指出的,在此示例中不需要任何复合PK)。

【讨论】:

    【解决方案2】:

    复合 PK 是个坏主意 - 它会允许记录具有相同employee_id 和不同person_id(或相同person_id 和不同employee_id)的多行。而是将employee_id 设置为PK,将person_id 设置为单独的唯一键。

    从概念上讲,当子类型有自己的身份时,它可以被视为与父实体集有关系的不同实体集,而不是子类型。我不会在 EER 图中使用子类型符号来表示这些情况。

    最后,在讨论数据建模时,请避免使用 OOP 术语(子类化、继承)。 OOP 用于根据通信状态机来分解系统,不应与分层、网络、实体关系或关系数据模型混为一谈。

    【讨论】:

    • 没有必要避免使用 OO 建模术语,因为 OO/UML 类图只是提供了一种比 EER 图更方便(且更具表现力)的数据/信息建模语言。
    • @GerdWagner 类图用于系统建模,而不是用于数据建模。 ER 和关系模型支持 n 元关系并提供管理依赖关系和数据完整性的技术。 OOP 对状态进行封装和抽象,充其量支持二进制定向关联,并且绝对没有内置的数据完整性。
    • @raanb:您只是在重复数据建模人员的过时信条。类图提供了丰富的可视化建模语言,可用于信息、数据和类建模。只需查看web-engineering.info/JavaJpaJsfApp-Book 或 ER 会议的论文 (er2016.cs.titech.ac.jp) 即可了解最新信息。
    • @GerdWagner 您链接的这本书描述了我拒绝的所有内容,以便更深入地了解 OOP 和数据建模。谢谢,但不用了。
    • @raanb:你的“深入理解”似乎是一厢情愿。
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多