首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >E-R图混淆

E-R图混淆
EN

Stack Overflow用户
提问于 2016-02-14 19:09:55
回答 2查看 220关注 0票数 0

我正在为一家商店设计这张E-R图,下面我展示了其中的一部分(其余部分并不相关)。请查看链接:E-R diagram

我的问题是,这家商店只卖两种商品,袜子和鞋子。我是否在我的图表中正确地详细说明了这一点?我不确定我的基数和/或我的设计是否正确。客户必须购买这些商品中的至少一个才能存在订单(但可以自由购买任何数量的商品)。

Shoe和Sock实体将具有各自的ID属性,我计划将其转换为关系模式,如下所示:

(我忘了将数量关系添加到我的图表中,以便拥有一个名为“ORDER_CONTAINS”的属性。)

代码语言:javascript
复制
Table: Order_Contains
    ORDER_ID    | SHOEID            | SOCKID           | QTY
    primary key | FK, could be null |FK, could be null | INT

这显然是行不通的,因为数量是没有意义的。有没有一种方法可以将产品减少到只有两个产品,并使所有这些产品都能工作?

EN

回答 2

Stack Overflow用户

发布于 2016-02-15 14:12:22

将两个一对多的关系组合成一个可以为空的字段是一种糟糕的设计。如何记录同时包含鞋子和袜子的订单-在SOCKID设置为NULL的情况下每只鞋一行,或者将袜子的每一行都设置为NULL,或者合并行?在前一种情况下,QTY的含义很清楚,尽管它取决于SHOEID/SOCKID字段的内容,但是在后一种情况下,QTY意味着什么呢?如何处理SHOEIDSOCKID都为NULL且QTY为正的行?记住墨菲的数据库定律--如果它能被记录下来,它就会被记录下来。更糟糕的是,您的主键(ORDER_ID)将阻止您记录超过一行,因此客户不能购买超过一双(双)袜子或鞋子。

更好的设计应该是有两个独立的关系:

代码语言:javascript
复制
Order_Socks (ORDER_ID PK/FK, SOCKID PK/FK, QTY)
Order_Shoes (ORDER_ID PK/FK, SHOEID PK/FK, QTY)

这样,只有一种方法可以记录订单的内容,而且它是明确的。

票数 0
EN

Stack Overflow用户

发布于 2016-02-25 09:14:24

您没有很好地解释这里的上下文。我会试着根据我所理解的来解释,并给你一些提示。

你的店铺只卖并且总是(永远)卖2种产品吗?做这些产品的细节(颜色,型号,重量,宽度等)需要在数据库中持久化吗?如果是,那么我们在模型中有两个实体: SOCKS和SHOES。每个实体都有自己的属性。购买或订单通常被视为ERD上的事件。如果您的客户总是用鞋子购买(或订购)袜子,那么在三个实体之间总是有一个链接:

客户-鞋子-袜子

这个连接/关联/关系是一个事件,这将是购买(或订单)。

如果客户可以购买单独的鞋子和袜子,那么袜子和鞋子是称为产品的超级实体的子类型,而购买是客户和产品之间的事件。在这里,在这种情况下,我们有一个分区关系。

但是,如果您的客户购买单独的产品,并且您的商店不会永远只销售2个产品,并且产品的详细信息并不总是相同的,并且不会保存为表中的列,则情况是另一种情况。

鞋子和袜子被认为是产品,以及其他可以在未来考虑的项目。因此,我们在PRODUCTS表中有记录/行。

当客户下订单(或购买)时,他(她)就是在购买产品。在这里,客户和产品之间有很强的联系,同样通常是事件,也就是购买(或订单)。

我不知道你是否这样做,但在考虑开始一个图表之前,在论文或文档中键入问题上下文。显示当前情况中的所有详细信息。

当实体具有属性时,可以看到这些实体。如果您需要保存客户的姓名、客户的眼睛颜色、客户的电子邮件等等,那么您肯定会有一个customer实体。

如果你看到实体以某种方式联系在一起,那么你就有了一种关系,你应该问自己这些实体形成了什么样的关系。就你们的产品和客户而言,我们之间有采购关系。已建立的关系是购买(或订单,您称之为订单)。一个客户可以购买不同的产品,而一个产品(不在同一货架上,是型号,型号)可以为多个客户购买,因此,我们有一个多对多的关系。

创建的关系会根据上下文发生变化。无论如何,我们将在这里发明一些疯狂的东西作为例子。假设我们有客户和产品。假设你想要保持客户舔产品的情况(一些非常疯狂的事情,只是为了让你看看上下文是如何说明关系的)。

在客户和产品实体之间会有一种密切的联系(真的很接近...我认为...)。在这种情况下,该关系表示客户使用产品的历史记录。这将生成一个事件。在这种情况下,您可以将日期、客户点击适当产品的次数、天气、时间、街道上的红绿灯颜色等属性放入,仅根据您的上下文和需求来确定您需要坚持的内容。

请记住,对于创建的N-N关系,我们需要查看是否会出现新的实体(关系之外)。当您将概念模型分解为逻辑模型时,通常会发生这种情况。可能,产品订单将生成两个实体:订单和订单的产品。您可以将从每个客户订购的产品列表和数量放在订单的产品中。

我想介绍各种资料来研究ERD,但不幸的是,它们都是葡萄牙语。我希望我在某些方面对你有所帮助。如果你想更具体地说明你的问题,我想我真的能最好地帮助你。有什么事,请提出来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35391046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档