@ZmeuSnake

Оправдано ли использование строкового первичного ключа?

Например есть таблица, хранящая каталог автомобилей. Оправдано ли будет сделать первичным ключем гос.номер, т.е. , допустим, поле nchar(6)? А если нет, то в каких случаях это бывает оправдано? Тут ведь и избавляемся от интового поля с автоинкрементом, и не надо делать дополнительно проверок на уникальность номера.
Как скажется использование строкового pk на производительности?
  • Вопрос задан
  • 1555 просмотров
Решения вопроса 1
Оправдано ли будет сделать первичным ключем гос.номер, т.е. , допустим, поле nchar(6)?

Оправдано, если а) поле фиксированной длины - неважно, строка это или число; б) вы действительно уверены в том, что значения будут уникальны, в том числе во времени. Есть предметные области, где это действительно так, но далеко не везде.
Если строка переменной длины, первичным ключом её лучше не делать, но можно сделать полнотекстовой поиск по ней, если он нужен.

Для СУБД небольшая строка фиксированной длины (напр, 12 байт) - все равно что большое число, особой разницы в общем-то нет. А вот строки переменной длины как правило хранятся иначе, в отдельной области, а в самой записи ставится указатель. Все это, разумеется, удорожает запросы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
gbg
@gbg
Любые ответы на любые вопросы
1. Никуда не годится. Ключ должен быть числом, это раз. Это влияет на производительность.
2. Допущение об уникальности номеров автомобилей - мрак. Вполне возможна ситуация, когда появятся две машины с одинаковым номером, просто одна из них 100500 лет назад снята с учета.
Ответ написан
trevoga_su
@trevoga_su
не правильно. автомобильный номер - не уникален.
в 2013 я пошел в ГИБДД, заплатил 2000 руб и на новую машину поставить свой старый гос номер
Ответ написан
Комментировать
@wadeg
Если строковый ключ не слишком широкий, то он гораздо лучше использования "фальшивого" PK. На производительность вставок/джойнов в пределах реальной погрешности НЕ влияет: не нужно слушать тех, кто когда-то прочел эту байку, достаточно самому поставить нехитрый опыт с реальной средней шириной записи. Единственное ограничение тут - возможное переиспользование ключа, но если этого не допускается, как в данной задаче - так и нужно делать.
Ответ написан
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Например есть таблица, хранящая каталог автомобилей. Оправдано ли будет сделать первичным ключем гос.номер
Оправдано, но гос. номер не определяет сущность (автомобиль). Возможно определяет VIN, но это нужно определять по предметной области. Использование суррогатного ключа (обычно автоинкрементное число, хотя может быть всё, что угодно, например, uniqueidentifier 0E984725-C51C-4BF4-9960-E1C80E27ABA0) избавляет от необходимости искать (и понимать его уникальность) естественный ключ.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы