単一列への複数の外部キー参照
データベース設計では、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 サイトの他の関連記事を参照してください。