Webアプリケーションで、次のように定義された単一の結合テーブルに依存するリレーションシステムを作成しようとしています。
CREATE TABLE associations (
associationId SERIAL PRIMARY KEY,
fromTable varchar(255),
fromId int,
toTable varchar(255),
toId int
);
次に(fromTable, fromId, toTable, toId)
、行ごとに一意になるように作成する必要がありますが、必要なのは、これら4つのフィールドに単純な一意の制約を作成するほど簡単ではありません。
たとえば、このクエリが必要になります
INSERT INTO associations (fromTable, fromId, toTable, toId)
VALUES ('table1', 1, 'table2', 2);
テーブルにタプルまたはの行がすでに含まれている場合は失敗します('table1', 1, 'table2', 2)
('table2', 2, 'table1', 1)
制約を介してこれを達成することは可能ですか、それともデータを挿入する前に手動でチェックを実装する必要がありますか?
編集:
@Germann Arlingtonは、トリガーを使用して両方の方法でリレーションを挿入することを提案しましたが、トリガーをトリガーしたのと同じテーブルに挿入を行うと、これは無限のトリガーループを引き起こしませんか?