2

テーブルのこの表現を想定すると:

db親/子テーブル

Objectは、他の4つの子テーブルすべてのobjectidを保持する「親」テーブルです。
'something'テーブルには、objectid列があるほかに、linked_to_objectid列も含まれます。この列は、object1およびobject2からのobjectidのみを指します(object3からではありません)。

私の問題は、linked_to_objectidがobject3からのものでない場合、行を挿入するたびにチェックする必要があることです。

別の方法は、objectidがどのタイプのオブジェクトであるかを説明する別の列をオブジェクトテーブルに追加することです...しかし、これは間違っていると思います。

このモデルが正規形の規則に違反していることは知っていますが、他の方法を見つけることができません。
誰かが私を助けて、これをモデル化するための最良の方法を見つけることができますか?

4

1 に答える 1

4

あなたの答えは、相互の主キー/外部キーを使用し、主キーの一部をテーブル間で分割することだと思います。

 CREATE TABLE object_class (
     id int not null unique, -- hand assigned
     label text not null primary key
 );

 CREATE TABLE object (
     object_id bigserial not null primary key,
     class_id int not null references object_class(id),
     ...., 
     UNIQUE (object_id, class_id)
 );

 CREATE TABLE object1 (
      object_id bigint not null,
      class_id bigint not null,
      .....
      check(class_id = 1),
      primary key (object_id, class_id),
      foreign key (object_id, class_id) references object(object_id, class_id)
 );

 etc.

PostgreSQL を使用している場合は、おそらくテーブルの継承と制約トリガーを使用して、少しクリーンなものを実装できますが、それは比較的高度なものです。

于 2012-09-22T14:12:08.627 に答える