Подтвердить что ты не робот

Есть ли разница между типами данных integer и bit (n) для битовой маски?

Я работаю с таблицей в базе данных PostgreSQL, которая имеет несколько булевых столбцов, которые определяют некоторое состояние (например, published, visible и т.д.). Я хочу создать один столбец статуса, который сохранит все эти значения, а также возможные новые в виде битовой маски. Есть ли разница между integer и bit(n) в этом случае?

Это будет довольно большая таблица, поскольку она хранит объекты, созданные пользователями через веб-интерфейс. Поэтому я думаю, что мне придется использовать (частичные) индексы для этого столбца.

4b9b3361

Ответ 1

Если у вас есть только несколько переменных, я бы рассмотрел возможность сохранения отдельного boolean.

  • Индексация проста. В частности также индексы выражений и частичные индексы.
  • Условия для запросов легко писать, читать и осмыслять.
  • Булевский столбец занимает 1 байт (без выравнивания). Для всего лишь нескольких переменных это занимает наименьшее пространство.
  • В отличие от других опций столбцы boolean позволяют присваивать значения NULL для отдельных битов, если вам это нужно. Вы всегда можете определить столбцы NOT NULL, если вы этого не сделаете.

Если у вас больше полных переменных, а не более 32, integer может служить лучше всего. (Или a bigint для переменных до 64.)

  • Занимает 4 байта на диске (может потребоваться выравнивание, в зависимости от предыдущих столбцов).
  • Очень быстрая индексация для точных совпадений (оператор =).
  • Обработка отдельных значений может быть медленнее/менее удобна, чем при использовании varbit или boolean.

С еще большим количеством переменных или если вы хотите много манипулировать значениями, или если у вас нет огромных таблиц или дискового пространства/ОЗУ, это не проблема, или если вы не уверены, что выбрать, я бы рассмотрим bit(n) или bit varying(n) (короткий: varbit(n).

Для всего 3 бита информации отдельные столбцы boolean получают три байта, а для integer - 4 байта (возможно, дополнительное выравнивание) и bit string 6 байтов (5 + 1).

Для 32 бит информации, integer по-прежнему требуется 4 байта (+ дополнение), bit string занимает 9 байтов для тех же (5 + 4) и boolean столбцов, занимающих 32 байта.

Чтобы оптимизировать дисковое пространство, вам нужно понять механизмы хранения PostgreSQL, особенно выравнивание данных. Подробнее в этом связанном ответе.

Этот ответ о том, как преобразовать типы boolean, bit (n) и integer тоже может помочь.

Ответ 2

Вы можете применить <бит htf = "http://www.postgresql.org/docs/9.1/static/functions-bitstring.html" rel= "nofollow" > функции битовой строки непосредственно к битовой строке без необходимости отбрасывать из целого числа.