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

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

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

Ответы [ 2 ]

25 голосов
/ 03 апреля 2012

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

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

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

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

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

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

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

Для оптимизации дискового пространства далее вам необходимо понять механизмы хранения:PostgreSQL, особенно выравнивание данных. Подробнее в этом связанном ответе .

Этот ответ о том, как преобразовать типы логический , бит(n) и integer также могут помочь.

1 голос
/ 03 апреля 2012

Вы можете применять функции битовых строк непосредственно к битовой строке без необходимости приведения из целого числа.

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