【数据库】字段逻辑删除的设计

发布时间 2023-07-05 19:48:27作者: DeepInThought

背景

出于系统安全考虑,数据库的数据会尽可能采用逻辑删除的方式。

逻辑删除带来的问题

1. 数据冗余

2. 增加开发复杂度

3. 增影响惟一性约束

  • 若表中字段要求唯一约束,旧数据逻辑删除后,将不能插入同数值的新纪录;
  • 若不为字段设置唯一性约束,每次系统数据时,需先查询是否存在未删除的同数值。

解决方案:

将唯一约束字段和删除相关的字段创建成组合唯一索引。

  • 将删除标记设置默认值(例如0),将唯一字段与删除标记添加唯一键约束。当某一记录需要删除时,将删除标记置为NULL
    由于NULL不会和其他字段有组合唯一键的效果,所以当记录被删除时(删除标记被置为NULL时),解除了唯一键的约束。此外该方法能很好地解决批量删除的问题(只要置为NULL就完事了),消耗的空间也并不多(1位 + 联合索引)。

  • NULL在某些情况下是存在一些问题的,删除时可以将删除标记更新为主键,这样同样保证了唯一约束字段和删除标记组合索引的唯一性。

  • 还可以用另外一种方案,添加一个删除时间delete_time的字段,设置一个不为NULLl的默认值,和惟一字段组成联合唯一索引,当进行逻辑删除的时候同时要更新delete_time,这样同样可以保证惟一性。

参考:

https://mp.weixin.qq.com/s/sfPR2_uIxEtL61yQOB7-ng