title: Any disadvantages to bit flags in database columns?
body: <p>Consider the following tables: </p>
  
  <pre><code>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 
  );
  </code></pre>
  
  <p>read_roles is a bit flags that specifies some combination of roles that can read news items. So if I am inserting a news item that can be read by restricted and confidential I would set read_roles to have a value of <code>2 | 4</code> or 6 and when I want to get back the news posts that a particular user can see I can use a query like.</p>
  
  <pre><code>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; 
  </code></pre>
  
  <p>What are disadvantages of using bit flags in database columns in general? I am assuming the answer to this question might be database specific so I am interested in learning about disadvantages with specific databases. </p>
  
  <p>I am using Postgres 9.1 for my application. </p>
  
  <p><strong>UPDATE</strong> I got the bit about the database not being to use an index for bit operations which would require a full table scan which would suck for performance. So I have updated the question to reflect my situation more closely, each row in the database belongs to a specific company so all the queries will have WHERE clause that include a company_fk which will have an index on it.  </p>
  
  <p><strong>UPDATE</strong> I only have 6 roles right now, possible more in the future. </p>
  
  <p><strong>UPDATE</strong> roles are not mutually exclusive and they inherit from each other, for example, restricted inherits all the permissions assigned to public. </p>