Переваги та недоліки використання типів ENUM проти Integer?


110

Скажімо, у якійсь випадковій таблиці ви маєте стовпець з назвою статусу . Цінність у реальному світі буде або включена, або відключена .

Чи краще для типу даних цього стовпця бути int / bool (1 або нуль) або використовувати ENUMзі значеннями being enabledі disabled? Які переваги чи недоліки?

Скажімо, замість всього двох дійсних статусів у вас 4 чи 10 чи навіть більше? Чи змінюються переваги та недоліки в одну чи іншу сторону, оскільки кількість необхідних значень збільшується?


5
Це запитання має бути закладене в закладки усіма розробниками MySQL, оскільки воно може стати джерелом серцевих ударів чи торжеств. +1 !!!
RolandoMySQLDBA

Відповіді:


70

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

Навіть без статті я знаю


1
Незважаючи на те, що інші відповіді в цій темі дуже інформативні, я відзначаю цю відповідь через дуже корисну статтю.
Джейк Вілсон

6
+1 Ви не можете повторно використовувати список членів стовпця ENUM в інших таблицях. ENUM має обмежену портативність до інших СУБД.
день, коли

Що я можу зробити, якщо у мене поле має стосунки з іншими записами тієї ж таблиці? Наприклад, припустимо unitsмодель для предметів магазину, де кожен запис повинен мати властивість відповідних одиниць composition. тобто Тон, кг, нім
SaidbakR

Нічого химерного в цій статті - це чудово! Я думаю, що саме ця посада наклала мене на те, чому вони погані! Я дав це +1!
Vérace

1
У статті пропонується використовувати стару добру таблицю замість типів ENUM. Чи слід додати це до відповіді?
Утку

39

Ну, спочатку ми маємо вимоги до зберігання . Я припускаю, що ви мали на увазі крихітний (замість int).

  • ENUM займає 1 байт (якщо під значеннями 255) або 2 байти (максимум 65,535)
  • TinyInt займає 1 байт (максимум 255 значень)
  • Булевий синонім TinyInt

Отже, на поверхні вони всі однакові. ENUM дійсно приймає деякі метадані для значення рядка, пов'язаного з ним, хоча ( старший src )

Я б сказав, оскільки ви додаєте більше значень, але будь-яка перевага починає відхилятися від ENUM. Особливо, якщо ви додаєте значення після того, як таблиця вже використовується, тому що ви повинні змінити структуру таблиці, щоб вмістити її.

Яка перевага використання ENUM? Рядок подання того, що означає значення. Це все, що стосується мене. Наскільки це цінне, залежить від вашої заявки.


4
+1 за згадку про єдину реальну перевагу: представлення рядків. Все інше - це миття вперед.
RolandoMySQLDBA

19

Я вважаю, що ENUM - це коротке визначення кодової таблиці. Його головна перевага полягає в тому, що він уникає необхідного для приєднання коду та показу коду. Це також полегшує встановлення значень, якщо вони надходять у рядковій формі.

Я вважаю, що у неї є такі недоліки:

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