数据软删除设计模式:垃圾回收表

本文深入探讨了数据库中数据软删除的三种常见方法:标记列、双表和垃圾回收表,对比了各自的优缺点,特别推荐了垃圾回收表法作为解决标记列设计法不足的有效方案。

数据软删除

软删除,也称为逻辑删除。在数据库中并不正直的删除数据,而是在数据上加上标记或移动位置,以便以后可以查看或恢复。常用到的方法有标记列、双表、垃圾回收表三种方法。这里,重点推荐垃圾回收表法,以解决标记列设计法的一些不足。

一、标记列

一般在表中增加一列为delete_flag,或delete_status,值取1,0,或者true, false。

(一) 优点

删除使用update语句,开销较少。并且不用delete(有人认为比较危险)。恢复删除的数据比较简单,将delete_flag重置为0即可,也是非常容易。

(二) 缺点

这种设计有没有缺点呢?也是有的。

  1. SQL冗余:写各种查询、修改SQL时,一般需要在SQL中加一个where delete_flag=0的条件,非常冗余。
  2. 影响性能:如果删除了较多的数据,如一张3000万条记录的表,20%的数据已经删除了,这些删除的数据还会对数库性能产生较大影响的。
  3. 不易清理:过一定时期后,需要清理删除的数据,这些删除数据记录分散在各个表中,不易清理。

二、双表

针对要删除的表,创建一张结构完全一样的表,这张表名字不同,或数据库名称不同。删除的时候,将数据插入到删除表中。

(一)优点

不影响性能,数据与原始数据一致。在“删除”和“恢复删除”都是界面的的按钮,频繁被用到时可以考虑使用。不过,这与“标记删除法”也没有本质不同了。

(二)缺点
  1. 有大量的冗余表。
  2. 表面上看数据结构是一样的,但是插入和恢复还是要构造SQL,并没有多少简单化。

三、垃圾回收表

如何解决使用标记列的问题呢?可以考虑给数据库建一张RECYCLE表,表示是数据回收站。删除数据时,往这张表中插入一条记录,记录内容为JSON或SQL,再把原始的数据真正的删除。恢复时,从这张表中查找到删除内容,再用记录的JSON或SQL恢复。
附(MySQL):

CREATE TABLE recycle (
    id INT NOT NULL AUTO_INCREMENT,
    table_name VARCHAR(64),
    content TEXT,
    note VARCHAR(64),
    create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值