Mysql 在关系数据库中转换UML聚合
我正在制作一个JavaFX桌面应用程序。这是一个跟踪餐厅订单的销售点系统。我对此非常陌生,在我启动phpmyadmin创建数据库后,事情变得混乱起来 这是我的UML的相关部分: 澄清表格内容的一些示例:Mysql 在关系数据库中转换UML聚合,mysql,database,orm,uml,class-diagram,Mysql,Database,Orm,Uml,Class Diagram,我正在制作一个JavaFX桌面应用程序。这是一个跟踪餐厅订单的销售点系统。我对此非常陌生,在我启动phpmyadmin创建数据库后,事情变得混乱起来 这是我的UML的相关部分: 澄清表格内容的一些示例: 配料表可能包含:面粉、糖、牛肉、鸡蛋 物品菜单桌子可能包含:比萨饼、汉堡 article菜单由一堆成分组成,但这些成分仍然可以独立存在,所以我认为这是一个聚合 问题是将其转换为关系数据库,尤其是聚合 我的尝试: 在article菜单中,“recette”属性是引用component表中的行的
配料表可能包含:面粉、糖、牛肉、鸡蛋
桌子可能包含:比萨饼、汉堡物品菜单
由一堆成分组成,但这些成分仍然可以独立存在,所以我认为这是一个聚合article菜单
article菜单
中,“recette”属性是引用component
表中的行的FK,“recette”属性的类型为ENUM
,它可以保存用户在article菜单
中创建行时定义的许多值
示例:
article菜单
表中有一行表示比萨饼,它的属性之一是recette类型的ENUM
,值为“奶酪、面粉、酵母、洋葱、番茄、蘑菇、油”
我的问题:
这是表示聚合的一种可接受的方式吗?最理想的方式是什么
编辑:
读了克里斯托夫的答案后,很明显我没有
了解什么是ENUM
他链接的IBM文档消除了我的许多困惑
我想谈谈这个话题
库存信息不应成为成分表的一部分,因为
相同的成分可能有许多状态,所以我删除了它
那些
至于每份发票中所用的数量,则应予以说明
使用recipie
表中的quantity
属性
因此,我重新思考了我的方法,并提出了以下设计:
您的方法有问题
您实现了Martin Fowler称之为的,它实现了一对多关系:
- 在这里,
Recipe
('recette')将在文章菜单
和成分
之间实现多对一关系:一篇文章将只有一种成分,一种成分可以出现在多篇文章中李>
- 此外,
ENUM
允许您为一行选择多个值中的一个值。事实上,它只是使用数字而不是字符串的方便替代品李>
所以,不,这不是正确的方法
多对多关联和隐藏表
您需要实现多对多关联:每个文章菜单
可以有许多成分
,反之,每个成分
可以在许多文章菜单
中使用
在RDBMS中,这可以使用。这是一个在概念模型中不可见的表。例如,该关联表可以称为Recipe
,它有两列:IDARTICLEMNU
和IDIGREDIENT
。然后,您可以找到:
- 通过查找具有相关
idArticleMenu
的每个配方行,可以查看文章的所有成分李>
- 通过搜索
idIngredient
完成您的模型
现在,如果你谈到配方和面粉,你申请表中的下一个问题是:制作一个比萨饼需要多少面粉
不幸的是,这个数量
不是文章菜单
的属性,因为同一篇文章的每种成分都可能有不同的数量。它既不是成分的属性,也不是成分的属性,因为成分的使用量不同,取决于所使用的物品。那么把这个放在哪里呢
答案是
附加建议
您可以使用聚合来表示整个零件关系。然而,聚合语义在UML规范中没有明确定义。因此,使用它没有根本的好处。因此,您可以在这里使用正常关联
在设计模型(概念模型)中,不应在类中显示实现关系的属性。您可以在它将实现的关联的另一端显示此类属性的名称。如果是一个实现模型,则可以很好地显示表的所有列。通常的做法是为映射到表的每个类使用«table»
原型 这是一种可以接受的方式吗?不,你应该用另一个表格来表示ArticleMenu和配料之间的关系。这个新表应该是recette(idArticleMenu,IDigredient)我必须对ArticleMenu和Order做同样的操作吗?由于订单中可以有许多ArticleMenu行,因此这不是复合聚合,而是共享聚合。后者没有定义的语义。你可以认为它是不存在的。在配料中包含库存数据似乎是一个糟糕的设计。看看你家里的面粉包装。它是否列出了股票信息?您更多地谈论的是数据库设计,而不是UML设计。您可能应该改为使用ERD?