弱实体与三元关系的双重二元关系

Double binary relationship with weak entity vs ternary relationship

提问人:daniel 提问时间:11/10/2023 最后编辑:Christophedaniel 更新时间:11/11/2023 访问量:68

问:

我有一个问题,指出一组服务器通过一组数据线发送每日数据。每个服务器都有一个 id,每个数据线都有一个 id。我想出了几个主意,但我不确定哪个更好。从我所读到的内容来看,当可以在二元关系方面做一些事情时,避免三元关系总是更可取的。但就我而言,我想出了以下二元关系

(Server)[serverId]--1--------1..* --(DailyData)[date]--1..*----------1--(DataLine)[dataLineId]

其中 DailyData 对 Server 较弱,因为许多服务器将在同一天有报告。最后,我会得到一个 PK 为 Server 表,一个 DailyData 表,两者组合为 PK,以及一个 DataLine 表,三者组合为 PK。这(如果我做对了)似乎有效。(serverId)(serverId, date)(serverId, date, dataLineId)

我的另一个想法是在 Server、Date 和 DataLine 之间使用三元关系,它看起来更优雅,没有弱实体。关系表只是由他们三个人作为PK,这与我的另一个解决方案得出了相同的结论,但以一种更优雅和直接的方式。(serverId, dataLineId, date)

哪个是更可取的解决方案?

数据库设计 UML 关系 类图

评论


答:

2赞 Christophe 11/10/2023 #1

您在 UML 中描述的那种关系将是一个关联类: 没有 a 和 a 就没有意义:DailyDataServerDataline

enter image description here

关联类同时是二进制关联和类。如果没有链接服务器和链接数据线,其实例就无法存在,而这正是您尝试建模的内容。

in UML 指示属性是类标识符的一部分。它接近于主键的概念,尽管 UML 没有进一步定义其语义。这将是标识符的一部分,因为它允许区分同一服务器和数据线的多个日期。{id}DateDailyData

若要在数据库中实现关联类,通常使用关联表,也称为联接。既然你说的是“弱”和其他不是 UML 的概念,我想补充一点,在 ERD 中,最接近关联类的是“关联实体”。

顺便说一句,UML 中没有弱实体这样的东西。最接近的是复合聚合(黑菱形),因为弱实体的生命周期取决于其所有者的生命周期。但是,在 UML 中不允许将同一实例作为两个不同复合聚合的组件。因此,在 UML 中,关联类将是解决您的问题的最佳选择。

评论

0赞 daniel 11/10/2023
谢谢你的回答!我正在做的课程是将 ERD 概念混合到 UML 图中,并要求我们向 UML 图添加主键、弱实体等。我会和老师核实我们是否可以将关联类的属性与服务器和数据线一起用作 PK
0赞 www.admiraalit.nl 11/11/2023
我不知道在 UML 中,不允许“将同一类作为两个不同复合聚合的组件”。您是否参考了指定此规范的 UML 规范?我原以为会允许例如在汽车和摩托车中聚合类 Wheel,即使 Wheel 的实例不能同时成为汽车和摩托车的一部分。
1赞 Christophe 11/11/2023
确实@daniel。对于弱实体,完整的 pk 通常是复合的,由弱实体的属性(弱标识符)与所有者的 pk 组合而成。对于关联类的实现,这是一种有效的技术。但是,它并不排除使用代理项键:为关联类的每个新实例生成的唯一键。两个非 null 外键足以提供等效的实现。UML在这方面是完全不可知的。
0赞 Christophe 11/11/2023
@www.admiraalit.nl 让我纠正一下,不能成为组件的不是类,而是实例。参见第 112 页(第 9.5.3 节,就在聚合表单表下方):“复合聚合是一种强大的聚合形式,它要求一次最多将一个部件对象包含在一个复合对象中。我想原因是,如果一个实例可以是两个复合体的一部分,那么对于哪个组合负责其生命周期,就会存在歧义。
1赞 www.admiraalit.nl 11/13/2023
是的,感谢您更改答案。