数据软删除
软删除,也称为逻辑删除。在数据库中并不正直的删除数据,而是在数据上加上标记或移动位置,以便以后可以查看或恢复。常用到的方法有标记列、双表、垃圾回收表三种方法。这里,重点推荐垃圾回收表法,以解决标记列设计法的一些不足。
一、标记列
一般在表中增加一列为delete_flag,或delete_status,值取1,0,或者true, false。
(一) 优点
删除使用update语句,开销较少。并且不用delete(有人认为比较危险)。恢复删除的数据比较简单,将delete_flag重置为0即可,也是非常容易。
(二) 缺点
这种设计有没有缺点呢?也是有的。
- SQL冗余:写各种查询、修改SQL时,一般需要在SQL中加一个where delete_flag=0的条件,非常冗余。
- 影响性能:如果删除了较多的数据,如一张3000万条记录的表,20%的数据已经删除了,这些删除的数据还会对数库性能产生较大影响的。
- 不易清理:过一定时期后,需要清理删除的数据,这些删除数据记录分散在各个表中,不易清理。
二、双表
针对要删除的表,创建一张结构完全一样的表,这张表名字不同,或数据库名称不同。删除的时候,将数据插入到删除表中。
(一)优点
不影响性能,数据与原始数据一致。在“删除”和“恢复删除”都是界面的的按钮,频繁被用到时可以考虑使用。不过,这与“标记删除法”也没有本质不同了。
(二)缺点
- 有大量的冗余表。
- 表面上看数据结构是一样的,但是插入和恢复还是要构造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)
);