집 >데이터 베이스 >MySQL 튜토리얼 >SQL의 순환 참조 제약 조건은 유효하며 어떻게 해결할 수 있습니까?
SQL의 순환 참조 제약 조건: 복잡성 탐색
데이터베이스 설계에서는 외래 키 제약 조건을 통해 테이블 간의 관계를 설정하는 것이 일반적입니다. 그러나 테이블이 루프에서 서로 참조하여 순환 종속성을 생성하는 경우 이러한 스키마가 유효한지 질문이 제기됩니다.
두 테이블이 있는 다음 스키마를 고려하세요. products 및 products_pictures, 서로 참조:
CREATE TABLE products ( ID int(10) unsigned NOT NULL AUTO_INCREMENT, DEFAULT_PICTURE_ID int(10) unsigned DEFAULT NULL, FOREIGN KEY (DEFAULT_PICTURE_ID) REFERENCES products_pictures (ID) ON DELETE SET NULL ON UPDATE SET NULL ); CREATE TABLE products_pictures ( ID int(10) unsigned NOT NULL AUTO_INCREMENT, PRODUCT_ID int(10) unsigned NOT NULL, FOREIGN KEY (PRODUCT_ID) REFERENCES products (ID) ON DELETE CASCADE );
이 디자인에서 products.DEFAULT_PICTURE_ID는 다음을 나타냅니다. products_pictures.ID 및 products_pictures.PRODUCT_ID는 다시 products.ID를 참조하여 순환 참조를 생성합니다.
전문가들 사이의 일반적인 합의는 데이터베이스 스키마의 순환 참조는 권장되지 않는다는 것입니다. . 삽입 및 업데이트와 같은 데이터베이스 작업을 수행할 때 복잡성과 불일치가 발생할 수 있습니다.
옵션 1: Null 허용 외래 키 열
이 문제를 해결하기 위한 한 가지 옵션은 다음과 같습니다. 두 개의 외래 키 열이 null을 허용하는 경우 یکی اз를 허용합니다. 이는 어떤 테이블에 데이터를 먼저 삽입할지의 "닭과 달걀" 문제를 해결합니다. 그러나 제품이 다른 제품에 속한 기본 그림을 가질 수 있는 데이터 무결성 문제가 발생합니다.
옵션 2: IsDefault 열
또 다른 접근 방식은 제거하는 것입니다. 제품의 DEFAULT_PICTURE_ID 열을 삭제하고 products_pictures에 IsDefault 비트 열을 추가합니다. 이렇게 하면 제품당 하나의 그림만 IsDefault 비트를 설정할 수 있습니다.
옵션 3: 연기 가능한 제약 조건
지연 가능한 제약 조건을 사용하면 특정 제약 조건을 나중에 확인하고 적용할 수 있습니다. 순환 참조 문제. 이 옵션은 MySQL에서 지원되지 않습니다.
옵션 4: 기본 그림에 대한 별도 테이블
순환 종속성을 제거하고 데이터 무결성을 보장하려면 다음과 같은 별도의 테이블을 생성하는 것이 좋습니다. 제품-기본 사진 관계를 저장하는 product_default_picture로. 이 접근 방식을 사용하면 두 외래 키 열 모두 Null을 허용하지 않을 수 있습니다.
결론적으로 순환 참조는 일부 데이터베이스 시스템에서 기술적으로 유효할 수 있지만 일반적으로 권장되지 않습니다. MySQL 스키마의 순환 참조를 처리하고 데이터 무결성을 보장하려면 위에 제시된 옵션을 고려하십시오.
위 내용은 SQL의 순환 참조 제약 조건은 유효하며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!