在关系数据库中转换 UML 聚合

Translating UML aggregation in a relational database

我正在制作 JavaFX 桌面应用程序。这是一个跟踪餐厅订单的销售点系统。我对此很陌生,在我启动我的 phpmyadmin 来创建我的数据库后,事情变得混乱了。

这是我的 UML 的相关部分:

一些示例来阐明 table 的内容:

问题是将其转化为关系数据库,尤其是聚合。

我试过的:ArticleMenu 中,'recette' 属性是一个 FK,它引用来自 Ingredient table 的行,'recette' 属性是 ENUM 类型,它可以保存用户在 ArticleMenu.

中创建行时定义的许多值

示例: ArticleMenu table 有一行代表比萨饼,它的属性之一是 ENUM 类型的 recette,其值为“奶酪、面粉、酵母、洋葱、番茄、蘑菇、油“

我的问题: 这是表示聚合的 acceptable 方式吗?什么是最佳方式?

编辑:

看完 Christophe 的回答后很明显我没有 了解 ENUM 是什么。

他链接的 IBM 文档消除了我的很多困惑 到这个话题。

股票信息不应该是 ingredient table 的一部分,因为 可能有很多相同的状态ingredient,所以我删除了 那些。

至于每个食谱中使用的数量,将表示 使用 recipie table.

中的 quantity 属性

所以我重新考虑我的方法并想出了这个设计:

你的方法有问题

您实现了 Martin Fowler 所说的 foreign key mapping,它实现了一对(可能)多的关系:

  • 在这里,Recipe ('recette') 将实现 ArticleMenuIngredients 之间的多对一关系:一篇文章只有一种成分,并且一种成分可以出现在多篇文章中。
  • 此外,ENUM 允许您在一行中仅从多个值中选择一个值。 ENUM 实际上只是使用数字代替字符串的方便替代品。

所以,不,这不是正确的方法。

多对多关联和隐藏table

你需要的是实现多对多的关联:每个ArticleMenu可以有很多Ingredients,反过来每个Ingredient可以有很多[=11] =].

在 RDBMS 中,这可以使用 association table 来实现。这是一个 table 在您的概念模型中不可见的东西。例如,这个关联 table 可以称为 Recipe 并且有两列:idArticleMenuidIngredient。然后你可以找到:

  • 一篇文章的所有成分,通过查找具有相关 idArticleMenu 的每个食谱行。
  • 使用某种成分的所有文章,通过搜索 idIngredient

正在完成您的模型

现在,如果您谈到食谱和面粉,您申请中的下一个问题是:制作 1 个披萨需要多少面粉?

不幸的是,这个 Quantity 不是 ArticleMenu 的 属性,因为同一物品的每种成分可能有不同的数量。它既不是 Ingredient 的 属性,因为一种成分的使用量不同,具体取决于使用它的物品。那么把它放在哪里呢?

答案是 association class

其他建议

您可以使用聚合来表达整体-部分关系。然而,聚合语义在 UML 规范中没有明确定义。所以使用它没有根本的好处。因此,您可以在此处使用普通关联。

在设计模型(概念)中,您不应在 class 中显示实现关系的属性。您可以在它将实现的关联的另一端显示此类属性的名称。如果一个实现模型,你可以很好地显示一个 table 的所有列。通常的做法是为每个将映射到 table 的 class 使用 «table» 构造型。