抖音提前批二面:为啥不推荐使用外键?

  • 什么是外键?
  • 为什么不推荐使用外键?

大家在学习数据库的过程中一定都接触过外键这个概念,并且在各种课后习题中外键还是一个非常重要的考察内容,但是在实际的企业开发过程中,你会发现外键是被严格禁止使用的,当需要多个表之间进行关联时,做法是冗余相关字段,而不是建立外键

为什么?

什么是外键?

两张表有关联关系,才会涉及外键的概念。举个例子,有两张表;

1)学生表(学生 id、学生姓名)

CREATE TABLE `student` (
  `id` bigint(20unsigned NOT NULL AUTO_INCREMENT COMMENT '学生id',
  `name` varchar(256)  NOT NULL COMMENT '学生姓名',
   PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生表';

2)成绩表(成绩 id、学生 id,分数),对于成绩表来说,学生 id 就是外键

CREATE TABLE `score` (
  `id` bigint(20unsigned NOT NULL AUTO_INCREMENT COMMENT '成绩 id',
  `student_id` bigint(20unsigned NOT NULL COMMENT '学生id',
  `score` int(20unsigned NOT NULL COMMENT '分数'
  PRIMARY KEY (`id`),
  KEY `student_id` (`student_id`),
  CONSTRAINT `fk_student_id` FOREIGN KEY (`student_id`REFERENCES `student` (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成绩表';

如上,我们通过 foreign key ... references ... 来定义外键,将当前表的字段关联到另一张表的某个字段。

外键和主键一样,都是一种约束,外键约束也称为引用约束或引用完整性约束):

  1. 外键列必须引用另一个表中的主键或唯一键列
  2. 外键列必须满足引用完整性,也就是说,它们包含的值必须存在于被引用表的主键或唯一键列中

通俗来说:

  1. 成绩表插入数据时,student_id 必须是学生表已存在的 id
  2. 学生表删除/更新数据时,会自动删除/更新成绩表中引用 student.id 的数据(级联

为什么不推荐使用外键?

阿里的开发手册中提到:

【强制】不得使用外键与级联,一切外键概念必须在应用层解决

定义外键之后,数据库的每次操作都需要去检查外键约束。对于插入来说,影响了插入速度;对于更新来说,级联更新是强阻塞,存在数据库更新风暴(Database Update Storm)的风险

所谓 Database Update Storm,指的是在高并发环境下,多个客户端同时对数据库进行大量的更新操作,存在锁竞争问题甚至死锁,从而导致数据库性能急剧下降或完全崩溃。

另外,当数据量非常大的时候,常见手段是分库分表,但外键通常难以跨越不同数据库来建立联系,数据的一致性更难维护。

因此,外键与级联并不适合分布式、高并发集群,但单机低并发业务可以考虑使用外键保证一致性和完整性

程序汪资料链接

程序汪接私活项目目录,2023年总结

Java项目分享  最新整理全集,找项目不累啦 07版

欢迎添加程序汪微信 itwang007  进粉丝群和朋友圈

相关推荐

  • 今日arXiv最热大模型论文:清华大学发布,结合稳定扩散模型与ControlNet的AI辅助建筑设计方法
  • 一款超强悍、免费文档识别AI工具,开启内测!论文/PPT/书籍/财报等各种文档都能识别解析
  • AI芯片竞争白热化!Meta官宣最新AI推理芯片!性能提升300%,支撑Llama高负载计算
  • 玄学大模型、Google Infini-Transformer新版大模型架构:有趣的大模型进展早报及短视频生成简单项目
  • 来,吃个回旋瓜。。。
  • Nature发布2024年值得关注的七项技术
  • 重磅:2024年QS世界大学学科排名出炉!
  • 面试官常问的那些webpack插件-超详细总结
  • 字节跳动 23 人移送公安机关,开除 136 人!
  • 我成功复刻了安卓 6 的彩蛋!
  • 我做了个代码生成器平台,一键生成项目~
  • 裁员大潮!今年少跳槽,别离职。
  • 阿里大变!退休五年,马云首次发内部信
  • 深信服反腐:开除 42 人、1 人被刑事立案
  • 使用 Transformers 进行概率时间序列预测实战
  • 李彦宏:百度绝不抢开发者饭碗;苹果回应 iPhone「零件序列化」争议 | 极客头条
  • “App 日赚 1050 万美元”,苹果紧急提醒:这可能是系统 Bug!
  • 由Google、OPPO、ARM、华为等大厂程序员贡献的Linux Large Folios大页在社区和产品的现状和未来
  • 大模型浪潮下软件研发如何变革?听听微软、阿里、百度等宝贵实践
  • 用GitHub备份Markdown文档,Git简介