2017-11-25 8 views
0

私はスキーマを設計しようとしている(Postgresのではなく、罰金、他のSQLの)次の要件をサポートします。PostgreSQLの - キーと値のペアの正規化

  • 各文書(表documentsの行)を持っています一意のストリングID(idフィールド)および他のいくつかのデータフィールド。
  • 各ドキュメントには、0個以上のタグ(文字列のキーと値のペア)を付けることができます。その目的は、文字列のキーと値のペアを使用してドキュメントを並べ替えたりフィルタしたりできるシステムを構築することです。例えば。 『VALUE1『と 『キー1』値とのタグ値使用して出力をソート』KEY3を「私のタグを持っているすべての文書を表示する』

だから、DDLは次のようになります。(簡体字)

create table documents 
(
    id char(32) not null 
    constraint documents_pkey 
    primary key, 
    data varchar(2000), 
    created_at timestamp, 
    updated_at timestamp 
) 

create table document_tags 
(
    id serial not null 
    constraint document_tags_pkey 
    primary key, 
    document_id char(32) not null 
    constraint document_tags_documents_id_fk 
    references documents 
    on update cascade on delete cascade, 
    tag_key varchar(200) not null, 
    tag_value varchar(2000) not null 
) 

タグキー値を使用してフィルタリング/並べ替えを行うクエリを作成するにはどうすればよいですか?"key1" = "value1"タグを持つすべてのドキュメント(LIMIT/OFFSET付き) key3 "タグの値でソートされた" key2 "=" value2 "タグ

答えて

1

group byhaving

select dt.document_id 
from document_tags dt 
where dt.tag_key = 'key1' and dt.tag_value = 'value1' 
group by dt.document_id 
order by max(case when dt.tag_key = 'key2' then dt.tag_value end); 
+0

このクエリにはどのようなインデックスを追加しますか? –

+1

最適なインデックスは 'document_tags(tag_key、tag_value、document_id)'です。 –

関連する問題