大家好,又见面了,我是你们的朋友全栈君。
Mysql 实现多种逻辑删除方案- 新增逻辑删除字段方式
- 多deleted值
- deleted: 0 代表未删除,删除时把deleted赋值为时间戳UNIX_TIMESTAMP(NOW())
- 采用备份表方式
- 多deleted值
- deleted: 0 代表未删除,删除时把deleted赋值为时间戳UNIX_TIMESTAMP(NOW())
最近在做公司项目的时候,对于表的逻辑删除,和其他同事出现了不同意见,故查阅了一些blog,结合自己的实际情况,再次做了笔记,以备后查。
在实际的项目开发中,对于某些业务数据,一般都不会采用物理删除的方式,毕竟在数据是很宝贵了,所以也就有了逻辑删除的方式出现了。常见的逻辑删除方式有以下几种:1.为相关的表结构新增一个逻辑删除字段deleted
0表示未删除,1表示已删除(目前最常见的方式;2. 使用备份表的方式,将要删除的数据写入到备份表中,然后删除主表的数据。以下就对两种不同方式使用案例一一分析其中的优略之处。
新增逻辑删除字段方式
字段中设置一个字段deleted:0表示未删除,1表示已删除。
以下说明均以Artifact表做说明:此表中project_id
和name
是artifact表中 Unique Key
及 UK(project_id
,name
)。
如下图,artifact_02
,已经被删除掉了,但是因为表结构设计了联合索引,因此这条记录也将无法再添加回来了,因此这种情况只能满足删除,但无法实现同一数据的再次新增。所以也就不太符合逻辑删除的需求场景了,那有没有改进的地方呢,答案当然是有了。
id | project_id | name | create_user | deleted |
---|---|---|---|---|
1 | project001 | artifact_01 | xiaoma | 0 |
2 | project002 | atifact_02 | xiaoma | 1 |
4 | project003 | phone | xiaoma | 0 |
多deleted值
- 0 :表示为删除,其他值表示删除,如下表:
id | project_id | name | create_user | deleted |
---|---|---|---|---|
1 | project003 | phone | xiaoma | 0 |
2 | project003 | phone | xiaoma | 1 |
4 | project003 | phone | xiaoma | 2 |
这种方式可以保持Unique Key,但是在deleted冲突比较多,需要保证deleted累加 那有没有更加的方式呢,下面这个是对上面的改良版,
deleted: 0 代表未删除,删除时把deleted赋值为时间戳UNIX_TIMESTAMP(NOW())
其实就是把除零之外的值改为了删除是的时间戳,这样来的好处就是我可以记录当前删除数据的时间。也便于某些时候的记录查找和追溯。
id | project_id | name | create_user | deleted |
---|---|---|---|---|
1 | project003 | phone | xiaoma | 0 |
2 | project003 | phone | xiaoma | 1573631978 |
4 | project003 | phone | xiaoma | 1573631943 |
采用备份表方式
实现原理就是:每次删除的时候,都把数据写入到备份表,并且原始记录使用JSON格式完整保存,然后再删除。
还是以artifact
表为例:这里要实现了逻辑删除,我将新建一张artifact_bankend
表,用来存储要删除的数据。
artifact
表数据如下表,我想删除掉id
为2的记录,那我要做的事情就是,先把artifact
表中id为2的这张表数据copy到artifact_bankend
表中,再删除掉artifact
表中数据。
id | project_id | name | create_user |
---|---|---|---|
1 | project001 | artifact_01 | xiaoma |
2 | project002 | atifact_02 | xiaoma |
4 | project003 | phone | xiaoma |
artifact_bankend
表:将artifact
表中数据写入到artifact_bankend
表。这里新增了一个deleted字段用来存储删除的时间。
id | project_id | name | create_user | deleted |
---|---|---|---|---|
2 | project002 | atifact_02 | xiaoma | 2019-11-14 15:14:45 |
删除之后的artifact
表数据如下:
id | project_id | name | create_user |
---|---|---|---|
1 | project001 | artifact_01 | xiaoma |
4 | project003 | phone | xiaoma |
优点: 原始表不会包含删除的数据,有利于查询效率 缺点:实现比较麻烦,每一张需要逻辑删除的表都需要备份表
https://cloud.tencent.com/developer/article/1531915
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137284.html原文链接:https://javaforall.cn