[SQL] MySQL의 - 조건부 외래 키 제약 조건
SQLMySQL의 - 조건부 외래 키 제약 조건
나는 내 응용 프로그램에 주석 테이블을 다음 있습니다 :
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'
해결법
-
==============================
1.당신은 다형성 협회이라고 디자인을 시도하고 있습니다. 즉, 외래 키는 여러 관련 테이블의 행을 참조 할 수있다.
당신은 다형성 협회이라고 디자인을 시도하고 있습니다. 즉, 외래 키는 여러 관련 테이블의 행을 참조 할 수있다.
그러나 외래 키 제약 조건은 정확히 하나의 테이블을 참조해야합니다. 당신은 참조 다른 테이블이 댓글 테이블의 다른 열에서 값에 따라하는 외래 키를 선언 할 수 없습니다. 이 관계형 데이터베이스 설계의 몇 가지 규칙을 위반하는 것입니다.
더 나은 솔루션은 코멘트에 의해 참조되는 "퍼"의 종류를 확인하는 것입니다.
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) );
당신은 블로그 게시물 또는 UserPictures에 행을 삽입하기 전에, 당신은 새로운 pseudokey ID를 생성하는 Commentable에 새 행을 삽입해야합니다. 당신은 각각의 하위 테이블에 내용을 삽입 그런 다음 당신은 생성 된 ID를 사용할 수 있습니다.
모든 그렇게하면, 당신은 참조 무결성 제약 조건에 의존 할 수 있습니다.
from https://stackoverflow.com/questions/2002985/mysql-conditional-foreign-key-constraints by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL의에서 "전체 단어 일치"검색 (0) | 2020.03.23 |
---|---|
[SQL] 값이 숫자는 MySQL의에있는 경우 감지 (0) | 2020.03.23 |
[SQL] 어떻게 포스트 그레스에서 CSV 파일의 값으로 선택된 행을 업데이트? (0) | 2020.03.23 |
[SQL] 테이블 변수에 인덱스를 생성 (0) | 2020.03.23 |
[SQL] 페이징을 구현하는 효율적인 방법 (0) | 2020.03.23 |