Mysql 实现多种逻辑删除方案

Mysql 实现多种逻辑删除方案Mysql实现多种逻辑删除方案新增逻辑删除字段方式多deleted值deleted:0代表未删除,删除时把deleted赋值为时间戳UNIX_TIMESTAMP(NOW())采用备份表方式最近在做公司项目的时候,对于表的逻辑删除,和其他同事出现了不同意见,故查阅了一些blog,结合自己的实际情况,再次做了笔记,以备后查。在实际的项目开发中,对于某些业务数据,一般都不会采用物理删除的方式,…

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

最近在做公司项目的时候,对于表的逻辑删除,和其他同事出现了不同意见,故查阅了一些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.net/137284.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c# splitContainer控件

    c# splitContainer控件splitContainer可以把窗口拆分为两部分可以使用多个splitContainer常用属性(1).splitContainer不能被鼠标直接点击选中,可通过右击->选择splitContainer选中。(2).属性IsSplitterFixed用于设置拆分器能否移动。(3).属性FixedPanel若设置为Panel1(或Panel2),在调整窗

    2022年7月18日
    25
  • jdk1.8的环境配置「建议收藏」

    jdk1.8的环境配置「建议收藏」jdk1.8的环境配置原文地址:传送门每日必答:在开始之前呢,小Du来来带大家了解几个问题,希望能够在面试中,小Du的解答给你帮助。1.什么是JDK?答:javadevelopmentkit的缩写,意思是JAVA开发工具,我们写文档做PPT需要office办公软件,开发当然需要开发工具了,说到开发工具大家肯定会想到Eclipse,但是如果直接安装Eclipse你会发现它是运行不起来是会报错的,只有安装了JDK,配置好了环境变量和path才可以运行成功。2.JRE是什么?答:jav

    2022年6月11日
    34
  • UVA11387 – The 3-Regular Graph(推理)

    UVA11387 – The 3-Regular Graph(推理)

    2022年1月29日
    40
  • http://www.cnblogs.com/skyme/p/3457723.html

    http://www.cnblogs.com/skyme/p/3457723.htmlhttp://www.cnblogs.com/skyme/p/3457723.html点击打开链接

    2022年9月30日
    0
  • 从开发者角度玩Windows 11

    从开发者角度玩Windows 11今天Windows11正式发布,有新的界面,有新的WindowsStore,也有新的交互,相信不少小伙伴都已经安装了Windows11或从各大媒体了解到相关的信息。作为开发者,或者你和我一样更关注Windows11给开发者带来了什么新的体验和提升。一.安装Windows11依赖于TPM2.0,什么是TPM呢?TPM技术旨在提供基于硬件的与安全性相关的功能。TPM芯片是一个安全的加密处理器,有助于执行生成、存储和限制加密密钥的使用等操作。TPM芯片包含多重物理安…

    2022年5月6日
    118
  • java过滤器的顺序(java过滤器指定过滤文件)

    过滤器的顺序由web.xml文件中<filter-mapping>的顺序决定,从上到下现有三个过滤器<filter><filter-name>AFilter</filter-name><filter-class>com.jerry.filter.AF

    2022年4月12日
    151

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号