@immelnikoff
Изучаю БД

TINYINT vs ENUM: в ситуации, когда возможных целочисленных значений всего несколько?

В таблице есть поле "Ограничение скорости". Возможные значения поля: 20, 30, 40, 50, 60, 70, 90, 100, 110, 120, 130.
Какой лучше тип выбрать для поля "Ограничение скорости": TINYINT UNSIGNED или ENUM(20, 30, 40, 50, 60, 70, 90, 100, 110, 120, 130)?
  • Вопрос задан
  • 779 просмотров
Пригласить эксперта
Ответы на вопрос 3
Melkij
@Melkij
PostgreSQL DBA
Enum с числовыми полями работает описанным в мануале способом, но этот способ... Скажем так, иногда вызывает удивление.

mysql> create temporary table speedlimit (i int, lim ENUM('20', '30', '40', '50', '60'));
Query OK, 0 rows affected (0.04 sec)

mysql> insert into speedlimit values (1, 60);
Query OK, 1 row affected, 1 warning (0.04 sec)

mysql> insert into speedlimit values (2, 5);
Query OK, 1 row affected (0.04 sec)

mysql> insert into speedlimit values (3, '60');
Query OK, 1 row affected (0.04 sec)

mysql> select * from speedlimit;
+------+------+
| i    | lim  |
+------+------+
|    1 |      |
|    2 | 60   |
|    3 | 60   |
+------+------+
4 rows in set (0.00 sec)

mysql> select * from speedlimit where lim > 20;
Empty set (0.00 sec)

mysql> select * from speedlimit where lim > '20';
+------+------+
| i    | lim  |
+------+------+
|    2 | 60   |
|    3 | 60   |
+------+------+
2 rows in set (0.00 sec)


Если вы понимаете, почему поведение именно такое и знаете, что это поведение не будет удивлять других разработчиков - можно использовать. По размеру enum до 255 значений занимает 1 байт, как и tinyint. Но я не рекомендую использовать enum с числовыми значениями.
Ответ написан
miraage
@miraage
Старый прогер
А если потом добавятся космические корабли? TINYINT может не хватить.
ENUM такой в базе я бы тоже не описывал. Возьмите обычный UNSIGNED INT.
Валидация (imho) должна быть на уровне DTO/VO.
Ответ написан
@cicatrix
было бы большой ошибкой думать
Размышления в сторону - если размер базы / объём памяти критичен, то, конечно, чем меньше размерность, тем лучше.
Если же говорить о производительности, то оказывается, что 64 бтный процессор в совокупности с 64-битной ОС лучше всего работает с, ВНЕЗАПНО... 64-битными целыми. Уменьшение разрядности до 32, 16 или 8 бит либо вообще не даст прироста производительности, либо даже ухудшит быстродействие.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы