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

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

时间:2023-07-05 19:58:05浏览次数:52  
标签:约束 逻辑 删除 标记 数据库 唯一 字段 NULL

背景

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

逻辑删除带来的问题

1. 数据冗余

2. 增加开发复杂度

3. 增影响惟一性约束

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

解决方案:

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

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

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

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

参考:

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

标签:约束,逻辑,删除,标记,数据库,唯一,字段,NULL
From: https://www.cnblogs.com/DeepInThought/p/17529643.html

相关文章

  • 6月《中国数据库行业分析报告》已发布,首发空间、搜索引擎数据库【全球产业图谱】
    为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况,从2022年4月起,墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》,持续传播数据技术知识、努力促进技术创新与行业生态发展,目前已更至第十四期,并发布了共计1......
  • Unity 在AssetPostprocessor内使用AssetDataBase是不安全的行为(尤其在Build前进行Lib
    https://docs.unity3d.com/Manual/AssetDatabaseCustomizingWorkflow.html在Build前进行Library的删除,读取Asset是不安全的行为,需要使用C#的IOSystem进行操作AssetImportOrderIfyouarescriptingusingtheAssetDatabaseclass,it’simportanttounderstandhowtheor......
  • Oracle数据库扩展表空间
    --step1查询当前表空间的使用率selecta.BYTES/a.MAXBYTES*100,a.*fromdba_data_filesawherea.TABLESPACE_NAME='yourtabespacename';--step2扩展表空间并设置自增altertablespace{yourtabespacename} adddatafile'D:\APP\ADMINISTRATOR\ORADATA\AXXXL\......
  • Postgresql 大象数据库long自定义自增
     Postgresql --创建序列CREATESEQUENCEuser_long_id_seqSTART100000;CREATESEQUENCEdepartments_long_id_seqSTART100000;CREATESEQUENCEpositions_long_id_seqSTART100000;CREATESEQUENCEposition_grades_long_id_seqSTART100000;--设置对应列Key值A......
  • MongoDB数据库部署与应用
    MongoDB数据库部署与应用拓扑图:推荐步骤:在Centos01上安装mongoDB数据库管理mongoDB服务生成MongoDB配置文件通过控制文件控制MongoDB服务,配置MongoDB身份验证配置mongoDB身份验证管理和修改配置文件支持验证配置mongoDB基本管理配置MongoDB数据备份恢复实验步骤:一.在Centos01上安装m......
  • 无法删除数据库,因为该数据库当前正在使用
    原文:https://blog.csdn.net/weixin_30411997/article/details/94776946除数据库时提示数据库正在被使用,无法删除(Cannotdropdatabasedatabasenamebecauseitiscurrentlyinuse)的问题 删除数据库时提示数据库正在被使用,无法删除(Cannotdropdatabasedatabasenamebe......
  • 解决升级Jeesite版本(gradle构建),可能导致初始化数据库数据失败的问题?
    1、核心模块core下的资源文件,因存放在java文件路径下,不规范可能导致找不到初始化数据表。报错截图:  解决办法:在core文件夹下的资源文件复制一份初始化数据表。 2.cms文件使用gradle构建时,需要build文件里的jar包,如果缺少可能会报找不到cms初始化数据库文件。  解......
  • 批量删除后台
      删除一个 删除多个  BrandMapper.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"&g......
  • MySQL数据库8.0.29-8.0.31版本使用 INSTANT 算法新增字段bug
    xxx下发MySQL数据库共性隐患排查通知,要求统一排查MySQL数据库8.0.29及以后版本使用INSTANT算法新增字段后期变更回滚可能导致数据库宕机的隐患,排查方法及整改方法详见下表和附件。请各分支()数据库运营人员集中排查隐患,及时整改。 隐患概述MySQL数据库8.0.29及以后版本......
  • Django 数据库操作
    查询models.UserInfo.objects.all()models.UserInfo.objects.all().values('user')#只取user列models.UserInfo.objects.all().values_list('id','user')#取出id和user列,并生成一个列表models.UserInfo.objects.get(id=1)models.UserInfo.objects.get(u......