一句话描述:逻辑删除建议使用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种方式都一样。
所以:我建议使用这种新的方式设计数据库表结构。
分享到:
相关推荐
管家婆数据库表字段管家婆数据库表字段
### 数据库表字段命名规范详解 #### 摘要与背景 随着软件开发项目的日益复杂化,数据库的设计和管理成为了确保应用稳定性和高效性的关键环节之一。然而,在实际的开发过程中,由于数据库表及其字段命名缺乏一致性和...
百威数据库表字段明细 序号 表名称 字段 功能 1 bank_t_cash_detail sheet_no 现金银行单单号 2 bank_t_cash_detail flow_id NULL 3 bank_t_cash_detail type_no 收支类型 4 bank_t_cash_detail bill_cash 金额 5 ...
在数据库设计与管理中,有时我们需要在表字段中加入换行符以达到特定的数据展示或处理需求。这通常应用于需要存储多行文本的场景,比如备注、地址等信息。本文将详细介绍如何在数据库表字段中实现换行功能。 #### ...
根据数据库表字段生成javabean的Eclipse插件 目前支持mysql oracle 数据库 支持生成Ibatis 配置文件 支持生成国际化配置文件,根据数据库字段描述(oracle) 支持批量生成javabean
数据库逻辑结构设计(学生成绩管理系统) 数据库逻辑结构设计是指根据业务需求对数据库的逻辑结构进行设计,目的是为了建立一个高效、可靠、易于维护的数据库系统。在学生成绩管理系统中,数据库逻辑结构设计是整个...
数据库逻辑结构设计在学生成绩管理系统中的应用 数据库逻辑结构设计是数据库设计的重要组成部分,它决定了数据库的基本逻辑结构,即表的结构设计。学生成绩管理系统的数据库逻辑结构设计是指根据系统的需求,设计...
标题中的“更新数据库表字段生成javabean的Eclipse插件(新)”指的是一个Eclipse开发工具的扩展,它的主要功能是自动化地根据数据库表结构生成对应的Java Bean类。这样的工具能够极大地提升开发效率,避免手动编写...
用友的ERP财务管理系统的库表字段解释描述,用Access打开就可查看,对用友二次开发,操作库表(开库)有巨大的帮助。
包含了对数据库逻辑结构设计的方法等的归纳总结。
SQL数据库逻辑设计知识点摘要 SQL数据库的逻辑设计是指对数据库的设计和实现,以满足用户的需求和 expectation。逻辑设计阶段的主要任务是根据用户的需求和数据模型,设计出一个逻辑上正确、物理上高效的数据库结构...
数据库设计的任务是根据一个组织的信息需求、处理需求和数据库支撑环境,设计出数据库模式 —— 包括概念模式、逻辑模式和物理模式。 数据库设计的结果不是唯一的,不同的设计者可能得出不同的数据库模式。评判...
对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 , 基于 FMDB,操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整体进行操作, 根据 model 对象自动建表,字段类型只支持 NSString , NSIteger ,...
商品销售统计,可根据不同的时间段,不同的商品编码,进行相应的统计 商品进/出货 商品出/入库 商品采购 商品付款单 新增商品---------用于录入超市原来没有的商品 会员卡的增,删,改,查 会员记录表中我只写了三条记录,...
金蝶k3数据库表表名及字段说明十分详细,修改数据或简单二次开发,问题故障查询都可以用得上哦
软件数据库设计是一个复杂的过程,涉及到数据库逻辑设计、物理设计、分布式数据库设计等多个方面。为了确保软件系统的数据库设计是正确的和高效的,需要进行细致的设计和规划。本文档旨在提供一个软件数据库设计文档...
本教程将深入探讨“不同数据库中表字段数据的导出”这一主题,这对于数据迁移、备份、分析或共享至关重要。无论你是数据库管理员、开发人员还是数据分析爱好者,了解如何高效地导出字段数据都是必备技能。 首先,让...
在数据库设计说明书的引言部分,明确指出文档的编写旨在为项目参与者提供关于数据库设计的全面指导,确保所有相关方对数据库的结构、功能和操作有清晰的理解。预期读者包括但不限于项目管理者、系统分析师、数据库...
关系数据库--逻辑结构设计举例
这份报告涵盖了多个关键阶段,包括需求分析、概念设计、逻辑设计以及物理结构设计等,同时也涉及数据库的运行与维护。 1. 引言: 报告的引言部分主要阐述了编写目的,即通过设计一个工资管理系统数据库,提高学生...