目录
一、背景
问题1:所以在学生时期的视角并不认为使用外键会对数据库产生什么影响,实际设计数据库规范是:不得使用外键与级联,一切外键概念必须在应用层解决。
问题2:当接触实际生产问题时,发现数据库基本都不会使用外键,实际生产还添加 is_deleted 字段把所有关联的行修改以实现软删除,而不会真正删除数据,因为现实世界中并不会级联删除。
二、原因
2.1 为什么不使用外键
(1)性能/死锁:使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。那么这意味着一点,数据库的性能开销变大了,每次更新数据,都需要额外的检查另外一张表的数据,容易造成死锁
(2)迁移与备份:将数据从一个数据库迁移到另一个数据库时,外键约束可能会成为一个问题
(3)分布式:互联网场景中都是不建议使用外键的,外键与级联更新适用于单机低并发,不适合分布式、高并发集群。
扫描二维码关注公众号,回复: 17459903 查看本文章![]()
(4)管理与维护:增加数据库设计的复杂性,管理维护困难
个人认为最重要的一点就是外键并不适合分布式、高并发集群。因为实际生产中还是这个影响最大,欢迎大佬指正。
2.2 为什么使用软删除
好处
(1)数据可恢复:避免数据的物理删除,使得数据的恢复成为可能
(2)查看历史记录:软删除还可以保留数据的历史记录,即使数据被删除,其历史记录依然可以保留。
(3)代码bug定位:如果代码一旦有bug,误DELETE了数据,恢复起来是非常麻烦的,甚至于不太可能。就算有binlog,也得做非常定制的开发才能揪出来哪些是删对了的,哪些是删错的。
(4)数据迁移场景:如何确定是业务删除还是迁移系统删除?业务都是软删,迁移系统都是硬删除就可以区分
缺点
(1)以后所有查询都要加上这个字段
(2)一定会存在数据冗余
自己做数据库玩才会删除数据,否则实际生产接触到的基本都是软删,总而言之,要看业务需求,且软删利大于弊