ホームページ > データベース > 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?

単一列への複数の外部キー参照

データベース設計では、1 つのテーブル内の単一列を外部キーとして参照すると有益な場合があります。他の複数のテーブルのキー。このアプローチにより、複数のエンティティにわたるシームレスなデータの関連付けと一貫したデータの取得が可能になります。

問題ステートメント

次のデータベース シナリオを考えてみましょう:

テーブルがあります。 pdf_created という名前で、列 item_type、item_id、および数量があります。このテーブルの各行は、PDF ドキュメントから抽出されたアイテムを表します。 item_type 列はアイテムのタイプを識別します (例: 製品の場合は「1」、テンプレート ヘッダーの場合は「2」)。 item_id 列は、対応するアイテム テーブル (製品、サービス、ヘッダーなど) の主キーを参照します。目標は、product、service、header の 3 つの項目テーブルすべてで 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 つのテーブル (製品、サービス、ヘッダー) の少なくとも 1 つに主キー値として存在することが保証されます。ただし、item_id が常に 4 つのテーブルすべてに同時に主キーとして存在することを保証することは不可能です。

解決策

複数の外部テーブルを作成することはできませんが、異なるテーブルを参照する 1 つの列にキー制約がある場合でも、item_id 列を使用して 3 つの項目テーブルを参照できます。 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート