IT TIP

MySQL-조건부 외래 키 제약

itqueen 2021. 1. 7. 20:17
반응형

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

반응형