SQL - первичный ключ таблицы «многие ко многим» - PullRequest
117 голосов
/ 03 февраля 2010

Этот вопрос возникает после прочтения комментария к этому вопросу:

Разработка базы данных

При создании таблицы «многие ко многим» следует создать составной первичный ключ для двух столбцов внешнего ключа или создать первичный ключ с автоматическим приращением суррогатного идентификатора «ID» и просто поместить индексы в два столбца FK. (а может быть, уникальное ограничение)? Как влияет на производительность вставка новых записей / переиндексация в каждом случае?

В основном это:

PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)

против. это:

PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)

Комментатор говорит:

делая два идентификатора, PK означает таблица физически отсортирована на диске в этой последовательности. Так что, если мы вставим (Часть 1 / Устройство 1), (Часть 1 / Устройство 2), (Часть 2 / Устройство 3), затем (Часть 1 / Устройство 3) база данных должна будет сломать разложить стол и вставить последний между записями 2 и 3. Для многих записи, это становится очень проблематичным поскольку это предполагает перетасовку сотен, тысячи или миллионы записей каждый раз, когда один добавляется. В отличие от автоинкрементный ПК позволяет новым записи, которые нужно прикрепить до конца.

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

Ответы [ 5 ]

76 голосов
/ 03 февраля 2010

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

Вам не понадобятся индексы для отдельных столбцов, поскольку таблицу следует использовать только для объединения двух ссылочных таблиц.

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

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

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

17 голосов
/ 03 февраля 2010

Для таблиц ссылок не требуется суррогатный ключ.

Один PK включен (col1, col2) и еще один уникальный индекс (col2, col1) - все, что вам нужно

Если вы не используете ORM, который не может справиться и диктует ваш дизайн БД для вас ...

Редактировать: я ответил тоже самое: SQL: Вам нужен автоинкрементный первичный ключ для таблиц Many-Many?

11 голосов
/ 26 ноября 2011

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

, например,

PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
Other Details

Другие детали », используя PartDevice.ID в качестве FK.Таким образом, необходимо использование инкрементного первичного ключа.

6 голосов
/ 03 февраля 2010

Кратчайший и самый прямой способ, которым я могу ответить на ваш вопрос, - это сказать, что это повлияет на производительность, если две таблицы, которые вы связываете, не имеют последовательных первичных ключей.Как вы указали / цитировали, индекс для таблицы ссылок либо станет фрагментированным, либо СУБД будет усерднее работать над вставкой записей, если таблица ссылок не имеет своего собственного последовательного первичного ключа.По этой причине большинство людей ставят последовательно увеличивающийся первичный ключ в таблицы ссылок.

2 голосов
/ 09 июля 2018

Так что, похоже, если ЕДИНСТВЕННАЯ задача состоит в том, чтобы связать две таблицы, лучшим PK будет двухколонный PK.

Но если он служит другим целям, тогда добавьте еще один NDX в качестве PK с внешними ключами и вторым уникальным индексом.

Индекс или PK - лучший способ убедиться в отсутствии дубликатов. PK позволяет таким инструментам, как Microsoft Management Studio, выполнять часть работы (создавать представления) за вас

...