我需要制作滑雪设备租赁的 ER 图和关系模式。我有一个Customer
,Rental
作为Ski
一个实体以及它们的属性。Customers
并且Rentals
应该是一对多的关系,和之间的关系Rentals
应该Ski
是多对多的(一个出租可以有很多滑雪板,一个滑雪板可以租给很多客户)。当我对如何制作关系模式进行一些研究时,我发现必须制作Rentals_skis
包含来自Rentals
和的外键的联结表Ski
。联结表需要加主键吗?Rentals_skis
另外,我应该在我的 ER 图中添加新实体吗?
这是我使用 Dia 制作的图表的链接。
关系模式: https: //imgur.com/a/taRFbdb
ER图: https: //imgur.com/a/EmdQlkN
每个表都应该定义一个主键,以遵循良好的数据库设计。没有表是非规范化的标志。在您的情况下,联结表的主键
Rental_skis
是自然的,并且将在 上定义(rental_id, ski_id)
,在这种情况下是每个外键字段的组合。因为相同的东西不可能ski_id
存在rental_id
不止一次。请注意,通过实施此联结表,您将不再需要将字段
ski_id
直接存储在Rentals
表中,并且应该从您的设计中的该表中删除该列。我会这么认为。
不,“Rental_skis”不是强制性的,它实际上是相反的。这将是问题的根源。ER 图在这种情况下更正确,不需要更新。
已经
Rentals
是联结表。它已经有两个外键:customer_id
和ski_id
。他们完全回答了“此时此刻谁租了哪个滑雪板?”的问题。如果您按照显示的模式(带有
Rentals_skis
),那么您可能会遇到一种情况,即ski_id
指向Rentals
一个滑雪板,而ski_id
指向Rentals_skis
另一个滑雪板。在这种情况下,哪一个是正确的?这位顾客租的是哪款滑雪板?是的,
Rentals
需要有一个主键。你可以去rental_id
,是的。但最好使用复合键:customer_id, start_date
或ski_id, start_date
. 这里的区别只是观点:更重要的是客户还是滑雪。