PostgreSQL hstore数组列的索引

时间:2012-04-11 22:57:42

标签: postgresql indexing hstore

我知道您可以在hstore列中的字段上创建索引。 我知道你也可以在数组列上创建一个GIN索引。

但是在hstore数组上创建索引的语法是什么?

e.g。

CREATE TABLE customer (
    pk serial PRIMARY KEY,
    customer hstore,
    customer_purchases hstore[]
);

假设客户购买hstore可能是像

这样的哈希
productId -> 1
price -> 9.99

我在customer_purchases hstore []

中有一组数组

我想在customer.customer_purchases [] - >上创建索引的productId

这可能吗?我尝试过不同的CREATE INDEX语法组合,但它们似乎都不支持hstore数组中的索引字段。

1 个答案:

答案 0 :(得分:5)

我认为你误解了PostgreSQL ArrayArray实际上只是一个字符串。您无法为数组中的对象(在本例中为HSTORE s)编制索引,因为它不是TABLE

相反,创建一个额外的表:

CREATE TABLE customer (
    pk bigserial PRIMARY KEY,
    customer hstore
);

CREATE TABLE purchases (
    pk bigserial PRIMARY KEY,
    customer_pk bigint not null,
    purchase hstore not null,
    constraint "must be a valid customer!" 
        foreign key (customer_pk) references customer(pk)
);

另外,你为什么在这里使用HSTORE

如果必须根据INDEX "purchase"创建HSTORE,请执行以下操作:

CREATE OR REPLACE FUNCTION purchase_amount(purchase hstore) returns float as $$
    select ($1 -> 'price')::float;
$$ language 'SQL' IMMUTABLE;

CREATE INDEX "purchases by price" ON purchases (purchase_amount(purchase));

这仅仅是了解HSTORE类型的练习吗?或者你是否有一些真正的用例会使你对真实数据的所有混淆都值得吗?