我有一个问题,指出一组服务器通过一组数据线发送日常数据。每个服务器都有一个id,每条数据线都有一个id。我提出了几个想法,但我不确定哪个更好。根据我的阅读,当可以用二元关系来完成某些事情时,最好避免三元关系。但就我而言,我想出了以下二元关系
(Server)[serverId]--1--------1..* --(DailyData)[date]--1..*----------1--(DataLine)[dataLineId]
DailyData 对服务器来说较弱,因为许多服务器都会在同一天产生报告。最后,我会得到一个以
(serverId)
作为 PK 的服务器表,一个以两者的组合作为 PK 的 DailyData 表 (serverId, date)
,以及一个以三者的组合作为 PK 的 DataLine 表 (serverId, date, dataLineId)
。这(如果我做得正确的话)似乎有效。
我的另一个想法是使用Server、Date和DataLine之间的三元关系,这样看起来更优雅,并且没有弱实体。关系表就是
(serverId, dataLineId, date)
,他们三个作为PK,这与我的另一个解决方案得出相同的结论,但以更优雅和直接的方式。
哪个是更好的解决方案?
您在 UML 中描述的关系类型将是一个 关联类:如果没有
DailyData
和 Server
,Dataline
就没有意义:
关联类同时是二元关联和类。如果没有链接服务器和链接数据线,其实例就不可能存在,而这正是您尝试建模的。
UML 中的
{id}
表示属性是类标识符的一部分。它接近主键的概念,尽管 UML 没有进一步定义其语义。 Date
将是 DailyData
标识符的一部分,因为它可以区分同一服务器和数据行的多个日期。
要在数据库中实现关联类,通常会使用关联表,也称为联接表。既然你谈到“弱”和其他不是 UML 的概念,我想补充一点,在 ERD 中,最接近关联类的是“关联实体”。
顺便说一句,UML 中不存在弱实体这样的东西。最接近的是复合聚合(黑菱形),因为弱实体的生命周期取决于其所有者的生命周期。然而,在 UML 中不允许同一实例成为两个不同复合聚合的组件。因此,在 UML 中,关联类将是解决您的问题的最佳选择。