版本控制的设计是数据库内设计的一种常见设计方案,使用时,首先,要对数据库中的表新增一条版本号字段。
版本字段内数据的设计,一般采用两种方式,一种是使用一条自增的数据,每新增一条数据, 版本号就会加一;另一种是使用生效时间和失效时间,生效时间是本条数据的创建时间,失效时间设置成一个无限远的时间,常设置成“ 9999/12/31 23:59:59”,进行区间限定。
设置版本号的作用主要有两个,一个是可以保留历史数据,另一个就是可以有效的解决并发编辑操作。如:A和B两个人同时对一条数据进行修改,两者拿到的数据都是版本1,A先修改数据完成,进行提交,在提交数据前,会先查看了下数据当前版本为1,自己则在此基础上,更替为2,修改成功。接着,B也修改数据完成,在提交数据前,也会进行一次查询,查看了下当前数据版本为2,与自己拿到的数据不符,所以B修改数据失败。只有B重新刷新,获取到新的版本2的数据后,才可以进行修改。这对于并发编辑修改数据时间过长的操作,是非常有必要的。
上面的增加自增版本号方法和设置生效失效时间区间方案,虽然都能有效解决历史记录和并发修改问题,但是,每次在修改数据时,数据的主键都会变动新增,主键的变动使得关联的对象完全变动,所以需要使用一个标识,从而明确变动前后的数据是同一个对象。所以我们引入一个新的字段,即业务主键。
数据库内的主键,就是数据库内一行数据的唯一标识。而主键有分为两种:
(1)业务主键:采用业务数据中的某个唯一字段作为主键,如:公司内部的员工号,车辆管理的车牌号,人员档案的身份证号。业务主键即使独立开来,也仍然具有意义。但是这种主键会有比较大的变动可能性,如数据升级、人员调动等,将给数据的维护带来较大困难,并且,并不能真正意义上保证主键唯一性,如当前身份证由于各种原因,还是有极小概率的重复。所以常不建议直接使用其作为数据主键。
(2)逻辑主键:不采用任何数据作为主键,而是采用一个没有意义的数值作为主键。常见的两种方式为主键自增和UUID随机生成主键,主键自增的优势在于生成主键的速度较快,大约比UUID快30倍左右,但主键自增会面临合表时的主键冲突问题,这个是UUID的优势。
则在逻辑主键基础上,引入业务主键,其使用情形如下:

(逻辑)主键id 用户名 年龄 员工号(业务主键id) 版本号
1 jack 16 1 1
2 jack 17 1 2

上表中,jack的员工号为1,这是其业务主键,修改前后,该数据是不会发生变化的,原数据为第一条,修改后新增第二条,虽然逻辑主键自增了,但是可以通过员工号(业务主键)确定该数据的唯一归属对象。
而对于获取数据库表中的最新版本的数据,可以采用如下sql语句进行获取:
select 要查询的字段名 from 表名 as a where 版本号字段 = (select max(b.版本号字段) from 表名 as b where a.业务主键id = b.业务主键id);
如user数据表:
select * from user as a where vb=(select max(b.vb) from user as b where a.number = b.number);
这样就可以获得全部都是最新版本的数据表。
还需要说明的一点是,例如本例的情况下,如果有关联本表的其他表,利用业务主键id,作为其他表的外键,可以在只修改本表时,不影响其他表的数据。

数据库内数据的版本控制相关推荐

  1. Java导出Excel百万条数据表格数据实现分页easyexcel方法和Apach POI方法

    关闭程序的查询sql语句打印日志功能,否则速度很慢 注意: 此导出excel样式只是简单设置而已 1.创建实体类 ExcelModel 导出数据库对应实体数据列表 简单样式设计 MAVEN仓库依赖或者 ...

  2. 关于数据库内“表”的几点

    数据库内包含许许多多的表. 表里包含着许许多多的字段. 表的创建命令如下: CREATE TABLE 表名(指令尽量大写,表名小写). 正确的格式为: CREATE TABLE 表名( 字段一     ...

  3. python中引入sql的优点_SQL Server 2017中的Python:增强的数据库内机器学习

    Microsoft SQL Server是一款优秀的关系型数据库管理系统,Python是目前流行的数据科学语言之一,拥有丰富的库生态系统.从SQL Server 2017的CTP 2.0版本开始,可以 ...

  4. oracle12c 清理归档,Oracle 12c中数据删除(delete)新特性之数据库内归档功能

    有些应用有"标记删除"的概念,即不是删除数据,而是数据依然保留在表中,只是对应用不可见而已.这种需求通常通过如下方法实现: 1)  给相关表增加一个另外的列,该列存储标志数据被删除 ...

  5. 数据科学家 数据工程师_数据科学家应该对数据进行版本控制的4个理由

    数据科学家 数据工程师 While working in a software project it is very common and, in fact, a standard to start ...

  6. 嘉年华ON LINE首次在墨天轮和视频号并机直播,数据库内核技术抢先get

    DTC 2021前哨 2021数据技术嘉年华·ON LINE(第一期) 数据库内核技术 10月29日下午两点 墨天轮平台和视频号 将首次实现并机直播! 速度冲! 『数据技术嘉年华』(DTC)是中国DB ...

  7. 想深度探究数据库内核技术,墙裂推荐你看看这个

    想必,大ga应该都知道11月19日-20日要举办的2021数据技术嘉年华了吧~为了照顾很多不能来到现场的小伙伴,我们经过慎(ming)重(si)思(ku)考(xiang),激(nu)烈(li)讨(zh ...

  8. 9月24日直播丨数据库大咖讲坛(第7期):数据库内核技术与行业应用

    活动时间 9月24日  14:00-17:30 活动概述 数据库是组织.存储.管理.分析数据的系统,是IT行业最重要的基础软件,目前各行各业所有的信息系统都需要使用数据库系统管理业务数据.数据库在软件 ...

  9. 【12c】新特性:Oracle 12c In-Database Archiving 数据库内归档

    通常,在应用程序开发中对表做设计时,不可避免的会对表中的数据做删除处理,如果直接使用硬删除,则不能有效的对已删除的数据进行追踪:如果采用软删除(例如表中增加了删除标记的字段delete_flag),虽 ...

最新文章

  1. 首创模拟电子计算机,指导日本原子弹投射,这个大佬有点牛
  2. Android Jetpack组件之 Room使用-源码
  3. Spring 框架用到的 9 个设计模式汇总!
  4. LAPM×××和php加速器
  5. linux查看tcl版本_查看Linux内核版本的方法有几个?你也是这样操作吗?
  6. EIGRP的基本配置
  7. 漫画《灌篮高手》将拍电影?井上雄彦发文确认
  8. 双亲委托类加载机制_图解JVM类加载机制和双亲委派模型
  9. 如何卸载 Adobe Creative Cloud 桌面应用程序
  10. 遥感数字图像融合算法简介
  11. MTK摄像头调试工具 CCT 的使用
  12. 马王堆汉墓帛书‧老子乙本——道经
  13. 仿京东App分类页面的实现
  14. confluence 删除_知识管理平台Confluence教程:如何删除或还原页面?
  15. 设计模式六大设计原则 详细整理版
  16. Oracle 查询:一小时内、一天内、一周内等
  17. python+rf获取当前时间
  18. 经济学和计算机类大学排名,经济学专业世界大学排名ARWU
  19. 王佩丰excel课程笔记
  20. 《电工学上》知识点整理(猴博士)

热门文章

  1. Flutter移动应用开发 -苹果(iOS)风格提示框
  2. iAd可能比iPad更伟大?
  3. java判断integer长度_Integer比较大小
  4. sql update 语句_SQL Update语句概述
  5. vue怎么放网页图标
  6. setTimeout执行时间
  7. socket编程:WSAStartup函数详解
  8. 架构师必备,了解分层架构中缓存那点事儿
  9. 主板芯片组与内存映射
  10. prototype 和 proto 的区别