对于一个学校项目,我应该设计上学期项目的系统。我们使用 UML,创建一个极其简单的用例图(没有<<extend>>
键入废话,只是指向系统内部用例的参与者),从中我们制作一个类图,然后是一个关系模型。
用例和类图尝试:
最后一张图只是我最终认为可能我的用例是问题所在。
我的应用程序允许人们/餐馆列出他们愿意捐赠的食物。为无家可归者提供食物的慈善机构索要食物。如果有比赛,慈善机构可以创建一条卡车路线来从所有比赛中领取食物。
我无法弄清楚如何表示匹配,以及 FoodItems 的菱形和连接到路线的匹配是否有意义。我知道在关系建模中继承通常是一个坏主意。难道只是到处都有 FK 的问题吗?我感觉自己在兜圈子。
这个对象关系映射主题可能非常复杂。但看看你的图表,这里有一个过于简单的经验法则:
- 将没有泛化和专门化的每个类映射到关系表。什么时候ID字段 https://martinfowler.com/eaaCatalog/identityField.html存在,这些将充当主键。
- 将每个具有两个专业化的类映射到一个关系表,该表组合了该类的字段及其专业化的所有字段。这种技术称为单继承表 https://martinfowler.com/eaaCatalog/singleTableInheritance.html。它并不总是一个好的解决方案,但它绝对适合您的情况。
- 对于每个一对 n 关系 (
1 - 1..*
, or 1-0..*
) 将 1 侧的主键 (ID) 添加为 n 侧表中的外键。对你的聚合也这样做。这就是所谓的外键映射 https://martinfowler.com/eaaCatalog/foreignKeyMapping.html.
- 对于您的 n 到 n 链接(
1..* - 1..*
)您需要添加一个关系表,其中包含两个链接表的 ID(每个表都定义为外键,并且两者一起作为组合主键)。这就是所谓的关联表映射 https://martinfowler.com/eaaCatalog/associationTableMapping.html.
- 在第二次进行一对一聚合
ItemMatch
,我认为添加两个对应于一个的字段就足够了foodItemID
(使用不同的名称)。
- 您还需要将作为结果添加的外键定义为可选(可为空)
0..*
关系
附加读物:
- 马丁·福勒的优秀著作《企业应用架构模式 https://martinfowler.com/books/eaa.html如果想了解更多信息,请详细解释几种继承映射策略的优缺点。除了简单的单一继承表之外,您还会发现更复杂的替代方法,例如类表继承 https://martinfowler.com/eaaCatalog/classTableInheritance.html, 具体表继承 https://martinfowler.com/eaaCatalog/concreteTableInheritance.html and 继承映射器 https://martinfowler.com/eaaCatalog/inheritanceMappers.html.
- 网络文章将对象映射到数据模型 https://www.visual-paradigm.com/support/documents/vpuserguide/3563/3564/85444_mappingobjec.html建议来自granier https://stackoverflow.com/users/5724677/granier在评论中(谢谢!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)