次の表を検討してください。
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 または 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 を使用しています。
更新私は、データベースがビット操作にインデックスを使用しないことについて少し理解しました。これは、パフォーマンスを低下させる完全なテーブルスキャンを必要とします。データベースの各行は特定の会社に属しているため、すべてのクエリには、インデックスを持つ company_fk を含む WHERE 句が含まれます。
更新私は現在6つの役割しか持っていませんが、将来的にはさらに増える可能性があります.
UPDATEロールは相互に排他的ではなく、互いに継承します。たとえば、restricted は public に割り当てられたすべての権限を継承します。