복붙노트

[SQL] MySQL의 - 조건부 외래 키 제약 조건

SQL

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'

해결법

  1. ==============================

    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를 사용할 수 있습니다.

    모든 그렇게하면, 당신은 참조 무결성 제약 조건에 의존 할 수 있습니다.

  2. from https://stackoverflow.com/questions/2002985/mysql-conditional-foreign-key-constraints by cc-by-sa and MIT license