Class 图:在组合关系中 Child Class 是否应该始终具有 ID 字段?

Class Diagram: In A Composition Relationship Should a Child Class Always Have An ID Field?

我很难将我的数据库 table 和外键转换为具有 class 和关联的 class 图。

我的问题是:
"在组合关系中,child class 应该总是有一个 ID 字段吗?".

在我的 CD 中,有 2 个合成器 classes:PurchaseItemPurchaseFinisher,其中复合 Purchase class。 PurchaseItem 已经带有来自其 table 的 ID 字段,但是,PurchaseFinisher 不是因为它被 id_purchaseid_payment_method 外键过滤。

提前致谢。

这是我的 DB 图:

正如您所说,我看不到 PurchaseProduct 之间的冗余。你能根据我的数据库图告诉我吗?我的 table 模型很好(希望如此)。我的错在 classes 定义中。

在 class 图中,没有 class 需要 id 属性:每个 class 实例(又名对象)都有自己的身份,有或没有明确的 id 属性.

在数据库中,您当然需要一个明确的 ID 属性 来唯一标识数据库中的对象并找到它。顺便说一句,您可以使用尾随 {id} 来注释此类属性。 UML 没有为它定义任何语义,但它通常具有足够的表现力来帮助数据库设计者。

在组合的情况下,主要问题是组合对象是否可以通过其他方式轻松识别。有几种相关的ORM数据库技术,例如:

  • 如果足以识别元素,您可以将拥有对象的 ID 与另一个 属性 一起使用。两者一起将在数据库中构成一个复合主键。
  • 您可以使用唯一的 id 来标识对象(代理主键)并使用拥有对象的 id 作为外键。

对于 PurchaseItem,您拥有所需的一切,尽管该图表没有说明您将使用两种方法中的哪一种(例如,id 是全局唯一的,还是在购买中唯一的?)。

但对于 PurchaseFinisher,不清楚您是否可以唯一地识别一个事件。如果一种支付方式每次购买只能使用一次,那没关系,因为它可以用来识别对象。 如果允许使用相同的付款方式以相同的货币支付相同金额的两倍(总价的一半),那么您将获得无法区分的重复项。因此,从数据库的角度来看,将需要某种标识符。