这是关于在我的课程中绘制ERD的问题:
一家本地创业公司正在考虑推出新的一站Jungle 在线电子商务网站。
因为他们在设计和实施方面经验很少 数据库,他们已经要求您帮助他们设计数据库 跟踪他们的运作。
Jungle将销售一系列产品,他们需要跟踪 信息,如每个的名称和价格。以出售为 尽可能多的产品,Jungle想显示简短的评论 与项目列表一起。为了节省空间,丛林只会保留 跟踪每种产品的三个最新评论。当然,如果 一个项目是新的(或只是不受欢迎),它可能少于三个 评论存储。
每次客户在Jungle上购买东西时,他们的详细信息都将是 存储以供将来访问。 Jungle收集的详细信息包括 客户的姓名,地址和电话号码。客户应该购买 丛林上的多个项目,他们的细节可以在将来重复使用 交易。
为了最大限度地方便,Jungle还想记录信用卡 其用户的信息。存储的详细信息包括帐户和BSB 数字。当客户在Jungle上购买信用卡时 然后将used链接到事务。每个客户都可以链接到 一张或多张信用卡。但是,正如一些用户不希望的那样 他们的信用卡详细信息记录,客户也可能链接 没有信用卡。对于此类交易,仅限客户和产品 将被记录。
问题在于Buys操作与其他3个实体连接:产品,客户和卡。我发现这很难阅读和理解。
涉及生产中常见的2个以上实体的行动?如果是,我应该如何理解和使用它?或者如果不是,那么设计这个问题的更好方法是什么?
答案 0 :(得分:1)
虽然实践中的大部分关系是二元关系,但三元和更高的关系是实体关系模型的正常元素。一些示例是supplies (supplier_id, product_id, region_id)
或enrolled (student_id, course_id, semester_id)
。但是,由于不喜欢复合键或者只支持有向二进制关系的网络数据模型混淆,它们通常会通过引入代理标识符转换为实体集。
阅读关于非二元关系的基数指标是混淆的常见原因。有关我如何处理此问题的详细信息,请参阅我对designing relationship between vehicle,customer and workshop in erd diagram的回答。
您的解决方案存在一些问题。首先,Buys
表示为关联实体,但与具有可选角色的三元关系一样使用。在我看来,两者都不正确。有关ER模型中关联实体的解释,请参阅我对When to use Associative entities?的回答。
将购买交易建模为关系通常是一个错误,因为关系是由它们所关联的实体(关键字)来识别的。如果(CustomerID, ProductID)
正在识别,则客户只能购买一次产品,每次交易只能购买一种产品。在关系的关键字中添加日期/时间会更好,但仍然存在问题。添加代理标识符并将其转换为常规实体集几乎肯定是最好的行动方式。
其次,Crow的基数指标尚不清楚。看起来客户和产品在Buys
关系中是可选的,或者甚至好像多个客户可能参与同一个交易。这里涉及三个不同的概念 - 选择性,参与性和基数 - 最好以不同的方式表示。有关该主题的更多信息,请参阅我对is optionality (mandatory, optional) and participation (total, partial) are same?的回答。
购买交易的卡是可选的。从描述中可以看出,卡片可能完全参与,这意味着我们不会存储有关卡片的信息,除非它在交易中使用。此外,每张交易只能使用一张卡片。
购买交易需要客户,听起来客户可能完全参与,这意味着我们不会存储有关客户的信息,除非他们购买了某些东西。每个交易只能与一个客户相关。
购买交易需要产品,并且由于我们会在购买产品之前提供产品,因此产品将部分参与交易。但是,多个产品可能与每笔交易相关。
我会用以下结构代表此问题的交易:
我并不是说将三元或更高的关系转换为实体集总是正确的做法,但在这种情况下它是。
从物理上讲,这需要两个表来表示(不计算客户,产品,卡或ProductReview),因为我们可以将TransactionCustomer和TransactionCard非规范化为Transaction,但TransactionProduct是一个多对多关系,需要自己的表(如做三元和更高的关系。)
Transaction (TransactionID PK, TransactionDateTime, CustomerID, CardID nullable)
TransactionProduct (TransactionID PK, ProductID PK, Quantity, Price)