Преимущества и недостатки использования ENUM против целочисленных типов?


110

Допустим, в некоторой случайной таблице у вас есть столбец с именем status . Это реальные значения будут либо включены, либо отключены .

Лучше ли, чтобы тип данных этого столбца был int / bool (1 или ноль) или использовался ENUMсо значениями enabledи disabled? Каковы преимущества или недостатки?

Допустим, вместо двух действительных статусов у вас есть 4 или 10 или даже больше? Влияют ли преимущества и недостатки на ту или иную сторону по мере увеличения количества требуемых значений?


5
Этот вопрос должен быть добавлен в закладки всеми разработчиками MySQL, потому что он может стать источником либо горя, либо триумфа. +1 !!!
RolandoMySQLDBA

Ответы:


70

Я нашел очень странную, но информативную статью о 8 причинах, почему не стоит использовать ENUM.

Даже без статьи я знаю


1
Хотя другие ответы в этой теме очень информативны, я отмечаю этот ответ как ответ из-за очень полезной статьи.
Джейк Уилсон

6
+1 Вы не можете повторно использовать список членов столбца ENUM в других таблицах. ENUM имеет ограниченную переносимость на другие СУБД.
onedaywhen

Что я мог бы сделать, если у меня есть поле, связанное с другими записями той же таблицы? Например, предположим unitsмодель для магазина предметов, где каждая запись должна иметь свойство для связанных с ней единиц composition. т.е.
Тонны

Ничего странного в этой статье - это здорово! Я думаю, что именно этот пост заставил меня понять, почему они плохие! Я дал ему +1!
Вера

1
В статье предлагается использовать старые добрые таблицы вместо типов ENUM. Должны ли мы добавить это к ответу?
Утку

39

Ну, во-первых, у нас есть требования к хранению . Я собираюсь предположить, что вы имели в виду tinyint (вместо int).

  • ENUM занимает 1 байт (если меньше 255 значений) или 2 байта (максимум до 65535)
  • TinyInt занимает 1 байт (максимум 255 значений)
  • Boolean - это синоним TinyInt

Итак, на первый взгляд, они все одинаковые. ENUM использует некоторые метаданные для строкового значения, связанного с ним ( более ранний src )

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

В чем преимущество использования ENUM? Строковое представление того, что означает значение. Вот и все, насколько я понимаю. Насколько это ценно, зависит от вашего приложения.


4
+1 за упоминание единственного реального преимущества: строковое представление. Все остальное - мытье вперед.
RolandoMySQLDBA

19

Я считаю, что ENUM - это краткое определение таблицы кодов. Его главное преимущество заключается в том, что он избегает кода, необходимого для присоединения и отображения описания кода. Это также облегчает установку значений, если они поступают в виде строки.

Я считаю, что это имеет следующие недостатки:

  • Нет возможности для дополнительных метаданных о коде.
  • Трудно добавить или отключить значения. (Отключение кодов может быть выполнено с полем триггера и срока действия.)
  • I18n в базе данных не может быть сделано.
  • Не для повторного использования через таблицы.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.