业务伪删除该这么设计?
现在大数据时代,数据是很重要的,所以对于一些数据系统一般不会做物理删除,删除也会有备份,所以需要设计一套伪删除的逻辑,但在下才疏学浅,对这一套逻辑了解不深,想向各位请教请教!
下面是鄙人搜索得来的两种方法,但个人觉得两种方法都不是特别好,想问下各位有什么更好的方法没?
1.一般系统采用记录加DeleteAt字段来判断数据是否删除,但这样每次查询(单表,多表联查)都需要加上DeleteAt判断,系统上复杂了一个维度。而且如果数据又有唯一索引时,就需要加上DeleteAt字段一起做唯一索引,这样随着数据量增加,索引就会消耗很多的空间。
2.还有一种做法是加一张表做删除归档表,删除的记录从表中删除然后迁移到删除归档表中,这样伪删除也完成了,但如果做数据恢复的时候就比较麻烦了,(删除归档表怎么设计暂不清楚,想请教请教)。
回复一下回答里只用一个status字段标记数据状态的不好之处
只用一个status字段标记,当有唯一键存在时有缺陷,这种唯一键的场景还比较多。
讲下场景:
系统要求一个用户只能创建一个项目,当然项目我可以删除重建。
只有一个status字段标记项目状态, 1 启用 2 删除
project表 user_id project_id status 三个字段,组成唯一键
user_id project_id status
u1 p1 2
u1 p2 1
好上面就是用户u1创建一个项目p1后,删除重新建立了项目p2,然后现在来看,如果用户把p2也删除,就会出现删除异常情况,违反了表唯一键约束,所以只用一个status字段标记的缺点就暴露出来了。
之前在本人的项目中也是采用status字段标记的方式,如果删除后又重建就会先去找已经删除的记录重新启用,但这种做法是不对的,因为之前删除的项目关联了其他记录,或者存在一些之前id标记的数据统计记录,如果启用之前的删除的项目记录,在需求上就不对了。
两种方法都挺好的。
删除归档表就是。比如你有一个
content
表,新建一个content_deleted
表。每当在content
表中删数据的时候就同时把该数据新增到content_deleted
表里面.我没有更好的方法,伪删除本身就是一个需求,一个需求会让程序的复杂度增加我认为是一个正常的操作