Подтвердить что ты не робот

MS SQL создает отношение "многие ко многим" к таблице соединений

Я использую Microsoft SQL Server Management Studio и, создавая таблицу соединений, должен ли я создать столбец идентификатора для таблицы соединений, если это так, я также должен сделать его первичным ключом и столбцом идентификации? Или просто сохранить 2 столбца для таблиц, к которым я присоединяюсь в отношении "многие ко многим"?

Например, если это будет много-много таблиц:

MOVIE
Movie_ID
Name
etc...

CATEGORY
Category_ID
Name
etc...

Должен ли я сделать таблицу соединений:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Movie_Category_Junction_ID

[и сделайте Movie_Category_Junction_ID мой основной ключ и используйте его как колонку Identity)?

Или:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID

[и просто оставьте это при отсутствии первичного ключа или таблицы идентификации]?

4b9b3361

Ответ 1

Я бы использовал вторую таблицу соединений:

MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID

Первичным ключом будет комбинация обоих столбцов. У вас также будет внешний ключ из каждого столбца в таблицу Movie и Category.

Таблица соединений будет выглядеть примерно так:

create table movie_category_junction
(
  movie_id int,
  category_id int,
  CONSTRAINT movie_cat_pk PRIMARY KEY (movie_id, category_id),
  CONSTRAINT FK_movie 
      FOREIGN KEY (movie_id) REFERENCES movie (movie_id),
  CONSTRAINT FK_category 
      FOREIGN KEY (category_id) REFERENCES category (category_id)
);

См. SQL Fiddle with Demo.

Использование этих двух полей в качестве PRIMARY KEY предотвратит добавление дубликатов комбинаций фильмов и категорий в таблицу.

Ответ 2

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

Примером является много-ко-многим между журналами и подписчиками. Действительно, эта ссылка является подпиской со своими атрибутами, такими как дата истечения срока действия, статус оплаты и т.д.

Тем не менее, я думаю, что иногда связующая таблица является просто связующей таблицей. Хорошим примером этого является отношение многих ко многим к категории.

Таким образом, в этом случае отдельный первичный ключ одного поля не требуется. У вас может быть ключ авто-назначения, который ничего не повредит, и облегчит удаление определенных записей. Это может быть хорошо, как общая практика, поэтому, если таблица позже превратится в значительную таблицу со своими собственными значимыми данными (в виде подписки), она уже будет иметь первичный ключ автоматического назначения.

Вы можете поместить уникальный индекс в два поля, чтобы избежать дублирования. Это даже предотвратит дублирование, если у вас есть отдельный ключ автоматического назначения. Вы можете использовать оба поля в качестве основного ключа (который также является уникальным индексом).

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

Но для чего-то вроде того, что вы делаете, вы, вероятно, будете в порядке с двумя полями. Я бы порекомендовал либо сделать два поля составным первичным ключом, либо хотя бы поместить уникальный индекс в два поля.

Ответ 3

Я бы пошел со второй таблицей. Но сделайте эти два поля первичными. Это ограничит повторяющиеся записи.