Лучше иметь много столбцов или одну строку бит столбца для многих флажков
У меня есть следующий сценарий:
Форма с множеством флажков, около 100.
У меня есть 2 идеи о том, как сохранить их в базе данных:
1. Многоколонный
Я создаю таблицу, похожую на эту:
id | box1 | box2 | ... | box100 | updated| created
id: int
box1: bit(1)
SELECT * FROM table WHERE box1 = 1 AND box22 = 1 ...
2. Один столбец данных
Таблица просто:
id | data | updated | created
data: varchar(100)
SELECT * FROM table WHERE data LIKE '_______1___ ... ____1____1'
где данные выглядят как 0001100101010......01
каждый символ, представляющий, было ли проверено значение или нет.
Учитывая, что в таблице будет более 200 тысяч строк, что является более масштабируемым решением?
3. Один столбец данных типа JSON
У меня пока нет хорошей информации об этом.
1 ответ
Или же...
4. НесколькоSETs
5. НесколькоINTs
- Они гораздо более компактны: около 8 флажков на байт.
- Они немного грязные, чтобы установить / проверить.
- Поскольку они ограничены 64 битами, вам потребуется более одного
SET
или жеINT
, Я рекомендую группировать биты некоторым логическим способом, основанным на приложении. - Быть осведомленным
FIND_IN_SET()
, - Быть осведомленным
(1 << $n)
для создания стоимости2^n
, - Быть осведомленным
|
а также&
Операторы.
Какой из 5 лучше? Это зависит от запросов, которые нужно выполнить - для поиска (при необходимости?), Для вставки, для обновления (при необходимости?) И для выбора.
Пример: для INTs
, WHERE (bits & 0x2C08) = 0x2C08
будет одновременно проверять наличие 4 флагов. Эта константа может быть либо построена в коде приложения, либо ((1<<13) | (1<<11) | (1<<10) | (1<<3))
для битов 3,10,11,13. Между тем другие флаги игнорируются. Если вам нужно, чтобы они были выключены, тест будет WHERE bits ^ 0x2C08 = 0
, Если какой-либо из этих видов тестов является вашим основным видом деятельности, то Вариант 5, вероятно, лучше всего подходит как для производительности, так и для пространства, хотя его чтение несколько загадочно.
При добавлении другой опции, SET
требует ALTER TABLE
, INT
обычно есть некоторые запасные биты (TINYINT UNSIGNED
имеет 8 бит,... BIGINT UNSIGNED
имеет 64). Итак, примерно один раз в 8, вам понадобится ALTER
чтобы получить больше INT или добавить другой INT. Удаление опции: предложите просто отказаться от этого элемента SET или бита INT.