Имеет ли таблица соединений (таблица ассоциаций) первичный ключ? отношения многие ко многим - PullRequest
5 голосов
/ 22 июня 2010

Имеет ли таблица соединения (таблица ассоциации) первичный ключ?отношения многие ко многим.Я видел несколько таблиц соединений с первичным ключом, а некоторые без них, может кто-нибудь объяснить, когда у вас есть первичный ключ в таблице соединений и почему?

Заранее спасибо; -)

Ответы [ 4 ]

6 голосов
/ 22 июня 2010

В чистой таблице соединений или соединений все поля будут частью первичного ключа. Например, давайте рассмотрим следующие таблицы:

CREATE TABLE USERS
  (ID_USER NUMBER PRIMARY KEY,
   FIRST_NAME VARCHAR2(32),
   LAST_NAME VARCHAR2(32));

CREATE TABLE ATTRIBUTES
  (ID_ATTRIBUTE NUMBER PRIMARY KEY,
   ATTRIBUTE_NAME  VARCHAR2(64));

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

CREATE TABLE USER_ATTRIBUTES
  (ID_USER NUMBER REFERENCES USERS(ID_USER),
   ID_ATTRIBUTE NUMBER REFERENCES ATTRIBUTES(ID_ATTRIBUTE),
   PRIMARY KEY(ID_USER, ID_ATTRIBUTE));

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

Делись и наслаждайся.

4 голосов
/ 22 июня 2010

Все таблицы должны иметь первичный ключ.: -)

Вы можете использовать либо составной внешний ключ, либо слепой целочисленный ключ.

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

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

0 голосов
/ 22 июня 2010

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

Рассмотрим этот пример из Джо Селко :

CREATE TABLE Couples
(boy_name INTEGER NOT NULL UNIQUE -- nested key
REFERENCES Boys (boy_name),
girl_name INTEGER NOT NULL UNIQUE -- nested key,
REFERENCES Girls(girl_name),
PRIMARY KEY(boy_name, girl_name)); -- compound key

Таблица «Пары» позволяет вставлять эти строки из исходного набора:

('Joe Celko', 'Brooke Shields')
('Alec Baldwin', 'Kim Bassinger')

Подумайте об этом столе на минуту.PRIMARY KEY теперь избыточен.Если каждый мальчик появляется только один раз в таблице, а каждая девушка появляется только один раз в таблице, то каждая пара (boy_name, girl_name) может появляться только один раз.

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

Продукты и теория SQL не всегда совпадают.Многие продукты предполагают, что PRIMARY KEY каким-то образом является особенным в модели данных и будет являться способом доступа к таблице большую часть времени.

... ОДНАКО я подозреваю, что вы задаете вопросподразумевает что-то вроде: «Предполагая, что я такой человек, который избегает естественных ключей в пользу искусственных идентификаторов, я должен добавить искусственный идентификатор к таблице, которая полностью состоит из искусственных идентификаторов, на которые ссылаются другие таблицы?»

0 голосов
/ 22 июня 2010

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

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

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