对单列的多个外键引用
在数据库设计中,将一个表中的单个列引用为外键是有益的多个其他表中的键。这种方法可以实现跨多个实体的无缝数据关联和一致的数据检索。
问题陈述
考虑以下数据库场景:
您有一个表名为 pdf_created,其中包含 item_type、item_id 和数量列。该表中的每一行代表从 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 列中的每个值都作为主键值出现在四个表(产品、服务、标头)中的至少一个中。但是,无法保证 item_id 始终作为主键同时存在于所有四个表中。
解决方案
虽然无法创建多个foreign尽管对引用不同表的单个列进行键约束,您仍然可以使用 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中文网其他相关文章!