Есть ли недостатки битовых флагов в столбцах базы данных?
Рассмотрим следующие таблицы:
CREATE TABLE user_roles(
pkey SERIAL PRIMARY KEY,
bit_id BIGINT NOT NULL,
name VARCHAR(256) NOT NULL,
);
INSERT INTO user_roles (bit_id,name) VALUES (1,'public');
INSERT INTO user_roles (bit_id,name) VALUES (2,'restricted');
INSERT INTO user_roles (bit_id,name) VALUES (4,'confidential');
INSERT INTO user_roles (bit_id,name) VALUES (8,'secret');
CREATE TABLE news(
pkey SERIAL PRIMARY KEY,
title VARCHAR(256),
company_fk INTEGER REFERENCES compaines(pkey), -- updated since asking the question
body VARCHAR(512),
read_roles BIGINT -- bit flag
);
read_roles - это битовые флаги, которые определяют некоторую комбинацию ролей, которые могут читать новости. Поэтому, если я вставляю новость, которая может быть прочитана ограниченным и конфиденциальным образом, я бы установил для read_roles значение2 | 4
или 6, и когда я хочу получать сообщения новостей, которые может видеть конкретный пользователь, я могу использовать такой запрос, как.
select * from news WHERE company_fk=2 AND (read_roles | 2 != 0) OR (read_roles | 4 != 0) ;
select * from news WHERE company_fk=2 AND read_roles = 6;
Каковы недостатки использования битовых флагов в столбцах базы данных в целом? Я предполагаю, что ответ на этот вопрос может зависеть от конкретной базы данных, поэтому мне интересно узнать о недостатках конкретных баз данных.
Я использую Postgres 9.1 для моего приложения.
ОБНОВИТЬ Я понял, что база данных не в том, чтобы использовать индекс для битовых операций, которые потребуют полного сканирования таблиц, что приведет к потере производительности. Поэтому я обновил вопрос, чтобы более точно отразить мою ситуацию: каждая строка в базе данных принадлежит определенной компании, поэтому у всех запросов будет предложение WHERE, включающее company_fk, в котором будет индекс.
ОБНОВИТЬ Сейчас у меня только 6 ролей, возможно, еще больше в будущем.
ОБНОВИТЬ роли не являются взаимоисключающими, и они наследуют друг от друга, например, ограниченные наследуют все разрешения, назначенные для public.