2011-03-10 3 views
3

J'ai plusieurs beaucoup à de nombreuses relations dans mon modèle composé d'un client, un abonnement, un cours:Comment implémenter plusieurs plusieurs à plusieurs relations?

  1. Un client a zéro ou plusieurs abonnements
  2. Un abonnement permet au client d'accéder à un ou plusieurs cours

J'ai déjà trois tables qui listent tous les clients, les plans d'abonnement et les cours. Quelle serait la meilleure méthode pour mettre en œuvre les relations plusieurs-à-plusieurs sans avoir à dupliquer beaucoup de données?

Répondre

4

Utilisation 4 tables:

Client (PK: ClientID) 
Subscription (PK: SubscriptionID, FK: ClientID) 
Course (PK: CourseID) 
Subscription_Course (PK: Subscription_Course, FK: SubscriptionID, CourseID) 

PK = clé primaire, FK = clé étrangère.

Voici les relations:

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

Explication: chaque abonnement est specificially pour un client, donc il y a une relation 1: n entre les deux. Mais le même cours peut être réservé plus d'une fois par différents clients via différents abonnements, il y a donc une relation n: m entre les cours et les abonnements, qui est résolue par une table de liens Subscription_Course.

Vous pouvez ajouter des contraintes supplémentaires sur ce modèle si vous souhaitez, par exemple, mettre une contrainte de clé unique sur (SubscriptionID, CourseID) dans Subscription_Course.

1

Une table avec clientId, SubscriptionID et une autre table avec SubscriptionID et courseid

1

approche commune pour stocker un grand nombre à plusieurs entre deux tables est de mettre les clés des deux tables à la troisième table comme celui-ci

enter image description here

4

enter image description here

Remarque:

ClientSubscriptionNo est un numéro d'abonnement pour chaque client (1,2,3 ..); il peut être facilement généré lors de la création d'un nouvel abonnement pour un client en utilisant

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

Vous pouvez ou ne pouvez pas décider de:

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