> 데이터 베이스 > MySQL 튜토리얼 > 데이터베이스 디자인에서 단일 열에 대한 여러 외래 키 참조를 어떻게 처리할 수 있습니까?

데이터베이스 디자인에서 단일 열에 대한 여러 외래 키 참조를 어떻게 처리할 수 있습니까?

Patricia Arquette
풀어 주다: 2025-01-01 03:19:11
원래의
870명이 탐색했습니다.

How Can Multiple Foreign Key References to a Single Column Be Handled in Database Design?

단일 열에 대한 여러 외래 키 참조

데이터베이스 설계에서는 한 테이블의 단일 열을 외래 키로 참조하는 것이 유리할 수 있습니다. 다른 여러 테이블의 키. 이 접근 방식을 사용하면 여러 엔터티에서 원활한 데이터 연결과 일관된 데이터 검색이 가능합니다.

문제 설명

다음 데이터베이스 시나리오를 고려하세요.

테이블이 있습니다. item_type, item_id 및 수량 열을 사용하여 pdf_created라고 합니다. 이 테이블의 각 행은 PDF 문서에서 추출된 항목을 나타냅니다. item_type 열은 항목 유형을 식별합니다(예: 제품은 '1', 템플릿 헤더는 '2'). item_id 열은 해당 항목 테이블(예: 제품, 서비스, 헤더)의 기본 키를 참조합니다. 목표는 세 가지 항목 테이블(제품, 서비스, 헤더) 모두에서 item_id 열을 외래 키로 참조하는 것입니다.

그러나 다음 SQL 코드는 원하는 관계를 생성하지 못합니다.

CREATE TABLE `pdf_created` (
    `id` INT(10) UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
    `pdf_id` INT(10) NOT NULL,
    `item_type` INT(3) UNSIGNED NOT NULL,
    `item_id` INT(10) UNSIGNED NOT NULL,
    `quantity` INT(3) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `FK_pdf_id` (`pdf_id`),
    CONSTRAINT `FK_pdf_id` FOREIGN KEY (`pdf_id`) REFERENCES `pdf` (`id`),
    KEY `FK_item_type` (`item_type`),
    CONSTRAINT `FK_item_type` FOREIGN KEY (`item_type`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    KEY `FK_item_id` (`item_id`),
    CONSTRAINT `FK_item_id` FOREIGN KEY (`item_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT `FK_item_id` FOREIGN KEY (`item_id`) REFERENCES `service` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT `FK_item_id` FOREIGN KEY (`item_id`) REFERENCES `header` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
로그인 후 복사

실패 이유

문제는 item_id 열의 다중 외래 키 제약 조건에 있습니다. 외래 키 제약 조건은 item_id 열의 모든 값이 4개 테이블(제품, 서비스, 헤더) 중 하나 이상에 기본 키 값으로 존재하도록 보장합니다. 그러나 item_id가 항상 4개의 테이블 모두에 동시에 기본 키로 존재한다고 보장하는 것은 불가능합니다.

해결 방법

여러 개의 외부 키를 생성하는 것은 불가능하지만 서로 다른 테이블을 참조하는 단일 열에 대한 키 제약 조건이 있어도 item_id 열을 사용하여 세 개의 항목 테이블을 참조할 수 있습니다. item_id 열의 모든 외래 키 제약 조건을 제거하고 애플리케이션 코드를 사용하여 참조 무결성을 강화합니다.

CREATE TABLE `pdf_created` (
    `id` INT(10) UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
    `pdf_id` INT(10) NOT NULL,
    `item_type` INT(3) UNSIGNED NOT NULL,
    `item_id` INT(10) UNSIGNED NOT NULL,
    `quantity` INT(3) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `FK_pdf_id` (`pdf_id`),
    CONSTRAINT `FK_pdf_id` FOREIGN KEY (`pdf_id`) REFERENCES `pdf` (`id`),
    KEY `FK_item_type` (`item_type`),
    CONSTRAINT `FK_item_type` FOREIGN KEY (`item_type`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
로그인 후 복사

이렇게 하면 데이터 무결성 오류가 발생하지 않고 필요한 데이터 관계를 유지할 수 있습니다.

위 내용은 데이터베이스 디자인에서 단일 열에 대한 여러 외래 키 참조를 어떻게 처리할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿