`
mwhgJava
  • 浏览: 100482 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于数据库表字段逻辑删除设计的思考

 
阅读更多
一句话描述:逻辑删除建议使用2张表。

通常我们在做配置类的表设计时,

    1. 为了审计谁最后废弃删除了配置数据。
    2. 为了在误删除数据时,很方便的恢复数据。


我们使用了逻辑删除相关字段,deleteId和deleteTime等。

这样被逻辑删除的数据仍然遗留在表中。
这个逻辑删除字段,对业务代码的影响较大;对更新和查询数据库的性能影响也较大。表现如下:
1. 查询数据时,所有的查询条件都需要增加deleteTime==null。
2. 不可以使用业务唯一性Id作为数据库表Id,需要增加1个专门的没有逻辑意义的自增长Id作为唯一性Id。
3. 业务Id不能建唯一性约束,也不能建唯一索引。
4. 增加数据时,判断业务Id是否为重复,需要先做查询,不能利用表的唯一约束。
5. 增加数据时,判断唯一性字段是否重复,需要先做查询,也不能利用表的唯一约束。


建议设计:增加1张表,专门保存被逻辑删除的数据。

操作方式:
1. 在原表表空间(数据库)下,新增加1张表,表名为原表名+backup。
2. 复制原表的所有字段定义。
3. 新增自增长Id字段作为新表的Id。
4. 新增deleteId和deleteTime字段。(假设原表中没有deleteId和deleteTime字段。)
5. 删除复制于原表Id及其他字段的唯一性约束。

使用方式:
      当删除数据时,在1个事务里,同时将数据从原表中删除,并插入到新表中。其他操作与物理删除时的设计,保持不变。

使用好处:
1. 除删除操作外,其他操作与物理删除时的设计完全一致,客户端代码简单。(因为对于原表确实是物理删除。)
2. 业务Id可以作为主键,不用建立普通索引,查询更快。
3. 查询时不用过滤被逻辑删除的数据,查询更快。
4. 如果觉得逻辑删除没有意义,想恢复物理删除。只需要修改删除逻辑即可,其他地方没有任何影响。

另外:使用1张表比使用2张表在数据恢复时的一个假想优势是不存在的。
该假想优势表现为:使用1张表时,只需要将逻辑删除字段设置为空(deleteId=null, deleteTime=null),就可以恢复数据。
分析:这种恢复数据的方式,可能破坏逻辑Id及其他唯一性约束字段的约束。
因此,直接清空逻辑删除字段恢复数据的方式不可取。只能参考原始数据,从新新增1条新数据,并校验相关参数。
使用这种方式恢复数据,2种方式都一样。

所以:我建议使用这种新的方式设计数据库表结构。

分享到:
评论

相关推荐

    使用JDBC访问数据库

    - **实体类设计**:例如`User`类,其成员变量应与数据库中的`users`表字段相对应。 - **数据库类设计**:设计一个类来封装与数据库交互的操作,如查询用户、插入新用户等。 ##### 8.4 注册和登录模块 - **注册模块...

    JAVA简单学生管理系统完整版+设计报告

    开发者需要创建对应的数据库表结构,表字段可能包括学号、姓名、年龄、性别等基本信息。 其次,系统的业务逻辑层通常由一系列的JAVA类组成,这些类封装了具体的业务操作,如Student类用于表示学生对象,包含了学生...

    基于SpringBoot的失物招领平台源码数据库.doc

    - **数据表设计**:根据系统需求分析,设计出如“用户信息表”、“失物信息表”、“公告信息表”等关键数据表,并确保每个表字段的合理设计。 - **索引优化**:通过对常用查询条件进行索引优化,提升查询效率,保证...

    MybatisTest.zip

    - 实现实体类,并确保其属性与数据库表字段一一对应。 - 编写测试类,运行测试以验证操作的正确性,例如插入数据、查询数据、更新数据和删除数据。 通过这些练习,你不仅能掌握Mybatis的基本用法,还能了解到如何...

    hibernate中文文档

    通过在类上使用@Entity注解,并定义属性与表字段相对应,实现对象到表的映射。 4. **主键(Primary Key)**:每个实体类都有一个标识其唯一性的主键。在Hibernate中,可以使用@Id注解来标记主键字段。 5. **持久化...

Global site tag (gtag.js) - Google Analytics