2011-03-10 114 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);