Почему не используют enum при проектировании БД проекта?
Добрый день!
Я всегда проектировал БД с использованием enum. Весьма полезная вещь в полях, где несколько вариантов. Например: забанен ли? 1 или 0. Админ ли? 1 или 0. И так далее. Но который урок для развития смотрю, везде для таких вещей задают integer. Правильно ли это? Зачем выделять столько памяти, если будет 2 значения? До меня это никак не доходит.
таблица, где живет значение бывшего enum, название в паре тройке ракурсов, признак доступности и т.п.
например если enum был тип контрагента и определялся как 1 - физлицо, 2 - юрлицо, потом добавился 3 - ИП - где-нибудь на "самозанятый ИП" - надоест везде цепляться ифами и кэйсами и захочется поиметь некую таблицу "справочника типов контрагентов", где живет id типа, пара-тройка ракурсов названия ("Физическое лицо", "ФЛ")
Ну а "добывать" значения соответственно
select
contragent_descr = contragents.descr,
contragent_type = contragent_types.descr,
contragent_type_short = contragent_types.descr_short
from contragents
inner join contragent_types on contragent_types.contragent_type_id=contragents.contragent_type_id
естественно в таблице контрагентов contragent_type_id - должна ссылаться на contragent_type_id из contragent_types (constraint)
А, понял. Спасибо) Ну а если речь идет о более узких полях, например: "забанен ли?". Тут ведь только 2 варианта: да или нет, и третьего не будет. Как быть в этом случае? Все рано int тип указывать? Не кощунство ли? Причем даже не tinyint люди указывают, а именно int.
Говорю за MySQL - enum все-равно использует 1 или 2 байта, в зависимости от количества вариантов. Так что ничего не мешает завести поле tinyint и хранить значение там - объем занимаемых данных будет такой же.
UPD:
enum под капотом - числа c соответствием набору строк.
Лентюююй, при нормально спроектированной бд и правильными выбранными типами можно сэкономить процентов 20-30. Если размер бд исчисляется десятками а то и сотнями гигабайт, подумай какая будет разница. + сравнивать 4 байта или 1 байт, как думаешь на нескольких миллионах записей быстрее будет или нет? Добавить к этому много-много тыщ запросов в секунду... Уже молчу про размеры индексов, которые явно не будут влазить в ОЗУ
при нормально спроектированной бд и правильными выбранными типами можно сэкономить процентов 20-30. Если размер бд исчисляется десятками а то и сотнями гигабайт, подумай какая будет разница. + сравнивать 4 байта или 1 байт, как думаешь на нескольких миллионах записей быстрее будет или нет? Добавить к этому много-много тыщ запросов в секунду... Уже молчу про размеры индексов, которые явно не будут влазить в ОЗУ
Правда если "удобный" размер хранения потребует дополнительных операций преобразования при каждом обращении - просядет производительность)
Поэтому критерий выбора правильности типа данных - это не только размер.
Иногда конечно можно заточиться даже на биты и хранить некий uchar который будет содержать в себе аж 8 булевых сущностей. Но это очень иногда и не в рамках вопроса на тостере.