Защо ENUM е зло

В повечето случаи има алтернатива на ENUM:

enum

И така, защо ENUM е зло?

1. Данните не се третират като данни

В случай на ENUM, данните се преместват технически от мястото за съхранение (полетата на базата данни) на друго място - метаданни за дефиниция на колона.

Има разлика между факта, че типът на колоната ограничава данните (числова колона може да съдържа само цяло число) и че ENUM действително съхранява някои от данните.

Накратко, колоната ENUM нарушава правилата за нормализиране. Това може да звучи като академичен подход, но всъщност има много други причини.

2. Промяната на списъка със стойности на ENUM е скъпа

Отначало смятате, че при никакви обстоятелства няма да е необходимо да променяте списъка с ценности. Но хората грешат. Някой пуска нов вид продукт, вашата компания предлага друг метод за доставка, а Северна Америка се срива в Азия.

Проблемът е, че промяната на списъка ENUM предполага преструктуриране на цялата таблица с ALTER TABLE, което е много скъпо по отношение на ресурси и време.

На малка маса тази операция е безболезнена, но на голяма маса ще изисква значителни ресурси. И ако използвате справочна таблица вместо ENUM, промяната на този списък ще бъде толкова проста, колкото INSERT, UPDATE и DELETE.

3. Невъзможно е да се добави допълнителна информация

Няма правилен начин за добавяне на допълнителна информация, свързана със списъка ENUM. Какво трябва да се направи, ако освен името на континента искате да запазите и неговия район? В референтната таблица няма такъв проблем. ENUM? Забрави за това.

референтната таблица

Също така често се изисква флаг, който да посочва прекратяването на тази опция. Например, когато дадена компания спре да продава черни джаджи, е достатъчно да добавите колоната is_discontinued към справочната таблица. Като се има предвид това, все още е възможно да се запази информация за всички стари черни джаджи! Опитайте с ENUM!

4. Получаването на списък с уникални стойности на ENUM е мъка

Често се изисква да попълните падащия списък с възможни стойности от базата данни, например „Избор на цвят“.

Ако цветът се съхранява в справочна таблица, това е доста просто: SELECT * FROM цветове. ... Достатъчно е да промените референтната таблица, така че падащият списък да съдържа желаните стойности.