Могу ли я использовать нечисловой первичный ключ для таблицы MySQL?
В моем веб-приложении пользователь может определять документы и давать им уникальное имя, которое идентифицирует этот документ, и понятное имя, которое человек будет использовать для ссылки на документ. Возьмите следующую схему таблицы в качестве примера:
| id | name | friendly_name |
-----------------------------------------------
| 2 | invoice-2 | Invoice 2 |
В этом примере я использовал id
столбец в качестве первичного ключа, который является автоматически увеличивающимся числом. Так как уже есть естественный идентификатор для документов (name
) Я также мог бы сделать это:
| name | friendly_name |
--------------------------------------
| invoice-2 | Invoice 2 |
В этом примере name
является первичным ключом документа. Мы устранили id
поле, так как это по сути просто дубликат name
, поскольку каждый документ в таблице должен иметь уникальный name
тем не мение.
Это также означало бы, что когда я ссылаюсь на документ из отношения с внешним ключом, мне придется его называть document_name
скорее, чем document_id
,
Какова лучшая практика в этом отношении? Теоретически для меня вполне возможно использовать VARCHAR
для первичного ключа, но есть ли у него какие-либо недостатки, такие как снижение производительности?
2 ответа
Есть две школы мысли на эту тему.
Есть некоторые, кто твердо придерживается мнения, что использование "естественного ключа" в качестве первичного ключа для таблицы сущностей желательно, поскольку оно имеет значительные преимущества по сравнению с суррогатным ключом.
Другие считают, что "суррогатный" ключ может обеспечить некоторые желательные свойства, которых "естественный" ключ может не иметь.
Давайте суммируем некоторые из наиболее важных и желательных свойств первичного ключа:
- минимальный - минимально возможное количество атрибутов
- просто - нативные типы данных, в идеале один столбец
- доступно - значение всегда будет доступно при создании объекта
- уникальный - абсолютно без дубликатов, никакие две строки никогда не будут иметь одинаковое значение
- анонимный - не несет скрытой "значимой" информации
- неизменный - после назначения он никогда не будет изменен
(Есть некоторые другие свойства, которые могут быть перечислены, но некоторые из этих свойств могут быть получены из свойств выше (не нуль, могут быть проиндексированы и т. Д.)
Я разделяю две школы мысли о "естественных" и "суррогатных" ключах как "лучших" первичных ключах на два лагеря:
1) Те, кто был сильно сожжен предыдущим решением выбрать естественный ключ в качестве первичного ключа, и
2) Те, кто еще не был сожжен этим решением.
Конечно вы можете.
create table sometbl(
`name` varchar(250) NOT NULL PRIMARY KEY,
`friendly_name` varchar(400)
);
Время доступа к ключу integer или varchar (если он не слишком длинный) не имеет разницы. Даже если это так, это не будет вашим главным узким местом. Пока столбец объявлен как ключ, mysql может получить к нему доступ очень быстро.
Автоматически увеличивающееся целое число не может быть первичным ключом. Это просто серийный номер для строки. Когда вы посмотрите на реальный объект, вы увидите, что у него нет серийного номера. Таким образом, первичный ключ должен основываться на этих реальных свойствах.