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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 开心农场2激活成功教程版无限金币钥匙_开心农场2乡村度假内购激活成功教程版

    开心农场2激活成功教程版无限金币钥匙_开心农场2乡村度假内购激活成功教程版 最近开心农场非常火,同学用C#模拟鼠标点击操作做了一个小外挂,但是这样做有如下缺点:1、计算机不能做其他事情,2、必须开着浏览器,3、对所有好友点一遍的时间太慢,4、对于开发者来说技术含量低了点,呵呵。 所以我尝试着改进这种实现,我的想法是:不用开启浏览器,直接运行一个应用程序,该程序将自己伪装成一个浏览器,与服务器连接,并发送浇水、除虫等命令。这样,甚至可以使用多线程向服务器发送命令,无需…

    2022年9月13日
    2
  • policy服务器未能登录,win7电脑提示group policy client服务未能登录的解决方法[通俗易懂]

    policy服务器未能登录,win7电脑提示group policy client服务未能登录的解决方法[通俗易懂]我们都清楚电脑使用久了总是会出现各种各样的问题,其中比较常见的就是系统提示了,最近有位win7系统用户使用电脑的过程中,系统总是会提示“grouppolicyclient服务未能登录”,用户不知道怎么解决,我们都清楚电脑使用久了总是会出现各种各样的问题,其中比较常见的就是系统提示了,最近有位win7系统用户使用电脑的过程中,系统总是会提示“grouppolicyclient服务未能登录”,…

    2022年5月14日
    77
  • jar命令解压war包_java解压文件

    jar命令解压war包_java解压文件在J2EEWeb开发中,Web应用程序存档(WAR)文件只是一个普通的JAR文件,它包含您的所有Web应用程序组件,例如servlet,Java类,库,资源等。有关详细信息,请阅读Wiki。问题当前的Web应用程序WAR文件是通过Ant或Maven工具生成的,复制到*nix环境进行部署,但是不知道如何提取WAR文件?解WAR文件只是一个JAR文件,要提取它,…

    2022年10月4日
    3
  • 详解redis 中Pipeline流水线机制

    详解redis 中Pipeline流水线机制

    2022年2月20日
    63
  • snmp协议的trap操作采用基于_maven批量导入jar包

    snmp协议的trap操作采用基于_maven批量导入jar包snmptrap与snmpSNMP简单概述1.1、什么是SnmpSNMP是英文”SimpleNetworkManagementProtocol”的缩写,中文意思是”简单网络管理协议”。SNMP是一种简单网络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议。SNMP主要用于网络设备的管理。由于SNMP协议简单可靠,受到了众多厂商的欢迎,成为了目前最为广泛的网管协议。SNMP协议主要由两大部分构成:SNMP管理站和SNMP代理。SNMP管理站是一个中心节点,负责收集维护

    2022年8月20日
    11
  • Java精选笔试题

    Java精选笔试题1,volatile关键字是否能保证线程安全?()>>>>答案:否volatile关键字用在多线程同步中,可保证读取的可见性,JVM只是保证从主内存加载到线程工作内存的值是最新的读取值,而非cache中。但多个线程对volatile的写操作,无法保证线程安全。假如线程1,线程2在进行read,load操作中,发现主内存中co…

    2022年7月8日
    15

发表回复

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

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