【转载】为什么现在的互联网公司及分布式数据库不建议使用外键

举报
灵犀晨 发表于 2022/02/11 11:16:07 2022/02/11
【摘要】 前阵子开展工作时,发现大部分的分布式数据库不支持外键。当时很是不明白为什么外键如此基础的功能会不支持。今儿得空在网络中做了查阅。感觉下面的这篇帖子说得很清楚了,转载过来,供大家查阅。转载出处:https://blog.csdn.net/wangxindong11/article/details/108231860原文转载如下:有的SQL规约是这么说的:【强制】不得使用外键与级联,一切外键概念...

前阵子开展工作时,发现大部分的分布式数据库不支持外键。当时很是不明白为什么外键如此基础的功能会不支持。今儿得空在网络中做了查阅。

感觉下面的这篇帖子说得很清楚了,转载过来,供大家查阅。

转载出处:https://blog.csdn.net/wangxindong11/article/details/108231860

原文转载如下:

有的SQL规约是这么说的:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

总结:

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

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

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

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

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

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

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

所以放弃外键的根本原因是——我们不再需要这个约束。
————————————————
版权声明:本文为CSDN博主「新栋BOOK」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangxindong11/article/details/108231860

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。