Создание первичного ключа CountryId
и Name
не гарантирует уникальность имен. Это просто гарантирует, что каждая CountryId
- Name
пара уникальна, и, очевидно, CountryId
уже уникальна, будучи «идентификатором». Таким образом, вы можете иметь, например, 1-US
и 19-US
, так как пары уникальны.
Единственная причина сделать их первичным ключом - это если вы будете часто выполнять запросы, в которых в выражении Where используются и CountryId, и Name. Первичный ключ по умолчанию создает кластеризованный индекс, который физически сортирует таблицу, поэтому очень быстро выполняет поиск строк по этим предикатам.
Еще один важный момент, который необходимо поднять, заключается в том, что в вашем конкретном примере вы храните список стран, который а) очень короткий и б) мало что меняет. Поиски по этой таблице будут чрезвычайно быстрыми, независимо от того, что вы делаете. Даже если SQL Server каждый раз выполняет полное сканирование таблицы, вы, вероятно, даже не заметите. Вам не нужно беспокоиться о фрагментации страницы. Вы можете просто пропустить столбец ID и использовать Name
в качестве первичного ключа.
Или, если вы хотите сохранить идентификатор, а также обеспечить уникальность только названий стран, вы можете поставить уникальное ограничение в столбце Имя.
Трудно охватить проблему первичных ключей, кластеризованных индексов и индексов в целом слишком глубоко в одном ответе. Вот несколько хороших ресурсов для начала: