Соотношение «многие ко многим» - дизайн таблицы пересечений - PullRequest
22 голосов
/ 10 июня 2009

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

Два подхода, которые я рассматриваю:

CREATE TABLE SomeIntersection 
(
     IntersectionId UNIQUEIDENTIFIER PRIMARY KEY,
     TableAId UNIQUEIDENTIFIER REFERENCES TableA NOT NULL,
     TableBId UNIQUEIDENTIFIER REFERENCES TableB NOT NULL,
     CONSTRAINT IX_Intersection UNIQUE(TableAId, TableBId )
) 

или

CREATE TABLE SomeIntersection 
(
     TableAId UNIQUEIDENTIFIER REFERENCES TableA NOT NULL,
     TableBId UNIQUEIDENTIFIER REFERENCES TableB NOT NULL,
     PRIMARY KEY(TableAId, TableBId )
) 

Есть ли преимущества одного над другим?
РЕДАКТИРОВАТЬ 2: **** Обратите внимание: Я планирую использовать Entity Framework для предоставления API для базы данных. Имея это в виду, одно решение работает лучше с EF, чем другое?

РЕДАКТИРОВАНИЕ: В связанной заметке для таблицы пересечений, в которой два столбца ссылаются на одну и ту же таблицу (пример ниже), есть ли способ сделать два поля в записи разными?

CREATE TABLE SomeIntersection 
(
     ParentRecord INT REFERENCES TableA NOT NULL,
     ChildRecord INT REFERENCES TableA NOT NULL,
     PRIMARY KEY(TableAId, TableBId )
)

Я хочу предотвратить следующее

ParentRecord          ChildRecord
=================================
      1                    1         --Cyclical reference! 

Ответы [ 11 ]

0 голосов
/ 11 июня 2009

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

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