UML关联多重性

17

我有一个关于关联多重性的问题。我理解它,但是举个例子,如果我有:

 ---------            ---------
|         |1      *  |         |
|CLASS    |----------| STUDENT |
|         |          |         |
 ---------            ---------
这是否意味着在系统存在的任何时刻都必须至少有一个学生被分配到班级中,还是这些多重性应该为真,只要系统正常运行就可以?我提出了这个问题,是因为我想知道对象创建的时刻。首先,我们创建一个空班级,然后将其填充到学生中。在一段时间内,班级是空的,但仅在创建和填充期间它才至少有一个学生。如果我将1更改为0..1,则表示可以有空班级。这并非不正确(在填充时刻),但稍后我不想允许没有学生的班级。

编辑:将0..*更改为0..1,应该像现在这样,对于混淆,我很抱歉。

3个回答

12
这是否意味着,在系统存在的任何时刻都必须至少有一个学生分配到该班级,或者这些多重性应该是真实的,如果系统正常运行? 这是个好问题。它意味着当系统处于稳定状态时,每个学生必须与一个班级关联。这又引出了另一个问题:什么构成了“稳态”?通常情况下,UML并没有严格定义这个概念。直观上来看,当没有正在改变状态的活动时,系统就处于“稳态”。而一些UML的扩展会更加严谨。例如,可执行UML表示在状态操作正在执行时,系统可以违反基数约束。但在状态操作完成后,它必须使系统保持有效状态,即满足所有基数约束。

数据库提供了一个很好的类比。数据库限制(如非空和外键)必须在系统稳定时保持一致。在事务执行期间,约束可能会暂时被破坏。但当事务完成时,它必须使数据库保持有效状态。

因此,对于您所示的示例:

  • 当系统处于稳态时,班级不存在学生是有效的( * 表示0个或多个,因此班级不需要有任何学生)。
  • 当系统处于稳态时,学生不分配到班级是无效的(“1”表示恰好一个)。因此,创建学生的“事务”必须将学生与班级关联起来。
希望这有所帮助。

1
这是否意味着在系统存在期间的任何时刻都必须至少有一个学生被分配到该班级?
它意味着有多个学生被分配到同一班级。
关联的每个端点都有上限和下限多重性边界,但大多数UML编辑器只会显示一个值,如果上限和下限边界相同。如果要允许(零或一)到多个,则可以将其编写如下:
0..1      *  
-----------

你在这里真正可能想要的是多对多的关系... 学生可以参加多个班级,而班级可以包含多个学生。

大约两年后,你的回答解决了我的问题 :) 这就是为什么多重性中有4个值。在Hibernate中,我们只需要将其建模为多对一、一对一、一对多,只需要2个值即可。 - lovespring

0
不,* 并不意味着每个班级都至少有一个学生在任何时候。但是从学生到班级的方向来看,多重性表示任何学生只属于一个班级。
出于建模原因,您可能还希望将1的多重性更改为*,但这取决于您的上下文。

好的,但是“任何时候”这个词怎么办?它是否也排除了我所描述的情况(创建对象),还是那些情况被省略了? - Andna
关于* - 我认为它表示与0..*相同,至少在 "UML精髓" 中是这样说的。 - Andna
@Andna 这取决于您的 UML 编辑器如何解释您的输入... 您应该能够检查图表并查看每个端点的实际上限和下限。 - Dagg Nabbit
我正在使用Visual Paradigm,就我的这个软件的一些小技巧而言,如果我选择作为多重性,我只能看到'',但我认为关于*的含义的讨论与此主题无关。我已经修正了原始帖子,因为在多重性方面存在错误(0..'**'而不是0..1),如果你现在可以看一下它,我会很感激 :) - Andna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接