Polymorphic Associationsと呼ばれるデザインを実行しようとしています。 。つまり、外部キーは、いくつかの関連するテーブルのいずれかの行を参照できます。
ただし、外部キー制約は正確に1つのテーブルを参照する必要があります。 Comments
の別の列の値に応じて、異なるテーブルを参照する外部キーを宣言することはできません。 テーブル。これは、リレーショナルデータベース設計のいくつかのルールに違反します。
より良い解決策は、コメントによって参照される一種の「スーパーテーブル」を作成することです。
CREATE TABLE Commentable (
id SERIAL PRIMARY KEY
);
CREATE TABLE Comments (
comment_id SERIAL PRIMARY KEY,
foreign_id INT NOT NULL,
...
FOREIGN KEY (foreign_id) REFERENCES Commentable(id)
);
各コンテンツタイプは、このスーパーテーブルのサブタイプと見なされます。これは、インターフェースのオブジェクト指向の概念に類似しています。 。
CREATE TABLE BlogPosts (
blogpost_id INT PRIMARY KEY, -- notice this is not auto-generated
...
FOREIGN KEY (blogpost_id) REFERENCES Commentable(id)
);
CREATE TABLE UserPictures (
userpicture_id INT PRIMARY KEY, -- notice this is not auto-generated
...
FOREIGN KEY (userpicture_id) REFERENCES Commentable(id)
);
BlogPosts
に行を挿入する前に またはUserPictures
、Commentable
に新しい行を挿入する必要があります 新しい疑似キーIDを生成します。次に、その生成されたIDを使用して、コンテンツをそれぞれのサブタイプテーブルに挿入できます。
これらすべてを実行すると、参照整合性の制約に依存できます。