3

hstore列のフィールドにインデックスを作成できることは知っています。配列列にGINインデックスを作成することもできます。

しかし、hstore配列にインデックスを作成するための構文は何ですか?

例えば

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

顧客がhstoreを購入すると、次のようなハッシュになる可能性があります。

productId -> 1
price -> 9.99

そして、customer_purchaseshstore[]にそれらの配列があります。

customer.customer_purchases[]->productIdにインデックスを作成したい

これは可能ですか?CREATE INDEX構文のさまざまな組み合わせを試しましたが、hstore配列のインデックスフィールドをサポートしているものはないようです。

4

1 に答える 1

5

あなたはPostgreSQLを誤解していると思いますArray。AnArrayは実際には単なる文字列です。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ここでsを使用しているのですか?

ここに基づいてを作成する必要がある場合は、次のようにします。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これはタイプを理解するための単なる演習ですか?または、実際のデータのこのような難読化をすべて価値のあるものにする実際のユースケースがありますか?

于 2012-04-12T04:14:21.337 に答える