Антипаттерн: булевы значения как строки

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
10,604
Реакции
1,625
Credits
39,566
Антипаттерн: булевы значения как строки

В таблице users встречал такое:
SQL:
is_active VARCHAR(5) -- значения 'true' или 'false'
На первый взгляд — ерунда. На практике:
– нет валидации: можно вставить 'tru', 'yes', '0',
– медленнее сравнение, чем у BOOLEAN,
– больше места в хранилище,
– сложно агрегировать и строить аналитику.

Как надо:
SQL:
is_active BOOLEAN DEFAULT true
– Экономия места (1 байт против 5 и больше)
– Проверка через WHERE is_active
– Простой COUNT(*) FILTER (WHERE is_active) для отчётов
– Автоматическая поддержка в ORM и UI-форматах

Даже если тебе нужно больше состояний - используй ENUM, а не строку.
Чем проще тип, тем меньше шансов на баг.