前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文一点 | 为什么不建议使用数据库外键

一文一点 | 为什么不建议使用数据库外键

作者头像
王新栋
发布2020-08-27 15:46:26
1.1K0
发布2020-08-27 15:46:26
举报
文章被收录于专栏:程序架道程序架道

你好,这是【一文一点】的第1篇文章,不拘泥于篇幅字数,用一篇文章说清一个知识点。

有的SQL规约是这么说的:

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

那先复习下是什么外键,举一个最熟悉的例子:

学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。

再复习下什么是级联,还是上面这个例子:

如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,则为级联更新。

用外键不好么,不太好,但也注意,不是不可以,是不建议

那么这里的不建议,其实也有两说的。

1、如果你为了追求正确性优先于性能的话,可以使用。

2、如果你是单机的并发量少的应用,可以使用,不过这种应用目前在互联网应用里面几乎不存在。

3、所以说,在互联网场景里面,涉及到高并发,在外键的约束下,大量的插入、更新、删除操作的性能会降低。

那么外键为什么有性能问题呢

1、数据库需要额外的维护外键自身的内部管理;

2、外键相当于把数据的一致性事务的实现,全部交给了数据库服务器来完成;

3、有了外键以后,当做一些涉及到外键字段的增,删,改操作时,需要触发相关操作去检查,而不得不消耗资源;

4、每次更新数据,都需要额外的检查另外一张表的数据,容易造成死锁;

总结:

1、互联网行业场景中不推荐使用外键,用户量大,并发度高,如果使用外键,数据库服务器很容易产生性能瓶颈。

2、传统行业可以使用,强调数据强一致性,而且用户数量有限,可控。

基于此,互联网场景中都是不建议使用外键的,外键与级联更新适用于单机低并发,不适合分布式、高并发集群。

外键的实质是形成一种 “约束”。

有了这个约束的存在,原则上就能保证表与表之间数据“始终完整、一致”的关系。

但是在我们平时的实际需求中,通常保证“最终完整、一致” 就可以了,甚至可以容忍一些 “最终不完整、不一致”。

其实,也就是我们常说的大部分业务场景,只需要保持最终一致性,就可以了。

所以放弃外键的根本原因是——我们不再需要这个约束。

七夕快乐。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序架道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于此,互联网场景中都是不建议使用外键的,外键与级联更新适用于单机低并发,不适合分布式、高并发集群。
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档