1

あるテーブルの行が別のテーブルの行と一致する必要があることを強制したいのですが、その逆も同様です。私は現在、まだ作成されていないテーブルを参照できないという事実を回避するために、このようにしています。私が気付いていないもっと自然な方法はありますか?

CREATE TABLE LE (id int PRIMARY KEY);
CREATE TABLE LE_TYP (id int PRIMARY KEY, typ text);

ALTER TABLE LE ADD CONSTRAINT
  twowayref FOREIGN KEY (id) REFERENCES LE_TYP (id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE LE_TYP ADD CONSTRAINT
  twowayref_rev FOREIGN KEY (id) REFERENCES LE (id) DEFERRABLE INITIALLY DEFERRED;
4

1 に答える 1

0

あなたがしていることは、循環制約がある場合に理想的です。あなたのソリューションで改善できるものは何もありません。

ただし、次の読者のために簡単に言及する価値のある 2 つのポイントがあります。1 つ目は、コード内でこのソリューションを使用すると、その順序を選択する理由が明らかでないことです。これを行っている場合は、おそらくどの制約が延期されるかについて注意する必要があります。通常、これは明らかですが、適切なテーブルを参照する他の外部キーに基づいて挿入順序を選択することをお勧めします。

もう 1 つは、循環依存関係をエンジニアリングすることが望ましいかどうかという考え方です。一方で、そうすることは明らかな単純化のように思えるとき、それは良い考えのように思えるかもしれません.

ただし、このような場合は、代わりに複数のテーブルの継承を確認することをお勧めします。このようにして、次のことができます。

CREATE TABLE p1 (
     id serial not null,
     attribute1 int not null,
     attribute2 text not null,
     check (attribute1 > 1 or length(attribute2) > 10)
);

CREATE TABLE p2 (
     id int not null, -- shared primary key with p1
     attribute3 int not null,
     attribute4 text not null
);

CREATE TABLE combined (
     primary key (id)
) INHERITS (p1, p2);

これにより、すべての列が 1 つのテーブルに配置されますが、共通のフィールドで結合された 2 つのテーブルであるかのように、そのテーブルへの論理インターフェイスが提供されます。

于 2013-04-17T14:24:47.197 に答える