复合键类型上的PostgreSQL索引+;范围
考虑以下SQL:复合键类型上的PostgreSQL索引+;范围,postgresql,indexing,composite,postgresql-9.6,composite-types,Postgresql,Indexing,Composite,Postgresql 9.6,Composite Types,考虑以下SQL: create type kv AS ( key int4, val int4range ); create table test ( id serial primary key, data kv[] not null ); insert into test (data) values (array[(1, '[10,20]'),(2, '[30,40]')]::kv[]) 我希望能够查询(伪代码)“给我所有ID,其中键是1,其值重叠5到15,键是2
create type kv AS
(
key int4,
val int4range
);
create table test
(
id serial primary key,
data kv[] not null
);
insert into test (data)
values (array[(1, '[10,20]'),(2, '[30,40]')]::kv[])
我希望能够查询(伪代码)“给我所有ID,其中键是1
,其值重叠5到15
,键是2
,其值重叠38到60
,等等
这可能吗
我添加了以下内容以允许对值进行索引,但它不正确,因为它忽略了键:
CREATE OPERATOR CLASS gin_int4range_ops
DEFAULT FOR TYPE int4range[] USING gin AS
OPERATOR 1 =(anyrange,anyrange),
FUNCTION 1 lower(anyrange),
FUNCTION 2 upper(anyrange),
FUNCTION 3 isempty(anyrange),
FUNCTION 4 lower_inc(anyrange),
FUNCTION 5 upper_inc(anyrange);
create index ix_test on test using gin (data->val gin_int4range_ops); << error & needs to include the key
创建操作员类gin\u int4range\u ops
使用gin作为类型int4range[]的默认值
运算符1=(任意范围,任意范围),
功能1降低(任何范围),
功能2上限(任意范围),
函数3为空(任意范围),
功能4 lower_inc(任何范围),
功能5 upper_inc(任何范围);
使用gin(data->val gin_int4range_ops)在测试中创建索引ix_test;注意:将列命名为与其类型相同的列至少会让人困惑。这很公平。我编辑了它,我感觉您的键实际上是一个自然/候选键(duh!),因此它不应该隐藏在UDT blob中。它违反1NF(和2NF)在标准形式下,这显然很简单。我试图利用PG的数组和外来索引。通过函数和触发器实现规范化很简单。