Я понимаю одно преимущество суррогатных / искусственных ключей в целом - они не меняются, и это может быть очень удобно. Это верно независимо от того, являются ли они одним или несколькими полями - если они «искусственные».
Однако иногда кажется, что политикой является использование целочисленного поля с автоинкрементом в качестве первичного ключа каждой таблицы. Всегда ли лучше иметь такой однополевый ключ и почему (или почему нет)?
Чтобы быть ясным, этот вопрос не об искусственном против естественного - а о том, все ли искусственные ключи должны быть однополевыми
database-design
primary-key
surrogate-key
Джек Дуглас
источник
источник
Ответы:
Я собираюсь сказать нет, не всегда, но в большинстве случаев да. ,
Вот некоторые обстоятельства, при которых вам не нужен суррогатный или искусственный ключ:
таблица с уникальным бизнес-ключом, который внешне привязан к вашему
бизнесу и у которого нет никаких шансов когда-либо измениться для каких-либо
практических целей, то прямое использование бизнес-ключа может упростить
ситуацию. Примером может быть список
кодов штатов или провинций или список стандартных номеров ANSI и т. Д.
Есть также некоторые ситуации, в которых старый верный монотонно увеличивающийся суррогатный ключ не идеален. Вы можете иметь ключи, которые являются буквенно-цифровыми суррогатами. Они могут включать в себя:
Почему в большинстве случаев да? Самый фундаментальный ответ на этот вопрос заключается в том, что это ад, если вам когда-нибудь понадобится изменить значение первичного ключа в любой таблице. Поскольку почти все, что пользователь может увидеть или потрогать, возможно, в какой-то момент подлежит обновлению, использование видимого значения ключа - это настоящий ад. Использование суррогатного ключа не даст вам попасть в эту ловушку.
Сказав это, помните, что для YAGNI есть место для применения этой концепции. Вам не нужно вводить кодовые таблицы с ключами IDENTITY в каждый закоулок вашей схемы, на тот случай, если кто-то решит, что символ мужского пола в вашей таблице сотрудников должен измениться с M на X или что-то глупое.
источник
Нет.
Я бы сказал, что, безусловно, есть случаи, когда ключи с одним полем уступают составным ключам, по крайней мере, для внешних ключей . Это не означает, что вы не должны иметь суррогатный ключ с одним полем, если вы предпочитаете, но я лично предпочитаю, чтобы ключ, который чаще всего используется в качестве цели внешнего ключа, назывался первичным ключом.
Я попытаюсь проиллюстрировать мою точку зрения в следующих примерах, в которых:
brand
автомобиль марки, например, Ford, Toyota и т. д.dealer
является физическим дилером, привязанным к бренду (например, дилерский центр Ford, продающий только Форды)model
это тип автомобиля, например, Ford Focus, Ford Fiesta и т. д.stock
текущее количество автомобилей для каждого автосалонаЕсли мы создадим суррогатный ключ для одного поля для
dealer
иmodel
следующим образом:тогда можно вставить строку
stock
, связывающую «Фордdealer
» с моделью «Тойота». Добавлениеbrand_id references brand
кstock
только усугубляет проблему. С другой стороны, если мы сохраним внешний ключ как часть первичного ключа следующим образом:Теперь правило о том, что дилеры «Форда» могут покупать только автомобили «Форда», естественным образом обеспечивается моделью.
Обратите внимание, что в примере «составные ключи»
dealer_id
могут быть или не быть уникальными в соответствии с предпочтениями. Он не обязательно должен быть уникальным (то есть альтернативным ключом), но очень мало теряется при его создании (возможно, немного места для хранения), и это может быть очень удобно, так я обычно его настраиваю, например:источник
"это зависит"
Да: суррогатные поля IDENTITY / AUTONUMBER хороши, когда натуральный ключ широкий и не числовой. Примечание: это предполагает смешение «PK» и кластерного индекса, которое происходит по умолчанию в SQL Server, Sybase и т. Д.
Нет: много / много таблиц, когда достаточно 2 родительских ключей. Или когда натуральный ключ короткой и фиксированной длины, например, код валюты
Конечно, мозговой мертвец ORM (читай: (n) Hibernate) может превзойти эти правила ...
Изменить: чтение вопроса снова
Таблица много / много с двумя суррогатными родительскими ключами будет иметь несколько столбцов PK.
Однако, это не нуждается в другой суррогатной колонке.
Если в таблице есть суррогатный ключ (IDENTITY и т. Д.), То он не обязательно должен содержать несколько столбцов.
У вас может быть супер-ключ, который включает суррогат, но это будет обеспечивать применение других правил (например, подтипов )
источник