Во-первых, суррогатный ключ - это ключ, который искусственно генерируется в базе данных как уникальное значение для каждой строки в таблице и не зависит от какого-либо другого атрибута в таблице.
Теперь фраза Первичный ключ - это красная сельдь. Является ли ключ первичным или альтернативным, ничего не значит. Важно то, для чего используется ключ. Ключи могут выполнять две функции, которые принципиально несовместимы друг с другом.
- Они в первую очередь там, чтобы обеспечить целостность и согласованность ваших данных! Каждая строка в таблице представляет экземпляр любой сущности, для которой определена таблица, для хранения данных. Нет Суррогатное Ключ, по определение , может когда-либо выполнять эту функцию. Только правильно разработанный натуральный Ключ может сделать это. (Если все, что у вас есть, это суррогатный ключ, вы всегда можете добавить еще одну строку со всеми другими атрибутами, точно идентичными существующей строке, при условии, что вы зададите ей другое значение суррогатного ключа)
- Во-вторых, они служат ссылками (указателями) на внешние ключи в других таблицах, которые являются дочерними объектами объекта в таблице с первичным ключом. Естественный ключ (особенно если он составной из нескольких атрибутов) не является хорошим выбором для этой функции, потому что это будет означать, что A) внешние ключи во всех дочерних таблицах также должны быть составными ключами, что делает их очень широкий, что снижает производительность всех операций с ограничениями и соединений SQL. и B) Если значение ключа изменилось в основной таблице, вам потребуется выполнить каскадные обновления для каждой таблицы, где значение было представлено как FK.
Таким образом, ответ прост ... Всегда (где бы вы ни заботились о целостности / согласованности данных) используйте естественный ключ и, при необходимости, используйте оба! Если естественный ключ является составным, длинным или недостаточно стабильным, добавьте альтернативный суррогатный ключ (например, в виде целого числа с автоинкрементом) для использования в качестве целей FK в дочерних таблицах. Но рискуя потерять согласованность данных вашей таблицы, НЕ удаляйте естественный ключ из основной таблицы.
Чтобы прояснить это, давайте приведем пример.
Скажем, у вас есть таблица с банковскими счетами ... Естественным ключом может быть номер банковского маршрута и номер счета в банке. Чтобы не использовать этот двойной составной ключ в каждой записи транзакции в таблице транзакций, вы можете решить добавить искусственно сгенерированный суррогатный ключ в таблицу BankAccount, которая является просто целым числом. Но тебе лучше сохранить естественный Ключ! Если у вас нет, если у вас нет также составного натурального ключа, вы можете легко получить две строки в таблице следующим образом:
id BankRoutingNumber BankAccountNumber BankBalance
1 12345678932154 9876543210123 $123.12
2 12345678932154 9876543210123 ($3,291.62)
Теперь, какой из них прав?
Как следует из комментариев ниже, что хорошего в том, чтобы вы могли "идентифицировать строку " ?? Мне кажется, что это бесполезно, потому что нам нужно определить, какой банковский счет представляет строка! Идентификация строки важна только для внутренних технических функций базы данных, таких как объединения в запросах, или для операций ограничения FK, которые, если / когда они необходимы, должны в любом случае использовать суррогатный ключ, а не естественный ключ ,
Вы правы в том, что плохой выбор натурального ключа, а иногда даже самый лучший из доступных вариантов выбора натурального ключа, может быть не совсем уникальным или гарантированно предотвратить дублирование. Но любой выбор лучше, чем отсутствие выбора, поскольку он, по крайней мере, предотвратит дублирование строк для тех же значений в атрибутах, выбранных в качестве естественного ключа. Эти проблемы могут быть сведены к минимуму путем соответствующего выбора ключевых атрибутов, но иногда они неизбежны и должны решаться. Но все же лучше сделать это, чем допускать неверные неточные или избыточные данные в базу данных.
Что касается «простоты использования». Если все, что вы используете для использования естественного ключа, - это ограничение вставки дублирующих строк, и вы используете другой, суррогатный ключ в качестве цели для ограничений FK, я не вижу никакой простоты проблем использования.