如何在唯一性索引的情况下做逻辑删除
前提
我们往往在面对接口幂等或者防止消息的重复消费的情况时,无论我们采取什么样的技术操作都需要在数据库层面做一定的唯一性索引来真正的保证我们对于幂等性的控制。
但是,我们对于数据库的删除操作往往是一种逻辑删除的操作,比如将is_deleted变为1等等,在这种情况下我们再往数据库插入数据,然后又删除便有可能导致数据库发生唯一性报错。
解决
方案1 物理删除+数据归档
- 重新制定一张历史记录表
- 当我们对表的删除操作直接使用物理删除,如果是更新或插入操作着对历史记录表进行记录
- 我们还可以通过数仓等方式来对每天的数据变化SQL(除了Delete)进行数据同步,时间点我们可以选择在凌晨之类的请求量少的时间,而如果在当天便有删除操作则需要直接进行数据同步
方案2 复用一条开通记录+记录开通流水
- 如果是针对用户与某一样数据的情况下,那么用户与产品只会有一条数据的变化,我们便可以制定一张流水表来解决
- 流水表正常会多一个stream_type字段,以此来标识数据的状态变化(状态机)
方案3 >0都表示逻辑删除
- 每次删除之后,is_deleted都+1,is_deleted=1表示第一次删除,is_deleted=2表示第2次删除
- 或者那就是在用户删除的时候,直接把这条service_record的主键(前提需要时自增的ID)设置到is_deleted中
方案4 引入字段
- 我们可以在唯一性索引中加一个额外字段,默认0
- 当我们删除时可以将时间戳或者数据id赋值给该字段进行逻辑删除
如何在唯一性索引的情况下做逻辑删除
http://lzhnet.top/2023/10/18/如何在唯一性索引的情况下做逻辑删除/