使用此架构:
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
);
一个对象可以附加任意数量的标签。object X tag
我希望将s 保留在一个数组中,而不是一个表,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。如前所述,问题在于“这实际上并不索引单个数组值,而是索引整个数组”
还建议使用 pgintarr
和gist
(或gin
)索引。问题 - 对我来说 - 似乎索引是针对标准 pg 基于集合的数组运算符,不一定针对查找数组的一个元素进行优化,而是在一个数组包含另一个元素的位置与另一个数组相交- 对我来说这是违反直觉的也就是说,从规模和速度方面来看,如此广泛的解决方案对于如此狭窄的问题是正确的。此外,intarr
扩展名似乎仅限于int
,不包括int64
或char
,限制了它的有用性。