MySQL-조건부 외래 키 제약
내 앱에 다음과 같은 '댓글'표가 있습니다.
comments
--------
id INT
foreign_id INT
model TEXT
comment_text TEXT
...
이 테이블의 아이디어는 내 앱의 다양한 부분에 대한 주석을 저장하는 것입니다. 즉, 블로그 게시물에 대한 주석을 저장할 수 있습니다.
1|34|blogpost|lorem ipsum...
사용자 사진 :
2|12|picture|lorem ipsum...
등등.
이제 이러한 데이터에 FOREIGN KEY 제약 조건을 강제하는 방법이 있습니까?
즉, 주석 테이블에 다음과 같이 표시됩니다.
FOREIGN KEY (`foreign_id`) REFERENCES blogposts (`id`)
//but only when model='blogpost'
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를 사용할 수 있습니다.
이 모든 작업을 수행하면 참조 무결성 제약 조건에 의존 할 수 있습니다.
참조 URL : https://stackoverflow.com/questions/2002985/mysql-conditional-foreign-key-constraints
'IT TIP' 카테고리의 다른 글
Gmail 용 Chrome 확장 프로그램을 개발하는 방법은 무엇입니까? (0) | 2021.01.08 |
---|---|
사전과 같지만 값이없는 C # 데이터 구조 (0) | 2021.01.07 |
인라인 모델 양식 또는 폼셋이있는 django 클래스 기반 뷰 (0) | 2021.01.07 |
Pusher에 대한 오픈 소스 대안 (0) | 2021.01.07 |
양식 전송 오류, Flask (0) | 2021.01.07 |