2

テーブル(postgresql 9.1)を作成する必要があり、行き詰まります。助けてもらえますか?

受信データは、次の2つの形式のいずれかを想定できます。

  1. クライアントID(int)、ショップID(int)、asof(日付)、数量
  2. クライアントID(int)、、 asof(date)、数量

指定された受信CSVテンプレートは次のとおりです。{クライアントID、ショップID、ショップタイプ、ショップジャンル、現在、数量}

最初のケースでは、キーは--client id、shop id、asofです。

2番目のケースでは、キーは-クライアントID、ショップタイプ、ショップジャンル、asofです。

私は次のようなことを試しました:

    create table(
            client_id       int references...,
            shop_id         int references...,
            shop_type       int references...,
            shop_genre      varchar(30),
            asof            date,
            quantity        real,
            primary key( client_id, shop_id, shop_type, shop_genre, asof )
    );

しかし、それから私は問題に遭遇しました。データの形式が1の場合、pkのnullが原因で挿入が失敗します。

クライアント内のクエリは、ショップID、またはショップの種類とジャンルの組み合わせのいずれかで行うことができます。ジャンルでの部分一致または正規表現一致のユースケースはありません。

適切なデザインは何でしょうか?これを2つのテーブルに分割してから、検索結果を結合する必要がありますか?または、欠落している値に0と空白を入れて、先に進むのが通例ですか?

重要な場合は、すべての履歴データがロードされると、テーブルは1億から5億行になると予想されます。

ありがとう。

4

2 に答える 2

3

部分的な一意のインデックス、別名フィルタリングされた一意のインデックス、別名条件付き一意のインデックスを試すことができます。 http://www.postgresql.org/docs/9.2/static/indexes-partial.html

基本的に、一意性はwhere句に基づいてフィルタリングされます。

例(もちろん、正確性とパフォーマンスへの影響をテストします):

CREATE TABLE client(
            pk_id           SERIAL,
            client_id       int,
            shop_id         int,
            shop_type       int,
            shop_genre      varchar(30),
            asof            date,
            quantity        real,
            PRIMARY KEY (pk_id)
    );


  CREATE UNIQUE INDEX uidx1_client
  ON client
  USING btree
  (client_id, shop_id, asof, quantity)
  WHERE client_id = 200;

  CREATE UNIQUE INDEX uidx2_client
  ON client
  USING btree
  (client_id, asof, quantity)
  WHERE client_id = 500;
于 2013-01-24T14:04:16.267 に答える
1

簡単な解決策は、渡されるものに応じてデータを生成するために2つのアルゴリズムのいずれかを使用する主キーのフィールドを作成することです。

完全に正規化されたソリューションが必要な場合は、ショップ情報を2つの別々のテーブルに分割し、外部結合を使用してこのテーブルから参照する必要があります。

postgresで利用可能なテーブル継承を使用できる場合もあります。

于 2013-01-24T07:40:37.710 に答える