Подтвердить что ты не робот

Могу ли я использовать VARCHAR в качестве ОСНОВНОГО КЛЮЧА?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Следует отметить, что вы можете указать префикс, который ограничит индексацию 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

Ответ 3

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

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

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 в качестве первичного ключа - лучшее решение.

Ответ 4

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

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