Похоже, это действительно вопрос о суррогатных ключах, которые всегда представляют собой либо автоинкрементное число, либо GUID и, следовательно, один столбец, в отличие от натуральных ключей, которые частотребовать несколько частей информации, чтобы быть по-настоящему уникальным.Если у вас есть естественный ключ, состоящий только из одного столбца, то в любом случае, очевидно, что вопрос спорный.
Некоторые люди будут настаивать на использовании только одного или другого.Потратьте достаточно времени на работу с производственными базами данных, и вы поймете, что не существует независимой от контекста передовой практики.
В некоторых из этих ответов используется терминология SQL Server, но эти концепции обычно применимы ко всем продуктам СУБД:
Причины использования суррогатных ключей с одним столбцом:
Кластерные индексы. Кластерный индекс всегда работает лучше, когда база данных может просто добавить его.- иначе БД должна сделать разбиение страницы .Обратите внимание, что это применимо только в том случае, если ключ последовательный , то есть либо последовательность с автоматическим приращением, либо последовательный идентификатор GUID.Произвольные GUID, вероятно, будут намного хуже для производительности.
Отношения. Если ваш ключ имеет длину 3, 4, 5 столбцов, включая типы символов и другие некомпактныеданные, вы теряете огромных объемов пространства и впоследствии снижаете производительность, если вам необходимо создать связи с внешним ключом для этого ключа в 20 других таблицах.
Уникальность. Иногда у вас нет истинного натурального ключа.Возможно, ваша таблица - это своего рода журнал, и вы можете получить два одинаковых события одновременно.Или, может быть, ваш настоящий ключ - это что-то вроде материализованного пути, который может быть определен только после строки, уже вставленной.В любом случае, вы всегда хотите, чтобы ваш кластерный индекс и / или первичный ключ были уникальными, поэтому, если у вас нет другой действительно уникальной информации, у вас нет другого выбора, кроме как использовать суррогатный ключ.
Совместимость. Большинству людей никогда не придется иметь дело с этим, но если естественный ключ содержит что-то вроде hierarchyid
, вполне возможно, что некоторые системы даже не смогут его прочитать.В этом случае снова вы должны создать простой автоматически сгенерированный суррогатный ключ для использования этими приложениями.Даже если у вас нет «странных» данных в естественном ключе, некоторые библиотеки БД сталкиваются с большими трудностями при работе с первичными ключами из нескольких столбцов, хотя эта проблема быстро уходит.
Причины использовать многоколонные естественные ключи
Хранилище. Многие люди, работающие с базами данных, никогда не работают с достаточно большими, чтобы иметь дело с этим фактором,Но когда в таблице содержатся миллиарды или триллионы строк, вы захотите сохранить в этой таблице абсолютный минимальный объем данных, который вы, возможно, сможете.
Репликация. Да, вы можете использовать GUID или последовательный GUID.Но GUID имеют свои собственные компромиссы, и если вы не можете или не хотите использовать GUID по какой-то причине, многоколонный естественный ключ является гораздо лучшим выбором для сценариев репликации, поскольку он по своей природе глобальноуникальный - то есть вам не нужен специальный алгоритм, чтобы сделать его уникальным, он уникален по определению .Это позволяет очень легко рассуждать о распределенных архитектурах.
Производительность вставки / обновления .Суррогатные ключи не бесплатны.Если у вас есть набор уникальных столбцов и , которые часто запрашиваются, и поэтому вам необходимо создать индекс покрытия для этих столбцов;Индекс оказывается почти таким же большим, как таблица, которая тратит пространство , а требует обновления второго индекса каждый раз, когда вы вносите какие-либо изменения.Если вам когда-либо удастся иметь только один индекс (кластеризованный индекс) для таблицы, вы должны это сделать!
Вот что сразу приходит на ум. Я обновлюсь, если вдруг что-нибудь вспомню.