Опитвате се да направите дизайн, който се нарича Полиморфни асоциации . Тоест външният ключ може да препраща към редове в която и да е от няколко свързани таблици.
Но ограничението за външен ключ трябва да се отнася точно до една таблица. Не можете да декларирате външен ключ, който препраща към различни таблици в зависимост от стойността в друга колона на вашите 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
за генериране на нов идентификатор на псевдоключ. След това можете да използвате този генериран идентификатор, докато вмъквате съдържанието в съответната таблица на подтипове.
След като направите всичко това, можете да разчитате на ограниченията на референтната цялост.