Основной вопрос - PullRequest
       5

Основной вопрос

4 голосов
/ 29 июля 2010

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

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

Есть ли у этого недостатки? Есть ли у меня веская причина добавить третий столбец, который сам по себе уникален?

Ответы [ 12 ]

9 голосов
/ 29 июля 2010

Орехи нормализации базы данных скажут вам одну вещь.

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

Это из "траншей"разработчик.

3 голосов
/ 29 июля 2010

Если вы кодер, и база данных для вас - не что иное, как прославленное хранилище объектов, тогда, конечно же, во что бы то ни стало вводите суррогатные ключи. На самом деле, сделайте это лучше и просто делегируйте всю схему БД и взаимодействие с БД своему любимому ORM и покончите с этим. В самом деле, когда я хочу магазин объектов малого или среднего масштаба, это именно то, что я делаю.

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

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

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

Итак, в заключение:

  1. Если БД используется только как хранилище объектов: пусть ORM беспокоится об идентичности объекта, и почти наверняка должен быть суррогатный ключ.

  2. Если БД используется в качестве базы данных: введение суррогатного ключа является решением технического проектирования с серьезными компромиссами в обоих направлениях. Решение должно приниматься в каждом конкретном случае с полным признанием результирующих затрат, которые должны быть приняты в обмен на выгоды, полученные в любом случае.

Обновление

«Удобство» суррогатного ключа - это просто способность разбираться в вопросе идентичности. Это часто необходимо в базе данных и разумно на уровне кэширования, насколько я позволю, но помимо этого это приводит к хрупкому дизайну данных. Проблема в том, что личность - это не то, что имеет один правильный ответ. Для нетривиальных систем с интенсивным использованием данных вам, как правило, придется работать в терминах классов эквивалентности , а не в качестве эталонного идентификатора, объектно-ориентированное программирование заставляет нас думать, что normal .

Что на самом деле сводится к осознанию того, что вся концепция «первичного ключа» - это выдумка, изобретенная для того, чтобы помочь реляционной модели работать эффективно; но принятие суррогатного ключа цементирует эту выдумку и делает всю систему хрупкой и негибкой. Бизнес-логика должна быть в состоянии предоставить свои собственные определения равенства - иногда четыре копии одного и того же файла должны рассматриваться как четыре файла , иногда они должны считаться неотличимыми от оригинала файл ; когда вы редактируете один из них, это новый файл ? тот же файл ? Ответ на оба вопроса, конечно, да, когда ... Работа с естественными ключами обеспечивает эту критическую способность работать в терминах концептуальных классов эквивалентности. Если вы позволите суррогатным ключам заражать вашу бизнес-логику, вы быстро потеряете это.

3 голосов
/ 29 июля 2010

Ключи одного столбца просты в написании, просты в обслуживании и понятны.

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

Но если вы не смотрите на крайние случаи, оптимизация для "простых" часто является лучшим способом.

2 голосов
/ 29 июля 2010

Есть ли преимущество в использовании первичного ключа из одного столбца по сравнению с первичным ключом composit [sic]?

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

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

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

Есть ли у этого недостатки? Есть ли веская причина для меня добавить третий столбец, который сам по себе уникален?

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

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

2 голосов
/ 29 июля 2010

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

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

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

1 голос
/ 29 июля 2010

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

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

0 голосов
/ 30 июля 2010

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

0 голосов
/ 29 июля 2010

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

0 голосов
/ 29 июля 2010

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

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

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

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

0 голосов
/ 29 июля 2010

Представьте, что у вас есть составной первичный ключ (например, field1 и field2) вместо одного автоинкрементного идентификатора. Требования клиентов очень изменчивы, и после некоторой разработки клиент говорит, что field2 не является обязательным и может быть обнуляемым, его невозможно продолжить в качестве первичного ключа таблицы. Представьте, что эта таблица является одной из самых важных в вашей модели. Затем все внешние ключи должны быть изменены, если поле 2 не может быть в составном первичном ключе. Это кошмарная смена первичного ключа во всей модели.

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

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