it-roy-ru.com

Могу ли я использовать VARCHAR как ПЕРВИЧНЫЙ КЛЮЧ?

У меня есть таблица для хранения купонов/скидок, и я хочу использовать столбец coupon_code в качестве первичного ключа, который является VARCHAR.

Мое обоснование заключается в том, что каждый купон будет иметь уникальный код, и единственные команды, которые я буду выполнять, это SELECT ... FROM ... WHERE coupon_code='..'

Я не буду делать никаких объединений или индексирования, и я не вижу, чтобы в этой таблице было больше нескольких сотен записей.

Мне кажется, что это будет хорошо, но я не знаю, есть ли что-то, что я пропускаю/не думаю.

41
Mike Brady

Конечно, вы можете, в том смысле, что ваша СУБД позволит вам это сделать. Ответ на вопрос о том, должны ли вы должны делать это по-другому, однако: в большинстве ситуаций значения, которые имеют значение вне вашей системы баз данных, следует не выбирать в качестве первичного ключа.

Если вы знаете, что значение уникально в моделируемой системе, целесообразно добавить в таблицу уникальный индекс или уникальное ограничение. Тем не менее, ваш первичный ключ обычно должен иметь какое-то «бессмысленное» значение, например, автоматически увеличивающееся число или GUID.

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

91
dasblinkenlight

Одеяло «нет, не надо» - это ужасный совет. Это вполне разумно во многих ситуациях, в зависимости от вашего варианта использования, рабочей нагрузки, энтропии данных, аппаратного обеспечения и т.д. То, что вы не должны делать, это делать предположения.

Следует отметить, что вы можете указать префикс, который будет ограничивать индексирование MySQL, что поможет вам сузить результаты перед сканированием остальных. Это может, однако, стать менее полезным со временем, так как ваш префикс «заполняется» и становится менее уникальным.

Это очень просто сделать, например:

CREATE TABLE IF NOT EXISTS `foo` (
  `id` varchar(128),
  PRIMARY KEY (`id`(4)),
)

Также обратите внимание, что префикс (4) появляется после кавычек столбца.

Наконец, вы должны прочитать, как работают префиксы индекса и их ограничения, прежде чем их использовать:

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

16
Josh

Это зависит от конкретного случая использования.

Если ваша таблица статична и имеет только короткий список значений (и есть небольшая вероятность того, что это изменится в течение жизни БД), я бы порекомендовал такую ​​конструкцию:

CREATE TABLE Foo 
(
    FooCode VARCHAR(16), -- short code or shortcut, but with some meaning.
    Name NVARCHAR(128), -- full name of entity, can be used as fallback in case when your localization for some language doesn't exist
    LocalizationCode AS ('Foo.' + FooCode) -- This could be a code for your localization table... 
)

Конечно, когда ваша таблица вообще не статична, лучше использоватьINTв качестве первичного ключа.

2
Tomino

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

0
Imran Younas

Это нормально, конечно. Всего несколько сотен записей, это будет быстро.

Вы можете добавить уникальный идентификатор в качестве первичного ключа (int autoincrement) и установить свой coupon_code как уникальный. Так что если вам нужно сделать запрос в других таблицах, лучше использовать int, чем varchar

0
guikk