Polymorphic Associations 라는 디자인을 시도하고 있습니다. 즉, 외래 키는 여러 관련 테이블의 행을 참조 할 수 있습니다.
그러나 외래 키 제약 조건은 정확히 하나의 테이블을 참조해야합니다. 테이블의 다른 열에있는 값에 따라 다른 테이블을 참조하는 외래 키를 선언 할 수 없습니다 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
새로운 pseudokey ID를 생성 할 수 있습니다. 그런 다음 해당 하위 유형 테이블에 콘텐츠를 삽입 할 때 생성 된 ID를 사용할 수 있습니다.
이 모든 작업을 수행하면 참조 무결성 제약 조건에 의존 할 수 있습니다.
출처
https://stackoverflow.com/questions/2003047