У меня есть столбец с именем state, который имеет следующие значения: draft
, active
, published
, archived
. Я хочу сохранить их как VARCHAR
и сопоставить их с классом Enum
.
В таблице могут быть миллионы строк, и мне было интересно узнать о экономии пространства нескольких методов хранения этой информации.
Один из способов - иметь таблицу table_states
с столбцами id, state
и state_id
в основной таблице.
Другой способ состоял бы в том, чтобы состояния хранились в главном столбце, но индексировались.
Правильно ли я понимаю, что индексированные столбцы строки внутри сохраняются аналогично первому упомянутому методу?
В данной базе данных находится MySQL, но я уверен, что этот вопрос относится и к другим базам данных.
Порекомендовал бы использовать отдельную таблицу для состояний и использовать идентификатор tinyint для ID. Требование к пространству такое же, как и в перечислении (1 байт), но никаких ограничений, связанных с перечислением.
Индексирование не приводит к тому, что строки занимают меньше места. Фактически, он увеличивает объем хранилища, поскольку индекс является копией строк в сортированной структуре данных.
Вы можете использовать тип данных MySQL ENUM:
ALTER TABLE WhateverYourTableNameIs
MODIFY state ENUM('active','archived','draft','published') NOT NULL;
Таким образом, хранение столбца занимает всего 1 байт за строку, потому что внутри строки только часть определения таблицы, и они сохраняются в каждой строке как целое число ординалов. Вы можете иметь до 255 строк перечисления в списке, и он по-прежнему занимает 1 байт за строку.
С другой стороны, ALTER TABLE требует переопределения списка ENUM каждый раз, когда вы хотите добавить новое значение.