【问题标题】:ISA Relationship in DBMSDBMS 中的 ISA 关系
【发布时间】:2025-12-26 18:00:10
【问题描述】:

我正在阅读 Ramakrishnan 编写的数据库管理系统简介,我遇到了以下 ER 图:

上面写着,

"For example, we might identify a subset of employees as Senior Emps. We can 
modify Figure 2.12 to reflect this change by adding a second ISA node as a 
child of Employees and making Senior Emps a child of this node."

我的问题是,为什么我们需要另一个 ISA 节点?为什么我们不直接将这个新实体添加到当前的 ISA 节点?这有关系吗?

谢谢

【问题讨论】:

  • 可能是因为来自任何给定 ISA 的选择必须是互斥的。雇员要么是小时工,要么是合同工。折腾高级,它不是第三个分支,它是一种完全不同类型的 ISA 关系。
  • @NealB 所以你的意思是,由于小时工和合同工在某种程度上是相关的,我们使用相同的 ISA 节点,但是为 SeniorEmployees 使用相同的 ISA 节点是错误的,还是使用另一个更好ISA 节点只是为了可读性等?

标签: database database-design relational-database


【解决方案1】:

“我们不能使用现有的 ISA 节点来创建这种关系吗?”

(免责声明:读完这一切有点半开玩笑。ER 从来没有真正打算在逻辑上完整和精确地表达能力,而且有这么多不同的 ER 方言,很难绝对确定某些特定方言试图表达的内容,以及它不试图表达的内容)

您将失去的是各种 IS_A“子实体”之间的排他性特征。您给定的示例设计可能旨在明确记录员工永远不能同时是 hourly_emp 和 contract_emp 的概念。

如果一个员工既可以是“高级”又可以是“合同”,它们之间没有排他性,如果 ER 方言的 IS_A 三角形正是要表达这种排他性,那么你的解决方案就是错误的。

但是(重复一遍)请注意,这一切都不是一成不变的。这一切都取决于您在特定 ER 方言中使用的符号的预期语义。

【讨论】:

    【解决方案2】:

    在我看来,当前的 ISA 节点(即上图)决定了员工的薪酬方式,因此简单地在当前节点上添加另一个节点并没有多大意义,因为 SeniorEmployees 可以是每小时或合同。

    这有意义吗?

    【讨论】:

      【解决方案3】:

      创建任何具有 ISA 关系的实体的原因是为新实体提供额外的属性。

      就像在面向对象的建模中一样,您将创建一个新的子类,以便新类可以拥有相对于其超类的附加数据或附加方法。

      因此,该示例的含义是 SeniorEmployees 应该有一些新列,例如存储服务年限或其他内容的奖励。

      如果没有 SeniorEmployees 独有的新属性,我将它们与普通员工一样对待,无需创建新的子表。

      【讨论】:

      • 谢谢,但实际上这不是我要问的。假设 SeniorEmployees 具有新属性,我们将创建一个 ISA 关系。我想知道的是,为什么我们需要另一个 ISA 节点?我们不能使用现有的 ISA 节点来创建这种关系吗?
      【解决方案4】:

      那个模型有问题。如果某人同时是一家公司的高级员工(兼职)​​和子公司的合同员工(兼职)​​,该怎么办?哦,它碎了。

      问题是一个人不是雇员。一个人是与其他方有零个或多个关系的人。

      看看派对模型(Silverston / Hay / Fowler)。

      【讨论】:

        【解决方案5】:

        ISA 的两大优势:

        1. 特定于子类的描述性属性。
        2. 参与关系的身份实体。

        【讨论】: