2012-02-11 1 views
1

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

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

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

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

ответ

2

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

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

2

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

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

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

MySQL ENUM типа имеет несколько проблем, описанных в ответ Билл Karwin здесь: Mysql ENUM type vs join tables

+0

соображений производительности в одиночку, я только когда-либо использовали Интс для ФКС. –

+0

@MikePurcell: Итак, я полагаю, вы предпочитаете натуральные ключи, верно? Я тоже. –

+0

Действительно. Великие умы пьют, думают одинаково. –