2011-03-10 117 views
3

我有几个许多人在我的模型很多关系由一个客户端,订阅,一个疗程:如何实现多对多关系?

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

我已经有三张表列出所有的客户,订阅计划和课程。实现多对多关系而不必复制大量数据的最佳方法是什么?

回答

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) 

说明:每个订阅是specificially为一个客户机,所以有1:n的这两个之间的关系。但同一课程可以通过不同的订阅不同的客户预订不止一次,因此课程和订阅之间存在n:m的关系,这通过链接表Subscription_Course解决。

如果您希望在Subscription_Course(SubscriptionID, CourseID)上设置唯一的密钥约束,您可以在该模型上添加其他约束。

1

一个表的ClientIDsubscriptionId另一个表subscriptionIdcourseId

1

常见的方法来存储许多一对多两个表之间是把两个表项第3表格这样

enter image description here

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);