Próbujesz stworzyć projekt o nazwie Powiązania polimorficzne . Oznacza to, że klucz obcy może odwoływać się do wierszy w dowolnej z kilku powiązanych tabel.
Ale ograniczenie klucza obcego musi odwoływać się dokładnie do jednej tabeli. Nie możesz zadeklarować klucza obcego, który odwołuje się do różnych tabel w zależności od wartości w innej kolumnie Twoich Comments
stół. Naruszyłoby to kilka zasad projektowania relacyjnych baz danych.
Lepszym rozwiązaniem jest stworzenie czegoś w rodzaju „supertable”, do którego odwołują się komentarze.
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)
);
Każdy z twoich typów treści byłby uważany za podtyp tego superstołu. Jest to analogiczne do koncepcji zorientowanej obiektowo interfejsu .
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)
);
Zanim będziesz mógł wstawić wiersz do BlogPosts
lub UserPictures
, musisz wstawić nowy wiersz do Commentable
aby wygenerować nowy identyfikator pseudoklucza. Następnie możesz użyć tego wygenerowanego identyfikatora podczas wstawiania treści do odpowiedniej tabeli podtypów.
Gdy już to zrobisz, możesz polegać na ograniczeniach integralności referencyjnej.