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

关于数据库逻辑删除(伪删除)的设计方案探讨项目上碰到过关于数据采用了逻辑删除导致的问题,情况是这样:原先的代码中,对于表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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PYTHON主机_我的Python世界PDF

    PYTHON主机_我的Python世界PDF学了好长一段时间Python了,前段时间想找个支持Python(Django)的空间来试试。国外的主机虽然性价比高(都是按G来算),但是没有美元也没有信用卡,就没法了。国内的支持Python(Django)的空间还真是少,我找了好几天就看到两个比较好的:捌号主机和浪点 。但是捌号主机的空间也真是有够贵的,是便宜的也是好几百。最后我选择了浪点的空间。浪点的空间要普通级以上才能开通

    2022年10月10日
    2
  • 项目总结笔记系列 wsTax KT Session2 代码分析

    项目总结笔记系列 wsTax KT Session2 代码分析

    2021年9月5日
    45
  • datatables pagehelper分页问题

    datatables pagehelper分页问题

    2021年5月12日
    118
  • 机器人手眼标定Ax=xB(eye to hand和eye in hand)及平面九点法标定[通俗易懂]

    机器人手眼标定Ax=xB(eye to hand和eye in hand)及平面九点法标定[通俗易懂]一、背景Calibration是机器人开发者永远的痛。虽然说方法说起来几十年前就有,但每一个要用摄像头的人都还是要经过一番痛苦的踩坑,没有轻轻松松拿来就效果好的包。机器人视觉应用中,手眼标定是一个非常基础且关键的问题。简单来说手眼标定的目的就是获取机器人坐标系和相机坐标系的关系,最后将视觉识别的结果转移到机器人坐标系下。手眼标定行业内分为两种形式,根据相机固定的地方不同,如果相机和机器…

    2022年4月27日
    97
  • 数组和链表的区别浅析

    数组和链表的区别浅析1.链表是什么链表是一种上一个元素的引用指向下一个元素的存储结构,链表通过指针来连接元素与元素;链表是线性表的一种,所谓的线性表包含顺序线性表和链表,顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现。而链表不是用顺序实现的,用指针实现,在内存中不连续。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。所以,链表允许插入和删…

    2022年6月15日
    34
  • rehash过程_contenthash

    rehash过程_contenthash步骤1)首先创建一个比现有哈希表更大的新哈希表(expand)2)然后将旧哈希表的所有元素都迁移到新哈希表去(rehash)dictAdd对字典添加元素的时候,_dictExpandIfNeeded会

    2022年8月3日
    4

发表回复

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

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