RDBで、あるテーブルを複数条件でフィルタしたい、という際の設計のベスト・プラクティスを知りたい


RDBで、あるテーブルを複数条件（AND/OR含む）でフィルタしたい、という際の設計のベスト・プラクティスを知りたいです。

具体的に例を上げると、

[code]

    テーブル名: sample_table
    スキーマ: 
     - id integer
     - name varchar
     - condition1 integer,
     - condition2 integer,
      ....,
     - conditionN integer
    
[/code]

といったカラムを持ったテーブルに対して、

[code]

    select * from sample_table where condition1 = 2 AND condition9 = 1;
    select * from sample_table where (condition1 = 1 AND condition3 = 1) OR condition4 = 3;
    
[/code]

といったSQLを、Nが増えても減っても、  
問題なく発行できるような設計を行いたいです。

手がかりすらわからず、もしよろしければどなたかご教授いただけないでしょうか。  
宜しくおねがい致します。




2つのテーブルに分割するのが素直な設計ではないでしょうか。

[code]

    CREATE TABLE sample (
      id integer,
      name text
    );
    
    CREATE TABLE condition (
      sample_id integer,
      n integer,  -- conditionN
      v integer   -- Value
    );
    
[/code]

[code]

    -- condition1 = 2 AND condition9 = 1
    SELECT * FROM sample WHERE id in(
      SELECT sample_id FROM condition WHERE (n,v) = (1,2)
      INTERSECT 
      SELECT sample_id FROM condition WHERE (n,v) = (9,1)
    );
    
    -- (condition1 = 1 AND condition3 = 1) OR condition4 = 3
    SELECT * FROM sample WHERE id in(
      (SELECT sample_id FROM condition WHERE (n,v) = (1,1)
       INTERSECT 
       SELECT sample_id FROM condition WHERE (n,v) = (3,1))
      UNION
      SELECT sample_id FROM condition WHERE (n,v) = (4,3)
    );
    
[/code]

こうしておけば、DB設計は変えずに`N`をどんどん増やせると思います。

なお、上記SELECT文を <http://sqlfiddle.com> で確認したところ、PostgreSQL 9.3では動作しましたが、MySQL
5.6では動作しませんでした。`condition`が予約語なのと、`INTERSECT`機能が存在しないことが原因のようです。  
タグによるとMySQLを使われているようなので、SELECTの際はご注意ください。

* * *

検証に使ったデータ

[code]

    INSERT INTO sample VALUES
      (1, 'one')
     ,(2, 'two')
     ,(3, 'three')
     ,(4, 'four')
    ;
    INSERT INTO condition VALUES
      (1, 1,2)
     ,(1, 9,0)
     ,(2, 1,1)
     ,(2, 3,1)
     ,(2, 4,0)
     ,(3, 4,3)
     ,(4, 1,2)
     ,(4, 9,1)
    ;
    
[/code]

