Почему единственный первичный ключ лучше, чем составные ключи?

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

Править

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

EDIT2 проверьте эту ссылку также. Я становлюсь все более смущенным этим thing:---Составные первичные ключи по сравнению с полем ID уникального объекта

От вышеупомянутого link:-

*первичный ключ должен быть постоянным и бессмысленным; несуррогатные ключи обычно приводят одно или оба требования к сбою в конечном счете

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

Возьмите простой, типичный пример: таблица Предметов хранения. Может быть заманчиво сделать номер изделия (число SKU, штрихкод, код части, или безотносительно) первичным ключом, но затем год спустя все изменение номеров изделия и Вас оставляют с очень грязной update-the-whole-database проблемой...

Править: существует дополнительная проблема, которая более практична, чем философский. Во многих случаях Вы собираетесь найти конкретную строку так или иначе, затем более позднее обновление это или найти его снова (или оба). С составными ключами существует больше данных, чтобы отслеживать и больше ограничений в операторе Where для перенаходки или обновления (или удалить). Также возможно, что один из ключевых сегментов, возможно, изменился тем временем!. С суррогатным ключом всегда существует только одно значение для сохранения (суррогатный идентификатор) и по определению, это не может измениться, который значительно упрощает ситуацию.*

20
задан Mohit Jain 22 July 2017 в 18:40
поделиться

9 ответов

Я не думаю, что существует общее заявление о том, что вам следует использовать только один первичный ключ с именем id.

Большинство людей используют суррогатный первичный ключ в качестве автоматически генерируемого int, потому что он изолирует первичный ключ от необходимости его изменения, например, если вы сделаете PK именем пользователя, а они позже изменили свое официальное имя. Вам нужно будет обновить столбцы PK и все столбцы FK, чтобы отразить новое имя. если вы использовали суррогатный первичный ключ, вы просто обновляете имя пользователя в одном месте (потому что таблицы соединяются по int, а не по имени).

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

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

24
ответ дан 29 November 2019 в 23:02
поделиться

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

Как правило, я использую сгенерированные идентификаторы для сущностей и составные ключи для отношений.

8
ответ дан 29 November 2019 в 23:02
поделиться

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

Традиционная теория реляционных баз данных в основном имеет дело с «естественными» ключами (теми, которые имеют значение с точки зрения бизнес-области), и в этом сценарии часто встречаются составные ключи ... естественно.

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

0
ответ дан 29 November 2019 в 23:02
поделиться
  1. Для ORM проще использовать один идентифицирующий столбец с постоянным именем, например table_id, чем составной ключ . Но каждая хорошая ORM поддерживает составные ключи .

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

  3. Простой PK также проще использовать в запросах . Когда вам нужно присоединиться, вы должны использовать только один столбец обоих отношений .

Это не означает, что простые ПК лучше составных.

1
ответ дан 29 November 2019 в 23:02
поделиться

Объекты в объектно-ориентированном программировании идентичны независимо от их содержимого. Строки (кортежи) в реляционных базах данных идентифицируются только по их содержимому. Поэтому, когда действительно выполняется ORM, то есть сопоставление объектов из объектно-ориентированного языка программирования в реляционной базе данных, необходимо предоставить дополнительный идентификатор, отличный от полей и / или свойств, которые объект имеет в программе - если только один или несколько из них не являются как-то известно, чтобы однозначно идентифицировать объекты.

0
ответ дан 29 November 2019 в 23:02
поделиться

Ну, в основном речь идет о том, чтобы СОЕДИНЕНИЯ оставались простыми - какой из них проще понять:

SELECT
   p.ID, p.Name, p.City,
   c.ID, c.Country, c.ISOCode
FROM
   dbo.Parent p
INNER JOIN
   dbo.Child c on c.ParentID = p.ID

или

SELECT
   p.ID, p.Name, p.City,
   c.ID, c.Country, c.ISOCode
FROM
   dbo.Parent p
INNER JOIN
   dbo.Child c ON c.ParentName = p.Name
     AND c.ParentCity = p.City
     AND c.ParentCountry = p.Country

Если у вас есть составные первичные ключи, любой присоединяющийся в вашу таблицу из дочерней таблицы должны «перетаскивать» все эти столбцы, и все эти столбцы также будут присутствовать в дочерней таблице, а операторы JOIN довольно беспорядочные. Намного лучше иметь единственный (даже суррогатный) ключ для JOIN!

5
ответ дан 29 November 2019 в 23:02
поделиться

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

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

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

2
ответ дан 29 November 2019 в 23:02
поделиться

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

SELECT
    emp.Name,
    emp.UserDomain,
    emp.UserID
FROM
    employee emp
WHERE
    ???? IN (SELECT e.UserDomain, e.UserID FROM ... /* some complex 
                                                       non-correlated subquery 
                                                       or CTE */
            )

Конечно, всегда есть обходные пути, но иногда это может раздражать.

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

13
ответ дан 29 November 2019 в 23:02
поделиться

Я работал над приложением с первичным ключом из 11 столбцов. Всегда было очень весело набирать список снова и снова, каждый раз, когда я хотел гарантировать, что обновляю одну строку.Это был драйвер ошибок, MS-Access не мог справиться с более чем 10 столбцами в PK и т. Д.

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

3
ответ дан 29 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: