SQL의 순환 참조: 딜레마
관계형 데이터베이스 설계 영역에서 다음과 같은 질문이 제기됩니다. 서로 참조? 안타깝게도 대답은 사용 중인 특정 데이터베이스 관리 시스템(DBMS)과 원하는 기능에 따라 다릅니다.
문제
주어진 데이터베이스 구조 예시에 예시된 바와 같이 , 두 테이블, products 및 products_pictures에는 순환 참조를 생성하는 외래 키 제약 조건이 있습니다.
products.DEFAULT_PICTURE_ID -> products_pictures.ID products_pictures.PRODUCT_ID -> products.ID
이 순환성은 다음과 같은 결과를 가져올 수 있습니다. 특히 MySQL의 문제를 해결합니다.
가능한 해결 방법
옵션 1: 조정 가능한 외래 키 Null 허용 여부
한 가지 해결책은 다음과 같습니다. 외래 키 열 중 하나를 null 허용으로 만듭니다. 이를 통해 무결성 제약 조건을 위반하지 않고 두 테이블 모두에 대한 초기 INSERT가 허용됩니다. 그러나 제품이 다른 제품에 속하는 기본 그림을 갖도록 허용하는 등 데이터 무결성 문제가 발생할 수 있습니다. 이 문제를 해결하기 위해 외래 키 제약 조건을 다음과 같이 정의할 수 있습니다.
CONSTRAINT FK_products_1 FOREIGN KEY (id, default_picture_id) REFERENCES products_pictures (product_id, id) ON DELETE RESTRICT ON UPDATE RESTRICT
옵션 2: IsDefault 플래그
또 다른 접근 방식은 DEFAULT_PICTURE_ID 열을 바꾸는 것입니다. products_pictures 테이블에 IsDefault 플래그가 있는 제품 테이블. 이 솔루션에서는 제품당 하나의 그림에만 IsDefault 플래그가 true로 설정되도록 고유 제약 조건이나 인덱스를 정의해야 합니다. 그러나 MySQL은 부분 인덱스를 지원하지 않으므로 이 접근 방식은 실용적이지 않습니다.
옵션 3: 지연 가능한 제약 조건
이 옵션에는 지연 가능한 제약 조건을 사용하는 것이 포함됩니다. 지연 가능한 제약 조건을 사용하면 데이터베이스가 무결성 제약 조건 적용을 일시적으로 지연하여 테이블과 해당 관계의 초기 설정이 가능해집니다. 그러나 MySQL은 연기 가능한 제약 조건을 지원하지 않습니다.
옵션 4: 중간 테이블
순환 참조를 완전히 제거하기 위해 세 번째 테이블을 도입할 수 있습니다.
product_default_picture ---------------------- product_id NOT NULL default_picture_id NOT NULL PRIMARY KEY (product_id) FOREIGN KEY (product_id, default_picture_id) REFERENCES products_pictures (product_id, id)
이러한 접근 방식은 순환성을 제거하고 데이터를 보장합니다. 무결성.
MySQL 권장 사항
MySQL의 경우 두 가지 옵션이 여전히 실행 가능합니다.
위 내용은 특히 MySQL에서 SQL의 순환 참조를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!