炒冷饭,对于数据库“删除”操作大家平时都是物理删除,还是逻辑删除啊?

2017-11-29 19:37:46 +08:00
 mynameisny

铺垫

本人不才,不知这个“逻辑删除”词用的对不对,想表达的就是:当删除时只是将 is_deleted 字段设置为 1,而不是真的将这条记录删掉,关键词可能是 logic delete 或 soft delete。


问题


求解

我能理解具体问题需要具体分析,是要“逻辑删除”还是“物理删除”,主要还是要根据实际的业务场景,比如互联网企业搜 /收集的个人信息、电商类平台用户的订单、金融类平台的交易记录,肯定是不能删除的。但是对于一些维护中间状态的数据,如果可以通过记录日志实现“留档”那么就可以真的删掉它。

不知道有没有那种开源组件,可以_自动实现_当我从一个表中物理删除一条记录时,它可以帮我将它转移到备份表中,我看了一个 MySQL 的审计插件,但是好像并不做这个用途的。或者有类似“ commit log ”那种东东,删除时只需要记录一个 log,有需要的时候可以从日志中恢复回来。


参考

下附几个我搜过的资料,希望能帮助和我一样迷茫的童鞋:

  1. “别删除数据” http://www.infoq.com/cn/news/2009/09/Do-Not-Delete-Data

  2. “逻辑删除真的不是一个好的设计 - 简书” http://www.jianshu.com/p/f37281576585

  3. “ MySQL 删除数据是加一个字段做标记,还是将删除的数据插入到另外一张备份表里,哪种方案更好? - V2EX ” https://fast.v2ex.com/t/406208

  4. “不做显式删除,而用 status=0 代替,是好的实践么? - V2EX ” https://www.v2ex.com/t/363226

17089 次点击
所在节点    问与答
35 条回复
Perry
2017-11-30 08:30:35 +08:00
硬删除,公司规定。
l00t
2017-11-30 09:37:04 +08:00
unique key 失效?你们这数据库都怎么做设计的,这都还能失效?
linxl
2017-11-30 09:38:59 +08:00
软删除
nl101531
2017-11-30 10:02:38 +08:00
逻辑删
pypy
2017-11-30 10:06:29 +08:00
逻辑删除啊。数据都是钱啊,你不要的数据可以给我。(开个小玩笑)
zpf124
2017-11-30 10:13:43 +08:00
小部门小规模,删除几乎都是数据库直接删除。
mynameisny
2017-11-30 14:54:17 +08:00
得到了很多前辈的实操经验,也收获了几条实际的解决方案。

感谢 @gamexg 的方案:使用 is_deleted 字段记录“删除”时刻的时间戳,再将主键与 is_deleted 作为 unique key,有点小问题就是 is_deleted 这个字段的默认值必须是一个非 NULL 的值,否则 name + NULL 的组合,即使 name 不同,也不能被视为一条唯一值。

感谢 @billlee 的方案,不知道有 binlog 这个运维工具(开眼界 : P ),mysql 的 bin 目录提供了 mysqlbinlog 工具。

partial index 是头一回听说(开眼界),移表的方案也很好,不过有点担心当表定义比较多时会造成每张表都有一张“回收站”表。

感谢其他 V 友们的回复!
openbsd
2017-11-30 15:05:38 +08:00
移表......
jjianwen68
2017-11-30 15:21:36 +08:00
一些绑定关系啊之类数据倒是可以直接删除,大部分应该都是软删除。如果说时间长数据太多,可以分当前表、历史表,业务允许可以定期删除半年或一年之前的数据
Zephyros
2017-11-30 16:58:09 +08:00
删除时移动到其他表保存一个月,一个月后再彻底删除。这样就不会拖慢查询速度了。

不然,比方说你告诉用户有销号功能,但又销不掉,这个会令用户不爽。我还希望把保护用户隐私写入宪法呢,这辈子都不知有没有戏。
18583826786
2017-11-30 17:13:14 +08:00
一般应该是有一个字段,判断这一条数据还有没有用,并不是真删
ixiaohei
2017-11-30 17:17:52 +08:00
软删除的很好奇你们唯一键都是怎么玩的。另外索引都要加上那一列表示删除的字段么?
bk201
2017-11-30 17:30:43 +08:00
个人感觉打标记软删除没啥好处,不如移出当前表
loveminds
2017-12-04 08:13:36 +08:00
删除之前 dump 出来备份,有备无患
ruandao
2019-11-18 19:03:36 +08:00
@ixiaohei 唯一键不都是业务无关的吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/410612

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX