Anda mencoba membuat desain yang disebut Asosiasi Polimorfik . Artinya, kunci asing dapat mereferensikan baris di salah satu dari beberapa tabel terkait.
Tetapi batasan kunci asing harus merujuk tepat satu tabel. Anda tidak dapat mendeklarasikan kunci asing yang mereferensikan tabel yang berbeda bergantung pada nilai di kolom lain Comments
Anda meja. Ini akan melanggar beberapa aturan desain database relasional.
Solusi yang lebih baik adalah membuat semacam "supertable" yang dirujuk oleh komentar.
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)
);
Setiap tipe konten Anda akan dianggap sebagai subtipe dari supertabel ini. Ini analog dengan konsep berorientasi objek dari antarmuka .
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)
);
Sebelum Anda dapat menyisipkan baris ke BlogPosts
atau UserPictures
, Anda harus memasukkan baris baru ke Commentable
untuk menghasilkan id pseudokey baru. Kemudian Anda dapat menggunakan id yang dihasilkan saat Anda memasukkan konten ke tabel subtipe masing-masing.
Setelah Anda melakukan semua itu, Anda dapat mengandalkan batasan integritas referensial.