Внешний ключ MySQL использовать идентификатор или значение? - PullRequest
1 голос
/ 12 февраля 2012

Должны ли внешние ключи быть числовыми идентификаторами или я могу использовать другие значения? В настоящее время я использую идентификаторы, но мне нужно продолжать соединять / запрашивать таблицы для преобразования значений в идентификаторы до проверки, вставки и т. Д. (Помимо ввода я также ссылаюсь на значения вместо идентификаторов в своем коде) Например, скажем, у меня есть status таблица - могу ли я отказаться от числовых идентификаторов и просто сохранить значения («активные», «приостановленные» и т. д.)?

Это будет в основном использоваться для ресурсных / несколько статических таблиц.

Бонусный вопрос: нужны ли поля идентификаторов в таблицах соединений? Я не вижу их цели.

возможно? Недостатки? Предложения?

Ответы [ 2 ]

3 голосов
/ 12 февраля 2012

Вы можете иметь char или столбцы с другими типами, используемыми в качестве внешних ключей.Проблема в том, что ваши столбцы будут шире.A TINYINT, достаточный для хранения 256 различных состояний, требует 1 байт.A CHAR(10), поэтому вы можете хранить 'Active', 'Suspended' и т. Д., Требуется 10 байтов.Не только строки будут шире, но и индексы тоже.И пространство может не быть проблемой для современных жестких дисков, но размер индекса также влияет на эффективность.

Так что, да, вы можете покончить с числовыми идентификаторами и просто сохранить только значения, если вы терпите производительностьухудшение.

В качестве альтернативы, вы можете использовать CHAR(1) в качестве первичного ключа таблицы status (и, конечно, в качестве внешнего ключа в других таблицах), так что вы можете иметь 'A', для 'Active''S' для 'Suspended' и т. Д. Работает, если у вас не более 26 различных статусов.

Тип MySQL ENUM имеет несколько проблем, описанных в ответе Билла Карвина здесь: Тип Mysql ENUM против таблиц объединения

2 голосов
/ 12 февраля 2012

Внешние ключи могут ссылаться и на другие виды столбцов.

enum рекомендуется, если у вас есть несколько разных строк, которые вы хотите эффективно использовать.Внутри они будут целыми числами, но вы можете использовать их имена. MySQL ссылка

...