如何在 ERD 中表示多对多关系

Posted

技术标签:

【中文标题】如何在 ERD 中表示多对多关系【英文标题】:How to represent many-to-many relastionship in ERD 【发布时间】:2021-10-11 15:19:54 【问题描述】:

我正在尝试建立餐厅系统。 首先,我正在为需求构建 ER 图。 我有两个表,客户,它只有 table_number 属性,并且 另一张表是Item,这是客户将选择的菜肴,它有几个属性是(id,name,category,price)。 我遇到问题的部分要求是: 当客户下订单并提交时,应该发生两件事,首先将订单详细信息发送到厨房,然后将相同的订单保存在 history_order 中。 我的问题是: 我如何表示这些表之间的两个多对多关系 我知道如何表示厨师将读取的当前订单,但我不知道 如何在不中断的情况下以最佳方式表示一种多对多关系 原则或最佳实践。 我下载了图片中的作品,以向您展示我在说什么。 我希望它是清晰易懂的。 如果有什么不清楚的,请通过cmets告诉我。the ERD diagram

【问题讨论】:

请确定您正在遵循的确切设计方法以及您如何遵循它并询问 1 个特定的研究过的非重复问题,即您遇到/不确定的第一个问题。 (在 ER 和关系模型中,关系是值和/或实体之间的关系——而不是表——& 由表表示。在伪 ER 中,所谓的“表之间的关系”是 FK 约束。)跨度> 请use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。 我使用图片是因为我无法表达我面临的问题,我有这些实体:customer、items、order、history_orders order 有两个属性 customer_table 将 customer_id 引用到 customer 和 item_id 引用订单交付时将 item_id 放入项目实体,它应该被删除,但我不想对 history_order 中的订单做同样的事情,我如何在 ER 图中表示这一点?我脑海中的解决方案就是重复。 请通过编辑而非 cmets 进行澄清。 PS“包括表格和 ERD。”——ERD 中的所有内容都可以很容易地用文本表示。当这样的文本是代码时,它被称为 DDL。 PS请也对我所有的第一条评论采取行动。否则,您会要求重写教科书/教程,以及您无法识别的方法,并且没有清楚地解释您是如何陷入困境的,即遵循该方法。我们可以预期这样的问题是重复的。 How to AskHelp centerMeta Stack OverflowMeta Stack Exchange 【参考方案1】:

顺序就是顺序。它被送到厨房,并被存档在历史中。像其他所有内容一样,您想记录它一次。您可能会从多个表中引用它。

假设您有一个表 order_items,其中包含关键属性 order_iditem_id。现在您可以查找订单的所有项目。您可以有另一个表来跟踪每个订单的进度。将其称为 orders,具有 order_idstatus 属性,其值可能有 ordered(发送到厨房)、ready(发送到服务),served,也许cancelled,和(希望)paid。您还可以有一个属性 status_time 来记录上次更新状态的时间。您的“厨房”订单列表是状态为ordered 的订单;历史是那些状态为paid的人。

您可能不需要 order_id。根据您的描述,table_numberorder_time 似乎可以唯一标识每个订单。您可以使用该对而不是不透明的 ID。

【讨论】:

感谢您的回复,我很感激,但无论如何我想在这里澄清一些事情,history_order 表的目的是由经理做出决定,当订单交付给客户时,订单将被删除,但如果我从 history_order 引用 order ,当订单完成并交付给客户并从订单表中删除时,我需要将订单保留在 history_order 中,但它也会因为引用而从 history_order 中删除,我不希望它发生我只想知道如何在 ER 图中表示它? 如果我将物品的属性冗余并放在history_order实体中而不是使用引用,我会破坏ER图的原则吗?我不想使用对 item 或 order 的引用,因为如果它们中的任何实例 delete ,相同的实例也将在 history_order 表中被删除 我建议的设计不需要history_order。这可能是 status paidorders 视图,或类似的东西。如果有人说随着时间的推移订单会变得“太大”,请寻求证据。如果证据充足,您可以将“旧”订单(去年、上个月等)存档到历史记录表中,同时在 orders 中保留“新历史记录”。确实没有理由在数据库中多次保留相同的信息。

以上是关于如何在 ERD 中表示多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Spring,JPA:如何使用多对多关系桥表设置查询另一个实体下的实体

与Hibernate的多对多关系的循环序列化

使用 Spring Boot、Jackson 和 Hibernate 的多对多关系

SQL映射文件-----MySQL关系映射1对1,1对多,多对多

雄辩的多对多对多 - 如何轻松加载远距离关系

如何在多对多关系中更新日期