Как реализовать множественные отношения «многие ко многим»? - PullRequest
3 голосов
/ 10 марта 2011

У меня есть несколько много ко многим отношениям в моей модели, состоящей из клиента, подписки, курса:

  1. Клиент имеет ноль или более подписок
  2. Подписка позволяетклиент для доступа к одному или нескольким курсам

У меня уже есть три таблицы, в которых перечислены все клиенты, планы подписки и курсы.Каков наилучший метод для реализации отношений «многие ко многим» без дублирования большого количества данных?

Ответы [ 4 ]

4 голосов
/ 10 марта 2011

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);
4 голосов
/ 10 марта 2011

Используйте 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) в Subscription_Course.

1 голос
/ 10 марта 2011

Общий подход для хранения множества ко многим между двумя таблицами состоит в том, чтобы поместить ключи из обеих таблиц в третью таблицу следующим образом

enter image description here

1 голос
/ 10 марта 2011

Одна таблица с clientId , subscriptionId и другая таблица с subscriptionId и courseId

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...