Mysql 实现多种逻辑删除方案

2022-08-22 13:55:13 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

Mysql 实现多种逻辑删除方案
  • 新增逻辑删除字段方式
    • 多deleted值
    • deleted: 0 代表未删除,删除时把deleted赋值为时间戳UNIX_TIMESTAMP(NOW())
  • 采用备份表方式

最近在做公司项目的时候,对于表的逻辑删除,和其他同事出现了不同意见,故查阅了一些blog,结合自己的实际情况,再次做了笔记,以备后查。 在实际的项目开发中,对于某些业务数据,一般都不会采用物理删除的方式,毕竟在数据是很宝贵了,所以也就有了逻辑删除的方式出现了。常见的逻辑删除方式有以下几种:1.为相关的表结构新增一个逻辑删除字段deleted 0表示未删除,1表示已删除(目前最常见的方式;2. 使用备份表的方式,将要删除的数据写入到备份表中,然后删除主表的数据。以下就对两种不同方式使用案例一一分析其中的优略之处。

新增逻辑删除字段方式

字段中设置一个字段deleted:0表示未删除,1表示已删除。 以下说明均以Artifact表做说明:此表中project_idname是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

0 人点赞