2009-04-14 3 views
1

все мои таблицы имеют поле Id определенного типа (UserId, PostId, FooId и т. Д.). Обычно я делаю это Первичный ключ.База данных Первичный ключ -> Поле идентификации И поле имени?

Таблица, которую я называю Countries. Это имеет

CountryId SMALLINT 
Name VARCHAR(100) -- Yes, english country names only, in this column. 
AndSomeOtherFields. 

Теперь, я знаю, что Name должен быть уникальным. Все названия стран уникальны. Это хорошо/плохо/ru-roh, если я делаю PrimaryKey == CountryId ASCиName ASC?

Если это хорошо, может кто-нибудь объяснить, почему это лучше, чем просто Id, являющийся ПК? Это просто то, что он обеспечивает целостность данных (например, нет двух названий стран, существующих в таблице). Если это плохо .. почему?

благодарит вас.

+0

# Повторяющийся * http://stackoverflow.com/questions/166750/should-i-have-a-dedicated-primary-key-field * http://stackoverflow.com/questions/695325/should-i -use-natural-identity-columns-without-guid И это только те, что я мог видеть справа, этот вопрос задавался довольно много раз. – cgp

ответ

6

Создание первичного ключа CountryIdиName не гарантирует, что имена уникальны. Это просто гарантирует, что каждый CountryId - Nameпара уникальна, и, очевидно, CountryId уже уникален, будучи «ID». Таким образом, вы все равно можете иметь, например, 1-US и 19-US, поскольку пары уникальны.

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

Еще один важный момент для повышения - то, что в вашем конкретном примере вы сохраняете список стран, который является a) очень коротким и b) не сильно меняет. Взгляды на эту таблицу будут чрезвычайно быстро, независимо от того, что вы делаете. Даже если SQL Server должен выполнять полное сканирование таблицы каждый раз, вы, вероятно, даже не заметите. Вам не нужно беспокоиться о фрагментации страницы. Вы можете просто пропустить столбец идентификатора и использовать Name в качестве первичного ключа.

Или, если вы хотите сохранить идентификатор, но также обеспечить уникальность только названий стран, вы можете put a Unique Constraint в столбце Имя.

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

+0

«Первичный ключ физически сортирует таблицу« Не на моей РСУБД это не так; это должно быть сделано явно и может быть выполнено для любого индекса. В противном случае это солидный совет. – kquinn

+0

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

+0

Спасибо :) Я не должен был использовать таблицу стран в качестве моего примера, потому что это небольшая таблица. Вопрос был отсортирован по любой таблице размеров. Но я чувствую, что это все равно было отвечено :) –

1

Имея имя стать PK не всегда лучшее решение, я считаю, CountryId достаточно как PK для вашего таблица, однако, если имя - это поле, которое вы будете использовать много для запроса с помощью т. е.: выбирает, объединяет, вы должны индексировать это поле таким образом, чтобы фильтрация запросов в этом поле улучшала его скорость.

удачи :)

0

Единственное, что я могу придумать, довольно очевидно: ваш индекс будет немного больше. Сказав это, это не такая уж большая сделка, так как ваш стол будет хранить только страны. Но зачем вам такой индекс? Если вы сортируете по CountryId, а затем сортировать его по Название как второе поле бессмысленно. У вас всегда будет тот же порядок.

Одна вещь, которая действительно плохая идея состоит в том, чтобы иметь внешние ключи, указывающие на большой первичный ключ, поэтому убедитесь, что если вы используете, что первичный ключ, ваши внешние ключи, указывающие на стран до сих пор используют только CountryId колонка.

0

Известно, что названия стран изменяются без изменения индивидуальности страны. Это говорит о том, что имя не должно быть частью ПК.

0

Если вам необходимо обеспечить уникальность, используйте ограничение.

1

Сообщите об ошибке уникальный индекс на колонке Name.

Смежные вопросы