为什么不建议使用外键,硬删除(数据库)

目录

一、背景

二、原因

2.1 为什么不使用外键

2.2 为什么使用软删除


一、背景

问题1:所以在学生时期的视角并不认为使用外键会对数据库产生什么影响,实际设计数据库规范是:不得使用外键与级联,一切外键概念必须在应用层解决。

问题2:当接触实际生产问题时,发现数据库基本都不会使用外键,实际生产还添加 is_deleted 字段把所有关联的行修改以实现软删除,而不会真正删除数据,因为现实世界中并不会级联删除。

二、原因

2.1 为什么不使用外键

(1)性能/死锁:使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。那么这意味着一点,数据库的性能开销变大了,每次更新数据,都需要额外的检查另外一张表的数据,容易造成死锁

(2)迁移与备份:将数据从一个数据库迁移到另一个数据库时,外键约束可能会成为一个问题

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

扫描二维码关注公众号,回复: 17459903 查看本文章

(4)管理与维护增加数据库设计的复杂性,管理维护困难

        

        个人认为最重要的一点就是外键并不适合分布式、高并发集群。因为实际生产中还是这个影响最大,欢迎大佬指正。

2.2 为什么使用软删除

好处

(1)数据可恢复:避免数据的物理删除,使得数据的恢复成为可能

(2)查看历史记录:软删除还可以保留数据的历史记录,即使数据被删除,其历史记录依然可以保留。

(3)代码bug定位:如果代码一旦有bug,误DELETE了数据,恢复起来是非常麻烦的,甚至于不太可能。就算有binlog,也得做非常定制的开发才能揪出来哪些是删对了的,哪些是删错的。

(4)数据迁移场景:如何确定是业务删除还是迁移系统删除?业务都是软删,迁移系统都是硬删除就可以区分

缺点

(1)以后所有查询都要加上这个字段

(2)一定会存在数据冗余

        

        自己做数据库玩才会删除数据,否则实际生产接触到的基本都是软删,总而言之,要看业务需求,且软删利大于弊

猜你喜欢

转载自blog.csdn.net/weixin_45440484/article/details/140468871