SQL Server - выбор первичного ключа для моей таблицы - PullRequest
3 голосов
/ 24 июня 2011

У меня есть таблица, в которой хранится информация о пользователе.
В таблице User имя пользователя уникально. Как вы думаете, я должен сделать имя пользователя первичным или использовать суррогатный ключ типа int?
Повлияет ли использование строкового ключа на производительность плохо?

Ответы [ 3 ]

9 голосов
/ 24 июня 2011

Используйте суррогатный целочисленный ключ.

Имена пользователей будут меняться не так часто, но могут.

Что касается производительности, не беспокойтесь об этом, пока не узнаете, что у вас есть проблема,

SQL Server по умолчанию создаст кластерный индекс для столбца Первичный ключ.Если вы используете широкий ключ в кластеризованном индексе, все некластеризованные индексы также будут содержать этот широкий ключ.

6 голосов
/ 24 июня 2011

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

4 голосов
/ 24 июня 2011

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

Что касается первичного ключа, вы МОЖЕТЕ сделать имя пользователя первичным ключом, НО поскольку внешние ключи будут ссылаться на него, вы также хотите, чтобы оно было статическим (а это не имя пользователя). Так что я бы сделал некластеризованный уникальный индекс по имени пользователя. Идентификационный номер PK будет автоматически включен в NCI.

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

...