Недавно я узнал о bit string
типе данных, и мне довольно любопытно:
Внизу этой страницы документа есть предложение:
... плюс 5 или 8 байтов в зависимости от длины строки
Как обрабатываются битовые строки на других языках, таких как PHP, Java, C #, C ++ и т. Д., Через драйверы, такие как Npgsql, ODBC и т. Д.
Для вопроса № 1 использование smallint или bigint будет намного более эффективным с точки зрения хранения и, возможно, обеспечит выигрыш в производительности, поскольку целые числа поддерживаются везде. Большинство языков программирования с легкостью обрабатывают битовые операции над целыми числами. Если это так, то какой смысл вводить тип данных битовой строки? Только для случаев, когда требуется большое количество битовых масок? Индексация битового поля может быть? Меня больше интересует, как выполняется индексация битовых полей в PostgreSQL.
Для # 2, я запутался, более чем любопытно. Например, что если я сохраню битовые маски дня недели в поле bit (7), один бит на день, причем младший бит представляет понедельник. Затем я запрашиваю значение в PHP и C ++. Что я получу? В документации сказано, что у меня будет битовая строка, однако битовую строку я не могу использовать напрямую - как с целыми числами. Тогда в этом случае я должен отказаться от битового поля?
Кто-нибудь может уточнить, почему и когда я должен использовать бит или бит по-разному?
источник
Ответы:
Если у вас есть только несколько переменных, я бы хотел сохранить отдельные
boolean
столбцы.NULL
значения для отдельных битов, если вам это нужно. Вы всегда можете определить столбцы,NOT NULL
если вы этого не сделаете.Оптимизация хранилища
Если у вас больше чем полные переменные, но меньше 33,
integer
столбец может вам помочь. (Илиbigint
для до 64 переменных.)=
оператор).bit string
илиboolean
.С еще большим количеством переменных, или если вы хотите много манипулировать значениями, или если у вас нет больших таблиц и дискового пространства / ОЗУ не проблема, или если вы не уверены, что выбрать, я бы рассмотрел
bit(n)
илиbit varying(n)
.Примеры
Только для 3 битов информации отдельные
boolean
столбцы обходятся 3 байтами,integer
требуются 4 байта иbit string
6 байтов (5 + 1).Для 32 бит информации
integer
все еще требуется 4 байта, abit string
занимает 9 байтов для того же (5 + 4), аboolean
столбцы занимают 32 байта.дальнейшее чтение
источник
Все типы PostgreSQL полезны для одних вещей и менее полезны для других. В общем, вы больше избавляетесь от беспокойства о функциональности в первую очередь и о производительности позже. PostgreSQL имеет большое количество функций для манипулирования различными типами данных, и они не являются исключением.
Я ожидаю, что на прикладном уровне, если ваш db-драйвер не обработает его через какое-то преобразование типов, вы получите строковое представление и должны это обработать. Так что это может или не может быть полезным в этом качестве.
Вероятно, это полезно, когда вы хотите выбирать записи на основе побитовых операций, таких как побитовая или побитовая, и иным образом манипулировать данными в запросах SQL. Если вы не делаете этого, многие из более эзотерических функций PostgreSQL менее полезны.
Также обратите внимание, что для более длинных строк двоичной информации имеется большой объектный интерфейс, который позволяет выполнять потоковую передачу и т. Д., И интерфейс bytea, который позволяет более компактное представление строк.
ТЛ; Д-р: Если вам это нужно, вы об этом узнаете. В противном случае сохраните его в разделе «зарезервировано для будущего использования».
источник