物理删除、逻辑删除以及逻辑删除保留唯一索引的方案

删除数据库记录是一个非常常见的需求,当数据失去价值时,我们便会删除它,但是如果操作不当,往往就会把一些有价值的数据误删掉,造成重要数据的丢失,合理采用删除方式才能更好地利用数据资源,下面介绍几种常用的删除方式。

删除方式

物理删除

物理删除就是直接从数据库中删除一条或多条记录,将数据从磁盘上擦除,可以使用DELETE FROMSQL语句实现,这种方式产生的后果就是记录永久性删除,无法找回,一般适用于小型或数据重要性不高的项目,可以提高数据库资源利用率。物理删除方式是一种最简单最基本的数据删除方式,这里不多做介绍,我们主要来看一下逻辑删除方式。

逻辑删除

所谓的逻辑删除就是实现记录已删除的效果,但实际上数据仍然存在于数据库中,只是对用户隐藏这一部分数据。一些大型的、数据关联性高、数据重要性高的应用往往会采用这种删除方式,它可以实现回收站、删除恢复、查看历史版本等实用功能,根据业务的需要有不同的应用场景。

应用场景

例如,在一些邮箱应用中,当你删除一条邮件时,不会将邮件直接删除,而是把邮件移动到回收站,你可以在回收站中对邮件进行恢复、彻底删除等操作,可以有效防止误删等情况。
再比如博客管理平台一般都会提供查看修改历史、比较历史版本等功能,我们可以方便地查看文章的修改历史,以及恢复到之前某一版本。

逻辑删除的弊端

  • 逻辑删除的设计还会导致常用的 unique key 失效(当然用户可将数据行中原来的码和is_deleted 一起作为 unique key,但是这样又会出现,再次删除时,系统中无法出现两个完全相同的 ID,又都是is_deleted=1的记录出现)。
  • 被“删除”的这条记录如果在业务中与大量的表有关联关系,那么在删除它时,就会引发很多的级联的更新,或者判断引用并提示用户无法修改正被引用的资源。而要保证这些全部更新无误,又要求事务一定可靠,若产生了状态不一致,那么这些“脏数据”的维护也是很痛苦的。
  • 当表中的记录数越来越大时,查询起来会越来越慢。

逻辑删除保留唯一索引的方案

创建一个商品编码为A110的商品,商品编码为该表的唯一性索引,此时对该商品进行删除后,无法再次添加商品编码为A110的商品。

将商品编码与删除标识设置为复合唯一索引,每次删除时将删除标识设置为NULL,由于NULL不会与其他字段有组合唯一的效果,所以完美的解决了逻辑删除保留唯一索引的问题。

删除标识设置为null,会失去业务语义,也可以通过下面的方案去解决:

未删除标识为0,已删除的标识为负数。

再次删除时,根据同名name对删除标识做排序,获取最小的删除标识minDeletedVersion,然后再将删除标识置为minDeletedVersion-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值