Реальный вопрос дизайн базы данных - суррогатный ключ или натуральный ключ?

StackOverflow https://stackoverflow.com/questions/3747730

Вопрос

Какой из них лучшая практика и Почему?

а) таблица типа, суррогатный / искусственный ключ

Внешний ключ от user.type к type.id: alt text

б) Введите таблицу, натуральный ключ

Внешний ключ от user.type к type.typeName: alt text

Это было полезно?

Решение

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

Ниже приведены основные недостатки природного ключевого подхода:

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

  • Индекс на int поле будет гораздо более компактным, чем один на varchar поле.

  • В некоторых случаях это может быть трудно иметь уникальный Натуральный ключ, и это необходимо, поскольку он будет использоваться в качестве первичного ключа. Это может не применять в вашем случае.

Другие советы

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

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

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

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

Если TypEname является естественным ключом, то это, вероятно, предпочтительнее вариант, поскольку он не потребует присоединения для получения значения.

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

Суррогатный ключ для меня тоже, пожалуйста.

Другой может быть проще, когда вам нужно, чтобы вытащить какой-то код, но в конечном итоге будет сложнее. Вернувшись в день, мой Tech Boss решил использовать адрес электронной почты в качестве основного ключа была хорошей идеей. Само собой разумеется, когда люди хотели изменить свои адреса, это действительно высосало.

Используйте натуральные ключи, когда они работают. Имена обычно не работают. Они слишком музей.

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

Если они вообще хорошо управляются данными, у них будут природные ключи, которые работают для важных вещей. Для неважных вещей, подходите себе.

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

Но с другой стороны, ключ Shrashote иногда зарабатывает дополнительные затраты за счет объединения таблиц. Подумайте о «пользователю» ... у меня есть

UserId varchar(20), ID int, Name varchar(200)

как структура таблицы.

Теперь подумайте, что я хочу взять трек на многие таблицы, как это вставляют записи ... Если я использую Id Как первичный ключ, то [1,2,3,4,5..] etc будет в зарубежных таблицах, и когда мне нужно знать, кто вставляет данные, которые я присоединяюсь к таблице пользователей, потому что 1,2,3,4,5,6 бессмысленно. Но если я буду использовать UserId Как первичный ключ, который однозначно идентифицирован, то на других зарубежных таблицах [john, annie, nadia, linda123] ETC будет сохранен, что иногда легко отличается и значимы. Поэтому мне не нужно присоединиться к таблице пользователей каждый раз, когда я делаю запрос.

Но помните это, требуется некоторое дополнительное физическое пространство, поскольку Varchar сохраняется в зарубежных таблицах, которые занимают дополнительные байты .. А при необходимости индексации имеет существенную проблему производительности, где int работает лучше, чем varchar

Суррогатный ключ - это замена натурального первичного ключа. Это просто уникальный идентификатор или номер для каждой строки, который можно использовать для первичного ключа к таблице. Единственное требование для суррогата первичного ключа заключается в том, что он уникален для каждой строки в таблице.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top