使用关联实体的正确方法是啥?

Posted

技术标签:

【中文标题】使用关联实体的正确方法是啥?【英文标题】:What is the right way to use Associative Entity?使用关联实体的正确方法是什么? 【发布时间】:2018-04-19 09:28:47 【问题描述】:

这是描述:

为 Poke-Hospital 绘制实体关系图,该图提供 宠物小精灵的医疗服务。

每个口袋妖怪都与其中一位护士乔伊有约会。在 除了记录每个口袋妖怪的名称、类型和训练师外, 系统需要跟踪正在发生的多种疾病 被诊断为宝可梦。在预约期间,护士将 总是开药。需要记录日期、时间和 药物的剂量。一只口袋妖怪可能需要多只 一次吃药。每种药物都存储有其名称、品牌和 购买成本。药量没有限制 由任何护士开处方。

在约会期间,口袋妖怪可能需要经历以下程序 作为手术和/或诊断。每个过程需要不同的类型 房间和设备清单。日期、时间和实际房间 需要记录的过程。

一个程序可以由多名护士执行。护士是 根据她所拥有的培训技能参与该程序 完全的。并非所有护士都有资格执行手术。

每位护士的姓名、寻呼机号码以及办公室号码最重要 已知。您的图表应显示实体、关系及其 属性,以及任何关系的基数。标记最好的 每个实体的主键,加下划线。

这是我的解决方案:

这是我的问题:

    我应该使用 Have Appointment 作为关联实体吗?

    我是否应该删除 2 个关系 Undergo and Prescribe and connect 2 实体程序和预约医学直接拥有 任命关联实体?那时 ERD 还会正确吗?

    如果错了,和问题2一样,我转Have 将关联实体任命为关系?

我对使用关联实体和关系之间的区别感到非常困惑(就像在这篇文章中,与教师和教师一起注册:When to use Associative entities?)和使用三元关系(将教师直接连接到注册关系而不是将注册更改为关联实体)实体并具有 Teach 关系)。

【问题讨论】:

请针对每个帖子提出 1 个具体问题。请use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图片中包含图例/键和说明。 【参考方案1】:
    我应该使用 Have Appointment 作为关联实体吗?

不,我认为它应该是一个常规实体集。你给了它自己的身份 - ID 主键 - 我同意,但这应该与元素类型的变化相对应。关联实体集 (AES) 首先是关系,这意味着它们由它们相关的实体集的(键)标识。

这是一个被广泛混淆的话题,因为实体关系模型中的 AES 不同于网络数据模型中的 AES。后者对于开发人员来说直观上更熟悉,因为它本质上是一个基于记录和指针的模型,但是由于它只支持有向的二元关系,所以任何更复杂的东西——多对多关系以及三元和更高的关系——都需要表示为 AES。在此模型中,AES 由代理 ID 标识,因为通常也不支持复合键。

实体关系模型支持 n 元关系和复合键,因此几乎不需要 AES。常规实体集和 n 元关系无法表示的一种情况是关系需要成为进一步关系的主题。

例如,让我们看一下ProcedureNurse 之间的关系,以表示参与某个程序的护士。

我更喜欢基数指标的交叉约定 - 一个护士可以执行 0 个或多个程序,而一个程序需要 1 个或多个护士。反正这里Perform的关系是通过复合主键(ProcedureID, NurseID)来标识的。

现在,如果我们想跟踪每个护士在手术过程中使用的设备,我们可能会认为简单的三元关系就可以解决问题:

但这种关系将由 (ProcedureID, NurseID, EquipmentID) 识别,从而使我们无法记录在不使用任何设备的情况下协助手术的护士。我们需要的是两个独立的关系:

(ProcedureID, NurseID)
((ProcedureID, NurseID), EquipmentID)

从第二个到第一个有一个 FK 约束,以防止不协助手术的护士处理设备。

回到Have Appointment - 这不是口袋妖怪和护士之间的关系(一个口袋妖怪可以多次看到同一个护士),这是一个涉及口袋妖怪、护士、程序和药物的事件。最好将其作为与其他四个有关系的常规实体集来处理。至于身份,我想一个口袋妖怪或护士一次只能有一个约会,所以我们可以选择(PokemonID, DateTime)(NurseID, DateTime)作为自然键。然而,在实践中,我们通常通过代理 ID 来识别事件,因为事件跨越了一个大多数 DBMS 无法有效地作为主键处理的时间间隔。

    我应该删除 2 个关系 Undergo 和 Prescribe 并将 2 个实体 Procedure and Appointment Medicine 直接连接到 Have Appointment 关联实体吗?那时 ERD 还会正确吗?

不,我认为您应该在将 AES 转换为常规实体集之后添加 PokemonHave Appointment 之间以及 NurseHave Appointment 之间的关系。

    如果错了,那和问题 2 一样,我把 Have Appointment 关联实体变成关系呢?

上面已经回答了。

【讨论】:

非常感谢。你是个好人!

以上是关于使用关联实体的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 RESTful API 中创建和验证实体模型及其 DTO 的正确方法是啥?

删除实体及其所有集合数据的正确方法是啥?

关联 ListView 的项目单击后显示 ViewPager 的正确方法是啥?

将 WCF 服务中使用的实体框架连接字符串包含到自托管控制台应用程序中的正确方法是啥?

使用多个 ID 时在 JPQL 中执行 CRUD 操作的正确方法是啥

“关联表”(多对多关系)的正确名称是啥[关闭]