Дизайн таблицы ссылок «многие ко многим»: только два внешних ключа или дополнительный первичный ключ? - PullRequest
6 голосов
/ 21 сентября 2010

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

Просмотр различных диаграмм северного ветрабазы данных, например, я сталкивался с обеими «версиями».То есть: таблица OrderDetails с fkProductID и fkOrderID, а также версии с добавленным OrderDetailsID.

В чем разница?(это также зависит от двигателя БД?).Каковы преимущества / недостатки SQL (или Linq)?

Заранее спасибо за объяснение.

Том

Ответы [ 2 ]

9 голосов
/ 21 сентября 2010

ORM предписывают использование несоставных первичных ключей для упрощения запросов ...

Но это делает запросы проще ...

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

Но составные ключи сложны ...

В этом примере ограничение первичного ключа гарантирует, что два столбца - fkProductID и fkOrderID - будут уникальными и проиндексированными (большинство БД в наши дни автоматически индексируют первичные ключи, если кластерный индекс еще не существует), используя лучший индексможно за столом.

Подход одиночного первичного ключа означает, что OrderDetailsID индексируется с наилучшим индексом для таблицы (SQL Server и MySQL называют их кластерными индексами, для Oracle они все являются просто индексами) и требуют дополнительного составногоуникальное ограничение / индекс.Для некоторых баз данных может потребоваться дополнительная индексация, выходящая за пределы уникального ограничения ... Таким образом, это делает модель данных более сложной / сложной и бесполезной:

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

Заключение

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

3 голосов
/ 21 сентября 2010

Я привык использовать столбец PrimaryKey.Это потому, что первичный ключ однозначно идентифицирует запись.Если у вас есть настройки каскадного обновления для табличных отношений, значения внешних ключей можно изменить между командами «SELECT» и «UPDATE / DELETE», отправленными из приложения.

...