Хороший Database-Design не имеет идентификационных столбцов в таблицах, верно? - PullRequest
1 голос
/ 29 октября 2009

В чем преимущество наличия дополнительного столбца идентификаторов в каждой таблице базы данных? Какие недостатки?

Обновление: Теперь я хочу расширить дело и ввести репликацию. Для чего нужен этот суррогатный ключ (идентификационный столбец) помимо строки, которую мы получаем при репликации. От возражения К. Брайана Келли следует установить кластерный индекс для этой строки (и забыть столбец идентичности). Что ты думаешь?

Ответы [ 2 ]

4 голосов
/ 30 октября 2009

Краткая версия: суррогатный или синтетический ключ (что вы, вероятно, подразумеваете под «столбцом идентичности») по сравнению с естественным ключом - это очень старая дискуссия.

Плюсы суррогатных ключей:

  • делает вас независимым от изменений в естественном ключе (подумайте о новых требованиях / изменяющейся модели предметной области), которые в противном случае могли бы каскадно проходить через вашу модель данных
  • иногда - это без естественного ключа (например, человек в адресной книге)
  • часто быстрее, потому что он короче (один столбец типа int вместо, например, нескольких вариантов)
  • удобнее в соединениях и т. Д., Потому что это только один столбец

Минусы:

  • вам все еще нужен уникальный индекс для каждого естественного ключа-кандидата (так что нужен еще один индекс)
  • это чуждо домену, и для получения реальных данных может потребоваться дополнительное объединение

Как правило, соглашение заключается в том, что суррогатные ключи обычно являются хорошей идеей, за исключением простых случаев, таких как таблицы соединений.

Подробнее см. Википедия , в которой есть хорошая статья по теме.

3 голосов
/ 29 октября 2009

Зачастую использование суррогатных ключей, из которых столбцы IDENTITY являются наиболее распространенными, делается из соображений производительности. Вы все равно должны определить естественные ключи (столбцы, которые делают строку уникальной на основе данных).

Обычно суррогатные ключи являются целочисленными значениями. Это позволяет легко связывать их друг с другом, используя соединения с другими таблицами (и соответственно ограничивать с помощью внешних ключей). Кроме того, когда речь идет о SQL Server, все некластеризованные индексы зависят от кластеризованного индекса. Таким образом, если кластерный индекс основан на естественном ключе и в результате имеет большой размер, тогда все некластеризованные индексы также будут большими, поскольку они будут ссылаться на кластерный индекс. Поэтому многие люди строят первичный ключ на основе этого целочисленного суррогатного ключа. Я знаю, что немного упрощаю, но это ключевая причина для использования суррогатных ключей.

Недостаток в том, что суррогатный ключ фактически бессмысленен. Если бы кто-то изменил значение ключа, вы могли бы разорвать связь, если ограничения внешнего ключа отсутствуют или отключены. В случае внесения изменения, которое изменяет альтернативный ключ, вы фактически изменяете сами данные. Таким образом, вы ожидаете такой разрыв, если сущности построены правильно, и вы также изменили бы данные в связанных таблицах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...