【转载】为什么现在的互联网公司及分布式数据库不建议使用外键
前阵子开展工作时,发现大部分的分布式数据库不支持外键。当时很是不明白为什么外键如此基础的功能会不支持。今儿得空在网络中做了查阅。
感觉下面的这篇帖子说得很清楚了,转载过来,供大家查阅。
转载出处: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
- 点赞
- 收藏
- 关注作者
评论(0)