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


相关推荐

  • 公钥基础设施PKI_公钥基础设施pki由什么组成

    公钥基础设施PKI_公钥基础设施pki由什么组成2019独角兽企业重金招聘Python工程师标准>>>…

    2022年8月22日
    5
  • js中map遍历数组对象_js遍历数组

    js中map遍历数组对象_js遍历数组forEach()和map()都是遍历数组的方法,用法类似,但是还是有很大区别:相同点:      1.都是循环遍历数组中的每一项;      2.在遍历中执行匿名函数都可以接收三个参数,分别为:遍历过程的每一项、遍历序号(索引值)、原数组;      3.执行的匿名函数中的this都指向window。  不同点:      map():      根据遍历执行的匿名函数,对于原数…

    2022年9月2日
    6
  • Mac OS mysql 启动命令

    Mac OS mysql 启动命令在MacOSX启动和停止MySQL服务的命令  启动MySQL服务  sudo/usr/local/mysql/support-files/mysql.serverstart 停止MySQL服务  sudo/usr/local/mysql/support-files/mysql.server stop 重启MySQL服务  sudo…

    2022年5月21日
    43
  • 简单说说USB协议(一)[通俗易懂]

    简单说说USB协议(一)[通俗易懂]USB,通用串行总线,是一种计算机与外围设备进行数据交互的通信协议。任何东西的出现都是有理可循的,在以前计算机刚兴起的时候,要连接一个新的设备,需要断电关闭计算机,连接好设备,配置好硬件,再上电运行,这个过程相当费时费力,为了能拥有随意接入设备这种热拔插特性,USB总线协议应运而生。USB总线如今已经有USB1.0、USB1.1、USB2.0、USB3.0。USB协议采用主从工作模式,…

    2022年6月17日
    38
  • 操作系统(第四版)期末复习总结(上)

    操作系统(第四版)期末复习总结(上)马上要考操作系统了,第一章操作系统引论1、操作系统是什么?操作系统为用户完成所有“硬件相关,应用无关“的工作,以给用户方便、高效、安全的使用环境1.1、定义:操作系统是一个大型的程序系统,它负责计算机的全部软、硬件资源的分配、调度工作,控制并协调多个任务的活动,实现信息的存取和保护。它提供用户接口,使用户获得良好的工作环境。1.2、目标(1)、方便性:配置OS后计算机系统更容易使用(2)、…

    2022年6月8日
    35
  • Interp1 c++实现

    Interp1 c++实现在网上找了一下,有是有但是我下载下来用的时候结果不对。想修改一下但是搞得迷迷糊糊的,就干脆写了一个,不过只有最简单的线性插值的实现,新手可以直接拿过去用。也希望老鸟也可以不吝赐教,提高一下效率或者优化下结构。cpp文件//—————————————————————————#pragmahdrstop#include”Interpfun.h”//————————

    2022年5月2日
    40

发表回复

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

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