如何理解UML中类似自反关联的"reflexive aggregation"关系

How to understand the "reflexive aggregation" relationship similar to reflexive association in UML

这个class图是什么意思? class自反联想图使用实线和箭头,这里换成空心菱形。它与递归有什么关系吗?这个 class 图会生成什么?如果能举个例子最好。另外这个递归关系应该是一对多的,如果存数据库怎么建一个table

在 UML 中,这个 class 意味着 每个 单元聚合到其他单元中。

UML 标准不涵盖代码生成,因此将其解释为代码取决于您选择的工具。每个专有代码生成工具 应该 要么因错误而停止,要么提供一个额外的构造函数来创建一个引用自身的新单元。否则,调用者将哪个 Unit 传递给第一个 Unit 的构造函数?

解决该问题的其他方法包括对该 UML 模型进行开放世界解释(其中并非所有真实信息都存在,OWL 就是这种情况),或将多重性放宽至 0。 .1.

P. UML 2.5 的 110 条规定了这种关系:

shared - Indicates that the Property has shared aggregation semantics. Precise semantics of shared aggregation varies by application area and modeler.

所以简而言之:它意味着你定义它应该意味着什么。


史记

在 UML 1.5 中只有聚合。然后在 2.0 中他们引入了共享聚合。在第UML 2.0 的 80

Indicates that the property has a shared aggregation.

再往下

Precise semantics of shared aggregation varies by application area and modeler.

显然后一句话并没有被普通人理解,你会发现关于它的意思有各种各样的解释。

幸运的是,现在在 UML 2.5 中,这两个句子被合并到一个段落中。即在我著名的 p. 110.

这是什么意思?

这个class图表意味着Unit的一个实例可以Unit的其他几个实例相关联:

  • 镂空聚合钻石只是一颗“modeling placebo”:不改变图表的含义,但只是表明关联代表某种分组。

  • 一个自反关联表示它把一个class和自己关联起来。与递归没有直接关系,如.

  • 尽管如此,递归 算法是探索此类关联的良好候选者(例如找到 Unit 与特定实例间接相关)。在数据库环境中,有时使用术语“递归关联”而不是“自反”,因为 recursive joins 用于实现它们。

请注意,1 可能应该是 0..1,因为 1 正好表示 1,这意味着向上导航时会出现无限循环。

它看起来怎么样?

因为它是一对多的关联,你可以把它想象成一片树林:每个 Unit 实例可以是一些分支的开始 和几棵树可能共享公共分支(废话:最多只有一个父树).

生成了什么/如何实现?

让我们添加一些角色以更好地谈论聚合的末端:

代码生成将取决于工具和目标语言。但是具有聚合的模型和具有简单关联的模型很可能会生成完全相同的代码,例如:

class Unit { // Java
    private String id;
    private Unit[] child; // java objects are sharable by default 
    private Unit parent; // unless we make it non navigable in that direction
    ...
}

在 RDBMS 中,table 看起来非常相似。关系模型允许仅使用一列进行双向 link:

ID (PK)  |  Parent (FK, nullable)
----------------------------------
w        |
u        |
u1       |  u
u2       |  u 
u3       |  u
u21      |  u2
u31      |  u3
u32      |  u3 
v        |
v2       |  v

A self-join or a recursive CTE 将允许使用自反关联查询数据。