如何实现多对多的关系?

时间:2011-03-10 12:44:04

标签: database database-design many-to-many

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

  1. 客户有零个或多个订阅
  2. 订阅允许客户端访问一个或多个     课程
  3. 我已经有三张表列出了所有客户,订阅计划和课程。在不必复制大量数据的情况下,实现多对多关系的最佳方法是什么?

4 个答案:

答案 0 :(得分:4)

使用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解决。

如果需要,您可以在该模型上添加其他约束,例如,在(SubscriptionID, CourseID)的{​​{1}}上添加唯一键约束。

答案 1 :(得分: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 :(得分:1)

一个表 clientId subscriptionId ,另一个表 subscriptionId courseId

答案 3 :(得分:1)

在两个表之间存储多对多的常用方法是将两个表中的键放到第三个表中

enter image description here