2016-04-05 5 views
0

私はこのような3つのテーブルを持っています。 EAV SQLデザインでのクエリ

 Entity_AttrVal 
    |e_id|av_id| 
    | 1 | 1 | 
    | 1 | 3 | 
    | 2 | 2 | 
    | 2 | 5 | 
    | 3 | 1 | 
    | 3 | 4 | 
    | 3 | 6 | 

 AttributeValue_Table 
|av_id|prop_name |prop_value| 
|1 | color | black | 
|2 | color | white | 
|3 | wing size| 7"  | 
|4 | whiskers | long  | 
|5 | whiskers | short | 
|6 | random | anything | 


 Entity_Table 
|e_id|e_name|e_type |e_tenant| 
|1 | Bob | bird | owner_1| 
|2 | Joe | cat | owner_1| 
|3 | Joe | cat | owner_2| 
私は何をすることができるようにしたいことはあるようなもの 'の実体を見つける場所e_name =' 短い=ジョー」と色=黒ひげ。

は私はつのプロパティの動作に照会、各行がエンティティ情報と共に、1小道具/値を有する結果セットを取得することができます。しかし、私は任意のNのプロパティを行うことができる必要があります。このようなことをするにはどうすればいいですか?

私は列か何か

EDIT2など、すべてのプロパティを持つテーブルを結合構築することができます:私はあなたがそれぞれの名前/値の組み合わせのための述語を追加する必要があり、この

SELECT et.e_id, et.e_name, et.e_type 
FROM Entitiy_table et 
LEFT JOIN Entity_AttrVal j ON et.e_id = j.e_id 
RIGHT JOIN AttributeValue_Table at ON at.av_id = j.av_id 
WHERE (av.prop_name='color' AND av.prop_value='white') OR (av.prop_name='whiskers' AND av.prop_value='long') 
GROUP BY et.e_id, et.e_name, et.e_type 
HAVING COUNT(*) = 2; 
+2

「任意のプロパティを実行する」とはどういう意味ですか?あなたの現在のクエリは何ですか?何が返され、何を返すのですか? –

+3

N個の属性を持つ結果を得るには、テーブルをN回結合する必要があります。それは、EAVデータモデルが苦痛を感じている理由の1つです。新しい述語を追加するには、もう1組の結合を追加する必要があります。これにより、クエリが遅くなり、遅くなります。 –

答えて

2

ような何かを行うことができますように見えますが:

SELECT <whatever you need> 
    FROM Entity_Table et 
    WHERE et.e_name = 'Joe' 
    AND EXISTS (SELECT 1 
        FROM AttributeValue_Table avt 
        JOIN Entity_AttrVal ea ON ea.e_id = et.e_id 
        WHERE ea.a_id = avt.av_id 
        AND avt.prop_name = 'color' 
        AND avt.prop_value = 'black') 
    AND EXISTS (SELECT 1 
        FROM AttributeValue_Table avt 
        JOIN Entity_AttrVal ea ON ea.e_id = et.e_id 
        WHERE ea.a_id = avt.av_id 
        AND avt.prop_name = 'whiskers' 
        AND avt.prop_value = 'short') 

(私はSQL Serverの方言が輝いている場合謝罪)

任意の数の比較を行うには、SQLを生成して実行する必要があります。

EAVは痛み(実際には反パターン)であることを示していますが、経験によっては、リレーショナルデータベースにバインドされている場合には代替手段がないことがあります。

+0

は私がhttp://dba.stackexchange.com/questions/68679/efficient-query-for-an-advanced-eav-model – user1738539

+0

専用属性*値*をフィルタリングするために思われること、ここで同様の問題を発見し、ない値特定の名前のために。この例の後に、*または*の値が黒か短いかがわかります。 –

+0

そして、あなたの質問に追加した例では、ANDではなく、ある値または別の値を持つエンティティを見つけることができます。 –

関連する問題