Лучше иметь много столбцов или одну строку бит столбца для многих флажков

У меня есть следующий сценарий:

Форма с множеством флажков, около 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.

Другие вопросы по тегам