数据库内数据的版本控制

版本控制的设计是数据库内设计的一种常见设计方案,使用时,首先,要对数据库中的表新增一条版本号字段。
版本字段内数据的设计,一般采用两种方式,一种是使用一条自增的数据,每新增一条数据, 版本号就会加一;另一种是使用生效时间和失效时间,生效时间是本条数据的创建时间,失效时间设置成一个无限远的时间,常设置成“ 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)版本号
1jack1611
2jack1712

上表中,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
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是实验七的内容。 实验目的: 1. 掌握Oracle数据库数据控制语句 2. 掌握Oracle数据库用户权限管理 实验环境: Oracle 11g及以上版本 实验步骤: 1. 创建一个测试用户 ```sql create user test identified by test; ``` 2. 授予测试用户查询表的权限 ```sql grant select on 表名 to test; ``` 3. 创建一个测试表 ```sql create table test_table( id number primary key, name varchar2(20) ); ``` 4. 插入测试数据 ```sql insert into test_table values(1,'张三'); insert into test_table values(2,'李四'); insert into test_table values(3,'王五'); ``` 5. 测试用户查询表数据 ```sql select * from test_table; ``` 此时会提示“无权访问表”,因为测试用户没有该表的查询权限。 6. 将查询权限授予测试用户 ```sql grant select on test_table to test; ``` 7. 再次查询表数据 ```sql select * from test_table; ``` 此时测试用户可以查询到表数据。 8. 创建一个新用户,并给该用户授予所有权限 ```sql create user all_privs identified by all_privs; grant dba to all_privs; ``` 9. 使用新用户登录数据库,查看所有表 ```sql select table_name from user_tables; ``` 可以看到所有表的列表。 10. 退出当前用户,使用管理员用户删除测试用户和测试表 ```sql drop user test cascade; drop table test_table; ``` 实验完成。通过此实验,你应该已经掌握了Oracle数据库数据控制语句和用户权限管理的基本操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值