Nachteile von Bit-Flags in Datenbankspalten?

Betrachten Sie die folgenden Tabellen:

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 ist ein Bit-Flag, das eine Kombination von Rollen angibt, mit denen Nachrichten gelesen werden können. Wenn ich also eine Nachricht einfüge, die nur eingeschränkt und vertraulich gelesen werden kann, würde ich read_roles auf einen Wert von setzen2 | 4 oder 6 und wenn ich die Nachrichten zurückbekommen möchte, die ein bestimmter Benutzer sehen kann, kann ich eine Abfrage wie verwenden.

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; 

Was sind die Nachteile der Verwendung von Bit-Flags in Datenbankspalten im Allgemeinen? Ich gehe davon aus, dass die Antwort auf diese Frage datenbankspezifisch sein könnte, daher bin ich daran interessiert, die Nachteile bestimmter Datenbanken zu ermitteln.

Ich verwende Postgres 9.1 für meine Anwendung.

AKTUALISIEREN Ich hatte das Problem, dass die Datenbank keinen Index für Bitoperationen verwenden sollte, für die ein vollständiger Tabellenscan erforderlich wäre, der die Leistung beeinträchtigen würde. Daher habe ich die Frage aktualisiert, um meine Situation genauer widerzuspiegeln. Jede Zeile in der Datenbank gehört zu einem bestimmten Unternehmen, sodass alle Abfragen die WHERE-Klausel enthalten, die eine company_fk enthält, die einen Index enthält.

AKTUALISIEREN Ich habe momentan nur 6 Rollen, möglicherweise in Zukunft mehr.

AKTUALISIEREN Rollen schließen sich nicht gegenseitig aus und sie erben voneinander. Beispielsweise erben eingeschränkte Rollen alle Berechtigungen, die public zugewiesen wurden.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage