Ни SQL, ни реляционная модель не нарушаются внешними ключами, которые ссылаются на естественный ключ. Фактически, ссылки на естественные ключи часто значительно улучшают производительность. Вы будете удивлены, как часто нужная вам информация полностью содержится в естественном ключе; ссылка на этот ключ меняет объединение на более широкую таблицу (и, следовательно, уменьшает количество строк, которые можно сохранить на одной странице).
По определению необходимая информация всегда полностью содержится в естественном ключе каждой таблицы «поиска». (Термин таблица поиска является неформальным. В реляционной модели все таблицы являются просто таблицами. Таблица почтовых индексов США может иметь строки, которые выглядят следующим образом: {AK, Аляска}, {AL, Алабама}, {AZ, Аризона} и т. д. Большинство людей называют это справочной таблицей.)
В больших системах нередко можно найти таблицы, которые имеют более одного ключа-кандидата. Также нередки случаи, когда таблицы, обслуживающие одну часть предприятия, ссылаются на один ключ-кандидат, и таблицы, обслуживающие другую часть предприятия, ссылаются на другой ключ-кандидат. Это одна из сильных сторон реляционной модели, и она является частью реляционной модели, которую SQL поддерживает довольно хорошо.
Вы столкнетесь с двумя проблемами, когда будете ссылаться на естественные ключи в таблицах, которые также имеют суррогатный ключ.
Во-первых, вы удивите людей. Хотя я обычно настоятельно лоббирую принцип наименьшего сюрприза , это одна из ситуаций, когда я не против удивлять людей. Когда проблема заключается в том, что разработчики удивляются логическому использованию внешних ключей, решение - это обучение, а не редизайн.
Во-вторых, ORM обычно не разработаны вокруг реляционной модели, и они иногда воплощают предположения, которые не отражают лучшую практику. (На самом деле, они часто кажутся разработанными без участия специалиста по базам данных.) Требование идентификационного номера в каждой таблице является одним из таких предположений. Другой предполагает, что приложение ORM «владеет» базой данных. (Таким образом, можно свободно создавать, удалять и переименовывать таблицы и столбцы.)
Я работал над системой баз данных, которая в течение 30 лет обслуживала сотни прикладных программ, написанных как минимум на двух десятках языков. Эта база данных принадлежит предприятию, а не ORM.
Вилка, которая вносит критические изменения, должна быть шоу-стопором.
Я измерял производительность с помощью как естественных, так и суррогатных ключей в компании, в которой работал. Есть переломный момент, когда суррогатные ключи начинают превосходить естественные ключи. (При условии отсутствия дополнительных усилий для поддержания высокой производительности естественных ключей, таких как разбиение на разделы, частичные индексы, индексы на основе функций, дополнительные табличные пространства, использование твердотельных дисков и т. Д.) По моим оценкам для этой компании, они достигнут этой переломной точки в около 2045 года. Тем временем они получают лучшую производительность с естественными ключами.
Другие соответствующие ответы: в схеме базы данных сбивает с толку
Если вы не знаете ответ, иди с суррогатом. Вот почему - если сделаны предположения о бизнес-правилах, и эти предположения ложны или правила меняются, ваши данные являются мусором. Вот пример:
Персона, Роль, ПерсонаРоль
текущее бизнес-правило гласит, что человек имеет одну роль. Вы создаете таблицу, которая связывает Person и Role, где PersonRole (PersonName, PersonBirthDate, PersonMotherMaidenName, ..., RoleCode)
Теперь вы настоящий пурист, когда речь заходит о Natural Keys! А если серьезно, что если организация решит, что человек теперь может выполнять несколько ролей? Каковы последующие эффекты поддержки изменения потребностей бизнеса?
источник