如何在非(整体/部分)关系中用 UML 表示删除后果(无效或级联)?

How to represent in UML deletion consequences (nullify or cascading) in non-(whole / part) relations?

我认为我们同意一方面组合和删除级联聚合和删除删除之间存在对应关系其他,以防我们在 whole / part 关系中删除 whole 实例。

但是如果两个类之间没有全部/部分关系怎么办:

我知道我们只能在 整体/部分 层次结构出现的情况下使用组合和聚合:Car - Wheels, Apartment - Rooms 而不是在不出现此层次结构的情况下(例如 Car - Driver 类)。

那么,我们应该如何在 UML 中表示这种在数据库中有删除结果(无效或级联)但没有“整体/部分”关系的情况?

我们同意最初的假设吗?

UML 文献经常提到关于 aggregation/composition 的 part-whole 关系。然而,UML 标准中的定义已经发展(参见 UML 2.5.1):

Sometimes a Property is used to model circumstances in which one instance is used to group together a set of instances; this is called aggregation. (...)

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

  • Composite: Indicates that the Property is aggregated compositely, i.e., the composite object has responsibility for the existence and storage of the composed objects.

Composite aggregation is a strong form of aggregation that requires a part object be included in at most one composite object at a time. If a composite object is deleted, all of its part instances that are objects are deleted with it.

换句话说,没有为“聚合”(即共享聚合)指定精确的语义,这将与简单关联有所不同:共享聚合是 .

因此,数据库约束和 UML 建模之间的关系并不像您想象的那么简单。

接近匹配?

此外,在数据库模式和 UML 模型之间没有通用的 one-to-one 映射。可以使用多个数据库模式来实现相同的 UML class 图。相反,多个 UML 图可能表示由给定数据库模式实现的设计。所以我们在这里能做的最好的就是考虑 close-matches.

在您的数据库中,具有 FOREIGN KEY 约束的 table 将对应于组合中的潜在组件,或共享聚合的元素,或简单关联中的关联实例:

  • a ON DELETE CASCADE 可以帮助实现复合聚合:这是 SQL 中实现生命周期类型的唯一方法您期望在组合中进行的管理:当组合完成时,组件将被删除。它也可以实现一个普通的关联,如果某些业务rules/contracts(例如UML post条件)需要这样的关联删除。

  • a ON DELETE SET NULL 可以帮助实现共享聚合,如果它的语义定义为你的意思:如果聚合被删除,它的内容不会被删除,因此可以共享。但它也可以实现任何普通关联,因为关联实例的删除也不会触发删除,并且约束将允许保持干净的参照完整性。

我同意,组合 表示级联删除,因为根据 UML,整体负责部分的存在。正常的 关联 意味着,您可以删除任何 object 而不会影响可能具有 link 的任何其他 object。 UML 没有为 聚合 定义语义,因此它们的行为方式相同。但是,即使我们考虑到聚合的领域特定语义,我也不认为有改变这种情况的例子。

但是,如果你有一个一端重数为1的关联,你不能删除这一端的object,因为已经link的object ed 之后将无效。这与组合或聚合无关。

那么,剩下的问题就是,如果没有没有whole-part关系,如何表示级联删除?真的有发生这种情况的例子吗?我没有看到 Car - Driver,不能处于 whole-part 关系中。请记住,我们不是在谈论真车或真人。我们正在谈论一个软件系统,我们想要为特定目的表示有关现实世界的知识。如果目的是为渡轮上的汽车及其司机发放登机牌,那么将它们视为一个组合是非常有意义的。