本人不才,不知这个“逻辑删除”词用的对不对,想表达的就是:当删除时只是将 is_deleted 字段设置为 1,而不是真的将这条记录删掉,关键词多是 logic delete 或 soft delete。数据库
查了一些资料,貌似支持“逻辑删除”观点的人是多数的:安全
有前辈提到一个观点,真实世界是没有删除的。订单做废,用户禁用,员工离职,文稿废弃,优惠券做废都是状态的变化。因此 SQL 里面 DELETE 在业务场景里都不该该出现。插件
为了安全,生产环境不能有人或有程序是对数据库的表有 DELETE 权限的。设计
反对的声音仍是有的:日志
逻辑删除的设计还会致使经常使用的 unique key 失效(固然用户可将数据行中原来的码和 is_deleted 一块儿做为 unique key,可是这样又会出现,再次删除时,系统中没法出现两个彻底相同的 ID,又都是 is_deleted=1 的记录出现)。事务
被“删除”的这条记录若是在业务中与大量的表有关联关系,那么在删除它时,就会引起不少的级联的更新,或者判断引用并提示用户没法修改正被引用的资源。而要保证这些所有更新无误,又要求事务必定可靠,若产生了状态不一致,那么这些“脏数据”的维护也是很痛苦的。资源
当表中的记录数愈来愈大时,查询起来会愈来愈慢。get
我能理解具体问题须要具体分析,是要“逻辑删除”仍是“物理删除”,主要仍是要根据实际的业务场景,好比互联网企业搜 /收集的我的信息、电商类平台用户的订单、金融类平台的交易记录,确定是不能删除的。可是对于一些维护中间状态的数据,若是能够经过记录日志实现“留档”那么就能够真的删掉它。it
不知道有没有那种开源组件,能够_自动实现_当我从一个表中物理删除一条记录时,它能够帮我将它转移到备份表中,我看了一个 MySQL 的审计插件,可是好像并不作这个用途的。或者有相似“ commit log ”那种东东,删除时只须要记录一个 log,有须要的时候能够从日志中恢复回来。ast
下附几个我搜过的资料,但愿能帮助和我同样迷茫的童鞋:
“别删除数据” http://www.infoq.com/cn/news/2009/09/Do-Not-Delete-Data
“逻辑删除真的不是一个好的设计 - 简书” http://www.jianshu.com/p/f37281576585
“ MySQL 删除数据是加一个字段作标记,仍是将删除的数据插入到另一张备份表里,哪一种方案更好? - V2EX ”https://fast.v2ex.com/t/406208
“不作显式删除,而用 status=0 代替,是好的实践么? - V2EX ” https://www.v2ex.com/t/363226