在关系数据库中转换 UML 聚合
Translating UML aggregation in a relational database
我正在制作 JavaFX 桌面应用程序。这是一个跟踪餐厅订单的销售点系统。我对此很陌生,在我启动我的 phpmyadmin 来创建我的数据库后,事情变得混乱了。
这是我的 UML 的相关部分:
一些示例来阐明 table 的内容:
Ingredient
table 可能包含:面粉、糖、牛肉、鸡蛋...
ArticleMenu
table 可能包含:披萨、汉堡...
ArticleMenu
是由一堆成分组成的,但是这些成分仍然可以单独存在,所以我认为这是一个集合。
问题是将其转化为关系数据库,尤其是聚合。
我试过的:
在 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') 将实现 ArticleMenu
和 Ingredients
之间的多对一关系:一篇文章只有一种成分,并且一种成分可以出现在多篇文章中。
- 此外,
ENUM
允许您在一行中仅从多个值中选择一个值。 ENUM
实际上只是使用数字代替字符串的方便替代品。
所以,不,这不是正确的方法。
多对多关联和隐藏table
你需要的是实现多对多的关联:每个ArticleMenu
可以有很多Ingredients
,反过来每个Ingredient
可以有很多[=11] =].
在 RDBMS 中,这可以使用 association table 来实现。这是一个 table 在您的概念模型中不可见的东西。例如,这个关联 table 可以称为 Recipe
并且有两列:idArticleMenu
和 idIngredient
。然后你可以找到:
- 一篇文章的所有成分,通过查找具有相关
idArticleMenu
的每个食谱行。
- 使用某种成分的所有文章,通过搜索
idIngredient
正在完成您的模型
现在,如果您谈到食谱和面粉,您申请中的下一个问题是:制作 1 个披萨需要多少面粉?
不幸的是,这个 Quantity
不是 ArticleMenu
的 属性,因为同一物品的每种成分可能有不同的数量。它既不是 Ingredient
的 属性,因为一种成分的使用量不同,具体取决于使用它的物品。那么把它放在哪里呢?
其他建议
您可以使用聚合来表达整体-部分关系。然而,聚合语义在 UML 规范中没有明确定义。所以使用它没有根本的好处。因此,您可以在此处使用普通关联。
在设计模型(概念)中,您不应在 class 中显示实现关系的属性。您可以在它将实现的关联的另一端显示此类属性的名称。如果一个实现模型,你可以很好地显示一个 table 的所有列。通常的做法是为每个将映射到 table 的 class 使用 «table»
构造型。
我正在制作 JavaFX 桌面应用程序。这是一个跟踪餐厅订单的销售点系统。我对此很陌生,在我启动我的 phpmyadmin 来创建我的数据库后,事情变得混乱了。
这是我的 UML 的相关部分:
一些示例来阐明 table 的内容:
Ingredient
table 可能包含:面粉、糖、牛肉、鸡蛋...ArticleMenu
table 可能包含:披萨、汉堡...ArticleMenu
是由一堆成分组成的,但是这些成分仍然可以单独存在,所以我认为这是一个集合。
问题是将其转化为关系数据库,尤其是聚合。
我试过的:
在 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') 将实现ArticleMenu
和Ingredients
之间的多对一关系:一篇文章只有一种成分,并且一种成分可以出现在多篇文章中。 - 此外,
ENUM
允许您在一行中仅从多个值中选择一个值。ENUM
实际上只是使用数字代替字符串的方便替代品。
所以,不,这不是正确的方法。
多对多关联和隐藏table
你需要的是实现多对多的关联:每个ArticleMenu
可以有很多Ingredients
,反过来每个Ingredient
可以有很多[=11] =].
在 RDBMS 中,这可以使用 association table 来实现。这是一个 table 在您的概念模型中不可见的东西。例如,这个关联 table 可以称为 Recipe
并且有两列:idArticleMenu
和 idIngredient
。然后你可以找到:
- 一篇文章的所有成分,通过查找具有相关
idArticleMenu
的每个食谱行。 - 使用某种成分的所有文章,通过搜索
idIngredient
正在完成您的模型
现在,如果您谈到食谱和面粉,您申请中的下一个问题是:制作 1 个披萨需要多少面粉?
不幸的是,这个 Quantity
不是 ArticleMenu
的 属性,因为同一物品的每种成分可能有不同的数量。它既不是 Ingredient
的 属性,因为一种成分的使用量不同,具体取决于使用它的物品。那么把它放在哪里呢?
其他建议
您可以使用聚合来表达整体-部分关系。然而,聚合语义在 UML 规范中没有明确定义。所以使用它没有根本的好处。因此,您可以在此处使用普通关联。
在设计模型(概念)中,您不应在 class 中显示实现关系的属性。您可以在它将实现的关联的另一端显示此类属性的名称。如果一个实现模型,你可以很好地显示一个 table 的所有列。通常的做法是为每个将映射到 table 的 class 使用 «table»
构造型。