Извините, что сделал это, но я обнаружил, что ответы, которые я дал на связанные вопросы (вы можете проверить this и this ), могут относиться к этому. Я изменил их немного ...
Вы найдете много постов, посвященных этой проблеме, и каждый ваш выбор имеет свои плюсы и минусы. Аргументы для них обычно относятся к теории реляционных баз данных и производительности баз данных.
По этому вопросу моя точка зрения очень проста: суррогатные первичные ключи ВСЕГДА работают , в то время как Естественные ключи НЕ МОГУТ работать ВСЕГДА , и это по нескольким причинам: поле слишком короткое, правила изменены и т. Д.
К этому моменту вы уже догадались, что я в основном являюсь членом команды первичного ключа uniqueIdentifier / surrogate, и даже если я ценю и понимаю аргументы, подобные представленным здесь, я все еще ищу случай, когда «натуральный» ключ лучше суррогатного ...
В дополнение к этому один из наиболее важных, но всегда забываемых аргументов в пользу этого основного правила связан с нормализацией кода и производительностью :
каждый раз, когда я создаю таблицу, теряю ли я время
- с указанием его первичного ключа и физических характеристик (тип, размер)
- помните эти характеристики каждый раз, когда я хочу сослаться на это в своем коде?
- объясните мой выбор ПК другим разработчикам в команде?
Мой ответ - нет на все эти вопросы:
- У меня нет времени терять попытки определить «лучший естественный первичный ключ», когда суррогатный вариант дает мне пуленепробиваемое решение.
- Я не хочу вспоминать, что первичный ключ моей таблицы - это строка длиной 10 символов, когда я пишу код.
- Я не хочу терять время, обсуждая длину Натурального Ключа: «хорошо, если Вам нужно 10, почему бы вам не взять 12 , чтобы быть в безопасности ? ». Этот аргумент "на безопасной стороне" действительно раздражает меня: если вы хотите оставаться на безопасной стороне, это означает, что вы действительно недалеко от небезопасной стороны! Выберите суррогат: это пуленепробиваемый!
Итак, я работал в течение последних пяти лет с очень простым правилом: каждая таблица (назовем ее 'myTable') имеет свое первое поле с именем 'id_MyTable'
, которое имеет тип uniqueIdentifier. Даже если эта таблица поддерживает отношение «многие ко многим», где комбинация полей предлагает очень приемлемый первичный ключ, я предпочитаю создавать это поле 'id_myManyToManyTable'
, являющееся uniqueIdentifier, просто для того, чтобы придерживаться правила, и потому что, наконец, не больно.
Основным преимуществом является то, что вам больше не нужно заботиться об использовании Первичного ключа и / или Внешнего ключа в вашем коде. Когда у вас есть имя таблицы, вы знаете имя и тип ПК. Как только вы узнаете, какие ссылки реализованы в вашей модели данных, вы узнаете имя доступных внешних ключей в таблице.
И если вы все еще хотите, чтобы ваш "Натуральный ключ" находился где-то в вашей таблице, я советую вам создать его в соответствии со стандартной моделью, такой как
Tbl_whatever
id_whatever, unique identifier, primary key
code_whatever, whateverTypeYouWant(whateverLengthYouEstimateTheRightOne), indexed
.....
Где id_ - префикс первичного ключа, а code_ используется для «естественного» индексированного поля. Некоторые утверждают, что поле code_ должно быть уникальным. Это действительно так, и им легко управлять либо с помощью DDL, либо с помощью внешнего кода. Обратите внимание, что многие «натуральные» ключи рассчитываются (номера счетов), поэтому они уже сгенерированы с помощью кода
Я не уверен, что мое правило лучшее. Но это очень эффективный! Если бы все применяли его, мы бы, например, избежали потерянного времени, отвечая на подобные вопросы!