如何实现多对多关系?

4

我的模型中有几个多对多的关系,包括客户、订阅和课程:

  1. 一个客户可以有零个或多个订阅
  2. 一个订阅允许客户访问一个或多个课程

我已经有了三个表,分别列出所有客户、订阅计划和课程。有什么最佳方法可以实现多对多的关系,而不必重复大量数据?

4个回答

5
使用4个表:
Client  (PK: ClientID)
Subscription (PK: SubscriptionID, FK: ClientID)
Course (PK: CourseID)
Subscription_Course (PK: Subscription_Course, FK: SubscriptionID, CourseID)

PK代表主键,FK代表外键。

以下是关系:

Client -> Subscription (1:n)
Subscription -> Subscription_Course (1:n)
Course -> Subscription_Course (1:n)

解释:每个订阅都是为一个客户特定设计的,因此这两者之间存在1:n的关系。但是同一门课程可以通过不同的订阅被不同的客户多次预订,因此课程和订阅之间存在n:m的关系,这需要通过连接表Subscription_Course来解决。
如果需要,您可以在该模型上添加其他约束条件,例如在Subscription_Course中对(SubscriptionID, CourseID)进行唯一键约束。

4

enter image description here

注意:

ClientSubscriptionNo 是每个客户的订阅号码(1,2,3..); 在为客户创建新订阅时,可以轻松生成它。

select coalesce(max(ClientSubscriptionNo), 0) + 1
from Subscription
where ClientID = the_client_id

你可能会决定或者不决定:

alter table SubscriptionItem
  add constraint uq1_SubscriptionItem unique (ClientID, CourseID);

2

一个包含clientIdsubscriptionId的表格,另一个表格包含subscriptionIdcourseId


1

在两个表之间存储多对多关系的常见方法是将两个表的键放入第三个表中,如下所示

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接