3

Google で検索する用語がわかりませんでした。この質問にタグを付けるか、関連する質問の方法を教えていただければ助かります。

私は典型的な多対多の関係を持っていると信じています:

CREATE TABLE groups (
  id integer PRIMARY KEY);

CREATE TABLE elements (
  id integer PRIMARY KEY);

CREATE TABLE groups_elements (
  groups_id integer REFERENCES groups,
  elements_id integer REFERENCES elements,
  PRIMARY KEY (groups_id, elements_id));

特定の elements_id のセットに対して 1 つの groups_id しか存在できないという制約が必要です。

たとえば、次は有効です。

groups_id | elements_id
        1 | 1
        1 | 2
        2 | 2
        2 | 3

以下は、グループ 1 と 2 が同等になるため、有効ではありません。

groups_id | elements_id
        1 | 1
        1 | 2
        2 | 2
        2 | 1

要素のすべてのサブセットにグループが必要なわけではありませんが (これはパワー セットではありません)、新しいサブセットが形成される場合があります。グループを単一のエンティティとして追加することを実際に話しているので、私の設計が間違っているのではないかと思います。

サブセットを複製するリスクなしに、要素のサブセットの識別子を作成するにはどうすればよいですか?

4

3 に答える 3

1

それは興味深い問題です。

1 つの解決策は、面倒ではありますが、groups_id と elements_id の連結を groups テーブル 1-1-2 に格納し、それを一意のインデックスにすることです。

新しい行を挿入する前に重複するグループを検索しようとすると、パフォーマンスが大幅に低下します。

于 2012-11-01T15:16:08.950 に答える
0

次のクエリは、問題のあるグループ ID を吐き出します。

with group_elements_arr as (
    select groups_id, array_agg(elements_id order by elements_id) elements 
    from group_elements 
    group by groups_id )
select elements, count(*), array_agg(groups_id) offending_groups 
    from group_elements_arr 
    group by elements 
    having count(*) > 1;

のサイズgroup_elementsとその変化率によっては、この行に沿って何かをトリガー ウォッチングに詰め込むことで回避できる場合がありますgroup_elements。それが十分に速くない場合はgroup_elements_arr、トリガーによって管理される実際のテーブルに具体化できます。

そして、新しいグループを簡単に構築するためのトリガーは、 である必要があるFOR EACH STATEMENTと思います。INITIALLY DEFERRED

于 2012-11-01T18:55:03.340 に答える
0

ユーザー ypercube からのこのリンクが最も役に立ちました: unique constraint on a set . 要するに、誰もが言っていることの少しは正しいです。

これはトレードオフの問題ですが、最良の選択肢は次のとおりです。

a) 要素値のハッシュまたはその他の組み合わせをグループ テーブルに追加して一意にし、トリガーを使用してそのテーブルから groups_elements テーブルにデータを入力します。この方法の長所は、groups_elements への裸の更新を拒否する限り、クエリ機能を保持し、制約を適用することです。短所は、複雑さが増し、「一連の要素を一意に表現する方法」などのロジックをデータベースに導入したことです。

b) テーブルをそのままにして、ストアド プロシージャであろうとなかろうと、アクセス レイヤーで groups_elements へのアクセスを制御します。これには、クエリ機能を維持し、データベース自体をシンプルに保つという利点があります。ただし、これは分析制約をアクセス レイヤーに移動していることを意味し、必然的にアクセス レイヤーをより複雑にする必要があることを意味します。もう1つのポイントは、データがどうあるべきかをデータ自体から分離することであり、これには長所と短所があります。セットがすでに存在するかどうかにもっと早くアクセスする必要がある場合は、その問題を個別に解決できます。

于 2012-11-02T12:51:07.157 に答える