首页 > 数据库 > 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?

对单列的多个外键引用

在数据库设计中,将一个表中的单个列引用为外键是有益的多个其他表中的键。这种方法可以实现跨多个实体的无缝数据关联和一致的数据检索。

问题陈述

考虑以下数据库场景:

您有一个表名为 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板