网站首页 > 技术文章 正文
Boot+Cloud项目学习:macrozheng.com
大家在学习数据库的过程中一定都接触过外键这个概念,并且在各种课后习题中外键还是一个非常重要的考察内容,但是在实际的企业开发过程中,你会发现外键是被严格禁止使用的,当需要多个表之间进行关联时,做法是冗余相关字段,而不是建立外键。
为什么?
什么是外键?
两张表有关联关系,才会涉及外键的概念。举个例子,有两张表;
1)学生表(学生 id、学生姓名)
CREATE TABLE`student` (
`id`bigint(20) unsignedNOTNULL AUTO_INCREMENT COMMENT'学生id',
`name`varchar(256) NOTNULLCOMMENT'学生姓名',
PRIMARY KEY (`id`)
) ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COMMENT='学生表';
2)成绩表(成绩 id、学生 id,分数),对于成绩表来说,学生 id 就是外键
CREATE TABLE`score` (
`id`bigint(20) unsignedNOTNULL AUTO_INCREMENT COMMENT'成绩 id',
`student_id`bigint(20) unsignedNOTNULLCOMMENT'学生id',
`score`int(20) unsignedNOTNULLCOMMENT'分数'
PRIMARY KEY (`id`),
KEY`student_id` (`student_id`),
CONSTRAINT`fk_student_id`FOREIGNKEY (`student_id`) REFERENCES`student` (`id`)
) ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COMMENT='成绩表';
如上,我们通过 foreign key ... references ...
来定义外键,将当前表的字段关联到另一张表的某个字段。
外键和主键一样,都是一种约束,外键约束也称为引用约束或引用完整性约束):
-
外键列必须引用另一个表中的主键或唯一键列 -
外键列必须满足引用完整性,也就是说,它们包含的值必须存在于被引用表的主键或唯一键列中
通俗来说:
-
成绩表插入数据时,student_id 必须是学生表已存在的 id -
学生表删除/更新数据时,会自动删除/更新成绩表中引用 student.id 的数据(级联)
这或许是一个对你有用的开源项目,mall项目是一套基于 SpringBoot3 + Vue 的电商系统(Github标星60K),后端支持多模块和 2024最新微服务架构 ,采用Docker和K8S部署。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能!
项目演示:
为什么不推荐使用外键?
阿里的开发手册中提到:
【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
定义外键之后,数据库的每次操作都需要去检查外键约束。对于插入来说,影响了插入速度;对于更新来说,级联更新是强阻塞,存在数据库更新风暴(Database Update Storm)的风险。
所谓 Database Update Storm,指的是在高并发环境下,多个客户端同时对数据库进行大量的更新操作,存在锁竞争问题甚至死锁,从而导致数据库性能急剧下降或完全崩溃。
另外,当数据量非常大的时候,常见手段是分库分表,但外键通常难以跨越不同数据库来建立联系,数据的一致性更难维护。
因此,外键与级联并不适合分布式、高并发集群,但单机低并发业务可以考虑使用外键保证一致性和完整性。
Github上标星11K
的微服务实战项目mall-swarm,全套 视频教程(2024最新版) 来了!全套教程约26小时,共59期
,如果你想学习目前最新的微服务技术栈
,同时提高自己微服务项目的开发能力
的话,不妨了解下,下面是项目的整体架构图,感兴趣的小伙伴可以点击链接 mall-swarm视频教程 加入学习。
整套 视频教程 的内容还是非常完善的,涵盖Spring Cloud核心组件、微服务项目实战、Kubernetes容器化部署等内容,你也可以点击链接 mall-swarm视频教程 了解更多内容。
猜你喜欢
- 2025-07-23 MySql:索引的基本使用(mysql中索引)
- 2025-07-23 阿里二面差点败在这道题:MySQL自增主键为何不是连续的呢?
- 2025-07-23 浅聊MySQL索引分类(mysql索引的几种类型)
- 2025-07-23 智能排产新标杆:注塑车间全自动排程表设计升级-2
- 2025-07-23 如何选择数据库,生活中还有比SQL更重要的东西
- 2025-07-23 access利用DAO设置数据表的主键(access数据库中如何设置主键)
- 2025-07-23 详解MySQL数据库设计之innodb如何设计主键索引
- 2025-07-23 保障数据完整性:深入解析Oracle数据库的主键和外键约束
- 2025-07-23 P7领导建议:可以用UUIDv7作为数据库主键
- 2025-07-23 同样都是做手机 Home 键,为何它们三个差距会那么大?
- 1518℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 606℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 522℃MySQL service启动脚本浅析(r12笔记第59天)
- 490℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 489℃启用MySQL查询缓存(mysql8.0查询缓存)
- 477℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 457℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 454℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)