关于数据库逻辑删除(伪删除)的设计方案探讨

关于数据库逻辑删除(伪删除)的设计方案探讨项目上碰到过关于数据采用了逻辑删除导致的问题,情况是这样:原先的代码中,对于表T中的数据的删除采用的是逻辑删除,但是其他使用该数据的地方并没有针对逻辑删除进行配套的处理。该表T中存在字段A要求不能重复,其实就是说字段A是uniquekey。那么问题就来了,逻辑删除只是将数据的status字段更新为删除状态,所以字段A的旧值依然存在,导致插入新数据时,就不能使用已经删除的字段A的值,这明显是…

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

项目上碰到过关于数据采用了逻辑删除导致的问题,情况是这样:原先的代码中,对于表T中的数据的删除采用的是逻辑删除,但是其他使用该数据的地方并没有针对逻辑删除进行配套的处理。该表T中存在字段A 要求不能重复,其实就是说字段A是unique key。

那么问题就来了,逻辑删除只是将数据的status字段更新为删除状态,所以字段A的旧值依然存在,导致插入新数据时,就不能使用已经删除的字段A的值,这明显是不合理的。由于这里采用逻辑删除,同时还引入了关联关系也未进行物理删除的问题。就该场景,本人进行了一番关于逻辑删除的思考,在此抛砖引玉,欢迎讨论。

首先要思考要不要用逻辑删除

这一点很重要,不要盲目使用逻辑删除,首先要看是否有必要采用逻辑删除。因为采用物理删除的优势是显而易见的,不会有历史数据,数据间的关联关系也不会出错,还能节省数据库空间。采用物理删除,业务处理起来很清爽。所以如果没有必要,那么可以优先采用物理删除,从而避免逻辑删除引入的麻烦。比如说本人这次碰到的情况,实际上项目中并不需要逻辑删除,没有这方面需求,这些历史数据也没什么价值。所以这个问题就是当初的开发人员盲目采用了逻辑删除,而没有考虑周全导致的。基于这个情况,直接修改为物理删除解决问题。

当然,某些情况下必须使用逻辑删除,尤其是在现在越来越注重数据价值的环境下。比如历史数据有价值,项目对历史数据有存档要求,或者需要历史数据进行恢复等, 这些情况就必须采用逻辑删除了。

那么逻辑删除该采用怎样的设计呢?

方案1:增加delete_token字段(需要设置默认值,如“defaultToken”),与原来的unique key 组成联合主键.

delete_token字段作用:用来标识该条记录被删除,而不是通过原来的status或enabled字段来区分该记录是否已删除。

比如本文开头我碰到的情况,可以增加一个字段delete_token字段,与原来的字段A组成联合主键。比如删除表T中数据记录1时,delete_token可以更新为该条记录的主键id或者生成的唯一随机值(如UUID),用该方案可解决不能插入已删除数据的问题。同时也要注意,表T的关联关系表也需要进行类似的处理。

优点:不需要引入新表

缺点:若业务量较大或增删频繁,那么数据增长速度会很快,导致一张表中数据量太大,对表的操作效率会降低。

结论:适用于数据量较小、增删不频繁的场景。

方案2:增加备份表(删除记录表)

每张表都设计一张对应的备份表,用于存储删除的数据。表结构可以根据实际需要在原表基础上增加删除时间、删除操作者之类的字段。这样在删除数据时,对于原表,相当于是物理删除,然后再备份表中插入新的记录。注意:关联关系表也需要备份表。

优点:跟物理删除类似,不会有数据冲突的问题。同时也满足了逻辑删除的需求。将在用的业务数据与历史数据区分开,业务结构更清晰。

缺点:需要逻辑删除的数据都要有对应备份表。

结论:推荐该方案。

最后总结:推荐方案2,若大家有更好的方案,欢迎讨论。

 

参考资料:

https://www.jianshu.com/p/f37281576585

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144975.html原文链接:https://javaforall.net

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


相关推荐

  • CentOs官网下载,CentOS国内镜像下载

    CentOs官网下载,CentOS国内镜像下载进入CentOs官网下载地址:https://www.centos.org/download/往下拉,找到alternativedownloads超链接点击下载你需要的版本往下拉找到BaseDistribution,选择自己的版本,点击Tree选择CentOs的ISO镜像文件(isos目录)选择对应电脑的版本进行下载选择你需要的,一般下载DVD标准安装版就行在官网下载的时候是非常慢的,毕竟服务器在国外,所以可以使用国内镜像下载。CentOS7版本的国内下载http://mir.

    2022年6月5日
    42
  • 静态网页设计作品_web静态网页模板

    静态网页设计作品_web静态网页模板作品汇报新的一年新的成就,经历了一星期的思考,新的作品终于完成啦,14张页面经历了多次的修改和揣摩,希望大家能够喜欢。作品主题是“春节”页面框架页面应用了导航栏下拉的形式,使导航栏更加简洁,让浏览者留下空间感,导航栏下拉形式能够让浏览者清晰的浏览页面,页面以红色为底色,更能突出春节这一主题,能够突出春节的喜庆首页首页运用表单和超链接,能够突出该页面的作用,表单运用border-radius属性,使页面更美观春节简介和起源禁烟令的实施和疫情的爆发,让中国春节减少了许多的年味,大部分人都快遗

    2025年8月31日
    8
  • sql镶嵌查询_SQL数据查询之——嵌套查询「建议收藏」

    sql镶嵌查询_SQL数据查询之——嵌套查询「建议收藏」一、概念描述在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。例如:SELECTSname/*外层查询或父查询*/FROMStudentWHERESnoIN(SELECTSno/*内层查询或子查询*/FROMSCWHERECno=’2′);SQL语言允…

    2022年8月10日
    9
  • css中100vh 加减运算[通俗易懂]

    css中100vh 加减运算[通俗易懂]vh/vwvh:相对于视窗的高度,视窗被均分为100单位的vh;vw:相对于视窗的宽度,视窗被均分为100单位的vw;vmax:相对于视窗的宽度或高度中较大的那个。其中最大的那个被均分为100单位的vmax;vmin:相对于视窗的宽度或高度中较小的那个。其中最小的那个被均分为100单位的vmin;视区所指为浏览器内部的可视区域大小,即window.innerWidth/window.innerHeight大小,不包含任务栏标题栏以及底部工具栏的浏览器区域大小。calcca…

    2022年5月5日
    56
  • gp数据库查看建表语句_gp数据库常用命令

    gp数据库查看建表语句_gp数据库常用命令常用建表结构,根据需求自行更改即可使用!droptableifexistsrpt.rpt_bill_m;createtablerpt.rpt_bill_m(user_idSERIAL,—-自增序列acct_monthvarchar(6),bill_feenumeric(16,2),user_infotext)WITH(app…

    2025年9月4日
    7
  • SNMP 协议[通俗易懂]

    SNMP 协议[通俗易懂]一、SNMP协议概述简单网络管理协议(SNMP:SimpleNetworkManagementProtocol)是由互联网工程任务组(IETF:InternetEngineeringTaskForce)定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP:SimpleGatewayMonitorProtocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。虽然SNMP开始是面向基于IP的网络管理

    2022年10月17日
    3

发表回复

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

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