15

В курсе баз данных, который я делал во время моего образования (около 4 лет назад), я думал, что рекомендуется избегать использования символьных строк в качестве типа данных первичного ключа.Первичный ключ как текст

Может кто-нибудь сказать мне, каковы плюсы и минусы для выбора характера изменяющегося типа данных для первичного ключа в SQL и сколько выше предпосылка верно?

N.B .: (Я использую База данных PostgreSQL). Я также имею дело с ситуацией, когда вам нужно ссылаться на такую ​​таблицу на другую, тем самым помещая внешний ключ на , меняя свой вид. Пожалуйста, учтите это также.

+2

Некоторые сведения можно найти здесь: http://stackoverflow.com/questions/337503/whats-the-best-practice-for-primary-keys-in-tables –

+0

http://stackoverflow.com/questions/404040/how-do-you-like-your-primary-keys –

ответ

10

Преимущества, которые вы имеете для выбора типа символьного символа в качестве поля первичного ключа, - это то, что вы можете выбрать, какие данные он может отобразить. Например, вы могли бы указать адрес электронной почты в качестве ключевого поля для таблицы пользователей. Это устраняет необходимость в дополнительном столбце. Другим преимуществом является наличие общей таблицы данных, содержащей индексы нескольких других таблиц (считайте таблицу NOTES с внешней ссылкой на таблицы FINANCE, CONTACT и ADMIN), вы можете легко узнать, из какой таблицы это произошло (например, ваша таблица FINANCE имеет индекс F00001, таблица CONTACT имеет индекс C00001 и т. д.). Боюсь, что недостатки в этом ответе будут более значительными, поскольку я против такого подхода.

Недостатки заключаются в следующем:

  1. Последовательный тип данных существует именно по этой причине в PostgreSQL
  2. Числовые индексы будут введены в порядок и минимальный переиндексации нужно будет сделать (то есть, если у вас есть стол с ключами Apple, Carrot и хотите вставить Banana, таблица должна будет перемещаться по индексам так, чтобы банана была вставлена ​​посередине. Вы редко вставляете данные в середине индекса, если индекс является числовым).
  3. Числовые индексы, не привязанные к данным, не будут меняться.
  4. Числовые индексы короче и их длина может быть исправлена ​​(4 байта по сравнению с тем, что вы выбираете в качестве длины вашего varchar).

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

Это обычные стандарты при написании SQL, но когда дело доходит до бенчмаркинга, вы обнаружите, что столбцы varchar немного медленнее при объединении и фильтрации, чем целые столбцы. Пока ваши первичные ключи не меняются КОГДА-ЛИБО, вы в порядке.

+4

* «таблица должна будет перемещаться по индексам, чтобы банана была вставлена ​​посередине». Эта информация неверна, тем более, что OP, упомянутый PostgreSQL, который делает ** не ** упорядочивать записи в соответствии с первичным ключом. См .: http://stackoverflow.com/a/13191075/517371 – Tobia