是否使用外键约束

【强制】不得使用外键与级联,一切外键概念必须在应用层解决.-《阿里Java规范》

首先外键(Foreign Key)是什么东西

使用方案

假设有一个score表 id是自增id,score是分数,student_id是学号。

另一个student表,id是自增id,name是名字,student_id是学号。

那么设计这个的时候就希望有一个关联关系,让score的student_id指向student表的student_id,存在一个学生对应多个成绩的关系。所以我可以使用以下SQL语句

ALTER TABLE score
ADD CONSTRAINT FOREIGN KEY (student_id)
REFERENCES student(student_id);

创建一个外键索引完成这个规则

完成后的表关系如下

外键原理

被指向的字段,具有唯一性

可以保证成绩字段的一致性,即每一次插入一个score数据,首先要检测是否student表存在这个id,保证一致性

如果在外键类型上使用CASCADE,则会保证在做更新和删除sutudent表的student_id时,触发一次级联操作,会同步更新score表的student_id或者删除student_id.

外键类型RESTRICT 也同样会做一次检测,但不会做级联操作,而是直接拒绝操作。

场景思考

知道外键是什么后,我们来思考一个场景:

现在有一个电商系统,用户有一个账户id,商品有一个商品id,这两个字段和订单绑定,此时订单id和账户表ID构成一个外键关系,同时和商品表id也构成一个外键关系,那么我每次生成一笔订单,就需要向另外两张表查询检测一次数据,那么就存在几个问题:

  • 增删改触发这个查询操作的性能消耗,服务器系统是否允许
  • 在其他表查询会上需要对其他表做一个内部锁,是否存在高并发死锁情况
  • 数据一致性全部交给数据库服务器,数据库服务器是否能够承受

这些问题在互联网公司会显得格外严重,因为访问流量大的时候以上问题基本上是完全无法得到MySQL系统本身解决的

同时在做分库分表设计的时候,外键约束就会显得格外离谱。

同时MySQL系统的外键设计是背离部分SQL标准的

引用自博客园Eden: (https://www.cnblogs.com/discuss/articles/1862244.html)

对SQL标准的背离:如果ON UPDATE CASCADE或ON UPDATE SET NULL递归更新相同的表,之前在级联过程中该表一被更新过,它就象RESTRICT一样动作。这意味着你不能使用自引用ON UPDATE CASCADE或者ON UPDATE SET NULL操作。这将阻止级联更新导致的无限循环。另一方面,一个自引用的ON DELETE SET NULL是有可能的,就像一个自引用ON DELETE CASCADE一样。级联操作不可以被嵌套超过15层深。对SQL标准的背离: 类似一般的MySQL,在一个插入,删除或更新许多行的SQL语句内,InnoDB逐行检查UNIQUE和FOREIGN KEY约束。按照SQL的标准,默认的行为应被延迟检查,即约束仅在整个SQL语句被处理之后才被检查。直到InnoDB实现延迟的约束检查之前,一些事情是不可能的,比如删除一个通过外键参考到自身的记录。

处理

因为以上问题,我们通常在建模时隐性设计外键约束,实际实现采用业务逻辑模拟外键的方式处理,这样可以解决把一致性全部放在DBA上的性能问题,同时我们可以采用允许脏数据存在,然后定时数据清理的方案去保证数据处理的分时性能,避免高峰处理。

这样的好处:

  • 解决性能问题
  • 增加了可扩展性,框架迁移不用在数据库系统内部实现逻辑约束
  • 分库分表的时候方便
  • 不会在DB层面造成死锁

反推:是否可以使用外键约束

我觉得在部分业务场景下是可以考虑使用的,回到最开始的例子,教务系统的成绩模块重要的点不再是性能问题,而是高可靠,因为对学校来说,系统存在以下特点:

  • 数据量较少,一个学校学生最多不超过10万人,通常在5000-50000这个区间内,对DB来说这是一个很小的数据量
  • 数据不容许出错,因为成绩和学生的人身利益直接挂钩
  • 能够进行数据修改操作的用户极少,只有教务处录入成绩的老师。
  • 如果放在业务部分,如果出现student表student_id在第一次被删除后,未清理score表数据,这个student_id短时间内被再次使用,而没有做数据清理,就容易出现成绩复用错误,诸如此类

所以 不得使用外键与级联,一切外键概念必须在应用层解决。 大部分情况下正确,但同样我认为需要分业务场景解决,并不能一竿子打死。

来源:为什么大多数互联网公司不用外键约束 - JethroYu - 博客园

mysql 外键_为什么大多数互联网公司不用外键约束相关推荐

  1. mysql联合主键_初探SQL语句复合主键与联合主键

    一.复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键. 比如 create table test ( name varchar(19), id nu ...

  2. MySQL为什么要使用内连接而不用外连接

    MySQL内连接获取的数据量比外连接的要少,所以尽量使用内连接.

  3. 中英文标点符号切换的组合键_最全的键盘各键及组合键功能说明,好好学习

    键盘是最常用的输入设备,通过键盘可以将汉字.英文字母.数字.标点符号等输入到计算机中,从而向计算机发出命令.输入数据.那么键盘分为几个功能区?各键的功能是什么呢?组合键又有什么功能呢?下面就分别予以说 ...

  4. mysql 高版本检索外键_第05期:外键到底能不能用?

    外键的设计初衷是为了在数据库端保证对逻辑上相关联的表数据在操作上的一致性与完整性. 外键在大部分企业写的开发规范里会直接规避掉!外键有优缺点,也并不是说每种场景都不适用,完全没有必要一刀切.外键到底能 ...

  5. mysql 订单号主键_关于订单编号 业务主键的生成

    今天,项目经理咨询我订单编号的随机生成,希望有一个随机产生绝对不重复的办法,实在是没有....不敢打包票一定guid不产生重复,我这方面属于保守派,我所能想到的只有: 1.大多数程序员在用的单库单表单 ...

  6. 中英文标点符号切换的组合键_最全的键盘各键及组合键功能说明,建议收藏

    点击上面"蓝字"关注人民书写 键盘是最常用的输入设备,通过键盘可以将汉字.英文字母.数字.标点符号等输入到计算机中,从而向计算机发出命令.输入数据.那么键盘分为几个功能区?各键的功 ...

  7. excel换行按什么键_电脑结束任务按什么键

    如今,电脑在我们日常生活中几乎无处不在,然而有时候可能我们在使用电脑的过程中会出现这样或者那样的小问题,比如有时候电脑打开的软件太多,导致电脑有点卡机,我们想要关闭一些程序却无法快速关闭,最常见的便是 ...

  8. excel换行按什么键_电脑黑屏按什么键恢复 电脑黑屏的原因和恢复方法

    电脑黑屏是日常生活中常见的故障,如果遇到黑屏的情况,可能会有以下几种可能: 一.电脑部件没有安插好 如果发现电脑黑屏,一定要检查一下电脑部件是否安插好,是否接入到主机接口,检查一下显卡与主板I/O插槽 ...

  9. java 堆外内存_详解Java堆外内存

    临近春节,最近有点时间,准备顺着上篇专栏的思路写下去,建议先阅读: juejin.im/post/684490- 武汉那几个吃野味的傻[],请藏好你们的妈 正文开始 在运行Java程序时,java虚拟 ...

最新文章

  1. 近期活动盘点:基于雷达图像预测未来降水参赛经验分享、智慧政府讲座、金融AI思享会、数据法学研讨会(11.29-11.30)
  2. oc45--多对象内存管理 优化
  3. 关于建立智能车竞赛开发资源中心的汇报PPT
  4. 20080509 - System.ExecutionEngineException 在 DefaultDomain 中发生
  5. 爬虫之验证码IP攻防心得——小总结
  6. 坐地铁可以刷学生卡吗_在沈阳办的公交卡能刷地铁吗?是学生卡,卡上写的是盛京通...
  7. .NET Core Runtime vs .NET Framework Runtime
  8. 规格选择_日常使用的拉杆箱脚轮选择哪种规格最合适?
  9. 格罗方德起诉台积电侵犯16项专利、影响巨大;中兴通讯与印尼Smartfren展开合作;网传FB开发新通讯应用Threads……...
  10. linux进程管理 ps,Linux - 进程管理,ps与top
  11. spwm matlab仿真,H桥逆变器SPWMMATLAB仿真
  12. 全链路UI设计师了解一下
  13. 计算机漫游模式,深入理解操作系统之一 —— 计算机系统漫游
  14. linux 开启ssdp服务,无法网络发现,Windows Server 2012如何启用SSDP Discovery服务
  15. 高版本Ubuntu(如22.02)修改apt源,快速安装低版本gcc/g++
  16. 2021-05-11 MongoDB面试题 MongoDB是什么
  17. 项目在使用easyui时遇到的问题
  18. 安卓开发为什么选择用Java语言
  19. feature map
  20. 利用宝塔搭建在线文件收取助手-easypicker2

热门文章

  1. 一个比较简单驱动程序初学者可以看看
  2. 创业中的“孙子兵法”
  3. 想不想在手机上敲 Python 代码?!这里有一款推荐方案
  4. 玩转Python? 一文总结30种Python的窍门和技巧,不可错过哈!
  5. a标签里面设置onclick_HTML学习笔记:各种常用标签
  6. 嵌入式开发板03---看门狗、编写启动代码
  7. Adobe illustrator 导出可编辑文本 - 连载 18
  8. 数学教材里的神秘数表在国外红出圈,网友:引人入胜、猜不到结局
  9. 蜜汁问题?差异基因分析谁比谁有差别吗?
  10. 代码分析 | 单细胞转录组Normalization详解