このスキーマでは:
create table object (
obj_id serial primary key,
name varchar(80) not null unique,
description text,
tag_arr int[]
);
create table tag (
tag_id serial primary key,
label varchar(20) not null unique
);
オブジェクトには、任意の数のタグを付けることができます。オブジェクト レコードで簡単に取得できるように、テーブルの代わりにs を配列object X tag
に保持したいと考えています。tag_id
object
の各要素がインデックスになるようにインデックスを作成するにはどうすればよいtar_arr
ですか?
とはいえ、この問題を解決するためのより良い方法はありますか?
討論
これは、次の方法で実現できます。
create table obj_x_tag(
obj_id references object,
tag_id references tag,
constraint obj_x_tag_pk primary key( obj_id, tag_id )
);
select obj_id, name, description, array_agg( tag_id )
from object o
join obj_x_tag x using( obj_id )
group by 1, 2;
しかし、私にとっては、単純にtag_id
s の配列を列に保持し、クロス テーブルとarray_agg()
PostgresQL SQL: Converting results to arrayを使用することが提案されました。問題は、前述のように、「これは実際には個々の配列値にインデックスを付けるのではなく、配列全体にインデックスを付ける」ことです。
intarr
pg のand gist
(or gin
) インデックスを使用することも提案されました。問題-私にとって-インデックスは標準のpgセットベースの配列演算子用であり、配列の1つの要素を見つけるために必ずしも最適化されているわけではなく、ある配列に別の要素が含まれている場合、別の配列と交差しているようです-私にとっては直感に反しますサイズ的にも速度的にも、そのような広い解決策は、そのような狭い問題には正しいということです。また、拡張機能は に限定されているようであり、またはをカバーしておらず、その有用性を制限しています。intarr
int
int64
char