Bạn đang cố gắng thực hiện một thiết kế có tên là Liên kết đa hình . Nghĩa là, khóa ngoại có thể tham chiếu đến các hàng trong bất kỳ bảng nào trong số các bảng có liên quan.
Nhưng một ràng buộc khóa ngoại phải tham chiếu chính xác đến một bảng. Bạn không thể khai báo một khóa ngoại tham chiếu đến các bảng khác nhau tùy thuộc vào giá trị trong một cột khác của Comments
của bạn bàn. Điều này sẽ vi phạm một số quy tắc thiết kế cơ sở dữ liệu quan hệ.
Một giải pháp tốt hơn là tạo một loại "bảng xếp hạng cao" được tham chiếu bởi các nhận xét.
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)
);
Mỗi loại nội dung của bạn sẽ được coi là một loại phụ của bảng xếp hạng cao này. Điều này tương tự với khái niệm hướng đối tượng của giao diện .
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)
);
Trước khi bạn có thể chèn một hàng vào BlogPosts
hoặc UserPictures
, bạn phải chèn một hàng mới vào Commentable
để tạo một id giả mới. Sau đó, bạn có thể sử dụng id đã tạo đó khi chèn nội dung vào bảng loại phụ tương ứng.
Khi bạn làm tất cả những điều đó, bạn có thể dựa vào các ràng buộc toàn vẹn tham chiếu.