【问题标题】:Weak Entity in ERDERD 中的弱实体
【发布时间】:2018-03-24 08:17:58
【问题描述】:

我有以下问题,我有多个可能对或错的场景,我已经搜索了一段时间,但没有找到针对我的问题的具体答案:

医生诊所示例:

我们有医生、病人、治疗、治疗类型

医生:身份证、姓名……

患者:身份证、姓名...

治疗:日期、费用

治疗-类型:id、姓名

医生可以做多种治疗,患者也可以做多种治疗,所以它们与Treatment with(1-N)关系相连。

治疗实体是一个弱实体,因为它不能在没有医生或患者的情况下定义,所以我的问题是,当我们将此 ERD 转换为实际表时,这是 正确(或最佳实践)方案?

1 - doctor-id, patient-id 不能唯一定义 Treatment 表,所以我们在 Treatment 表中添加 treatment-id字段,PK 是 (doctor-id, patient-id, treatment-id)。

2 - 我们添加treatment-id字段,PK是(treatment-id)。

3 - PK 将是(医生 ID、患者 ID、日期)。

我很难找到 'date' 是否可以成为 PK 的一部分,并且我也很难为弱实体创建一个唯一 ID

提前致谢。

【问题讨论】:

    标签: primary-key erd weak-entity


    【解决方案1】:

    弱实体集是由父实体集的主键部分标识的实体集。弱实体集的存在必然依赖其父实体集(我们说它完全参与了它的标识关系),但并非所有具有存在依赖关系的东西都是弱实体集。常规实体集也可以完全参与一个或多个关系。因此,这取决于您如何识别实体集。另请参阅我对“is optionality (mandatory, optional) and participation (total, partial) are same?”问题的回答

    由其自身属性唯一标识的实体集是常规实体集。由父实体集的主键部分标识的实体集是弱实体集。由父实体集的主键完全标识的实体集是子类型。

    您还应该注意,根据 Chen 所描述的实体关系模型,弱实体集只能有一个父实体集。由多个父实体集标识将使其成为关系而不是实体集。

    在某些架构设计工具中,使用了不同的解释,其中表等同于实体集,关系等同于 FK 约束,并且标识关系是作为表 PK 一部分的 FK。尽管采用了 ER 的大部分术语,但这种方法比实体关系模型更接近网络数据模型。

    让我们看看你的例子:

    在示例 1 中,我们应该考虑 treatment-id 是单独识别(即代理键)还是仅与 doctor-idpatient-id 组合识别(即序数)。如果它是代理键,那么在 PK 中包含 doctor-idpatient-id 将是错误的,示例 2 将是正确的处理方式。如果它是一个序数,那么它与示例 3 基本相同 - 两个外部实体键和一个在主键中设置的值。我将在示例 3 的 cmets 中对此进行更多说明。

    在示例 2 中,treatment-id 是代理键,这意味着 Treatment 是一个常规实体集,它完全参与了与 PatientDoctor 的关系。这是我推荐的解决方案,因为它是最简单的。

    在示例 3 中,您有一个由两个外部实体键和一个值集组成的主键。

    实体-关系模型不涵盖此类关系 - 具有单个实体键的关系称为实体关系,具有多个实体键的关系称为关系关系。值集仅被描述为属性的共域,而不是域。 ER 模型无法处理任意关系是人为区分实体集与值集以及属性与关系之间的结果。其他数据建模学科,如关系模型和对象角色建模是完整的,可以处理任何类型的关系。

    回到示例 3,尽管 ER 模型有缺点,但在实际数据库中创建这样的表/关系并不是无效的。然而,想想主键意味着什么——一个病人每天只能从同一位医生那里接受一次治疗吗?我认为应该可以进行多种治疗,在这种情况下,您可能需要添加另一个序数,例如(doctor-id, patient-id, date, treatment-id)。在这种情况下,使用(doctor-id, patient-id, treatment-id) 可能会更简单。

    反对这种复合/自然键的一个论点是它们加起来 - 两个关系之间的多对多关联,每个关系的主键中有 3 列,其主键中最多可以有 6 列!这很快就会变得不方便,但另一方面,如果关联是由代理键标识的,那么这些列是相关的相关信息,否则需要从连接的表中检索这些信息。

    抱歉,答案很长,但我希望这涵盖了所有要点。如果您有任何问题,请告诉我。

    【讨论】:

    • 谢谢,您帮助我理解了弱实体和常规实体之间的区别,但我对您的回答还有一些疑问:被多个父实体集识别会使其成为一种关系,而不是一个实体集 但是我的处理表有多个父实体集,但它是一个弱实体,这怎么可能?如果我在示例 2 上工作,那么这将使 Treatment 实体成为常规实体而不是弱实体,但实际上它是一个弱实体,这不是错了吗?
      非常感谢您帮助我先生
    • 但是我的处理表有多个父实体集,但它是一个弱实体,这怎么可能?在标准的实体关系模型中,这是不可能的由多个独立的父实体集识别的弱实体集。如果你处理示例 2,那么它实际上变成了一个常规实体集。
    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多