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

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

Форма с множеством флажков, около 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 каждый символ, представляющий, было ли проверено значение или нет.

Учитывая, что таблица будет200k + строк, что является более масштабируемым решением?

3.Отдельный столбец данных типа JSON

У меня пока нет хорошей информации об этом.

1 Ответ

0 голосов
/ 25 мая 2018

Или ...

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...