以下例子以sql server数据库系统为准。
为了实现对数据库能够实现增量导出,要求被导出的表格建立时间戳、创建日期、修改日期、是否有效四个字段(其中,创建日期和修改日期要精确到毫秒)。
当表格进行insert操作时,其中时间戳会自动更新,创建日期和修改日期初始化为当前服务器时间,是否有效初始化为0。这时,创建日期和修改日期是相等的。当一笔记录固化到数据库中后,创建日期要保持不变。当执行update操作时,时间戳自动更新,创建日期保持不变,修改日期更新为当前服务器日期,这时创建日期和修改日期是不相等的,且修改日期是大于创建日期。当执行delete操作时,时间戳自动更新,创建日期和修改日期不变,是否有效改变为1。
在每个表格的记录中,每条记录可分为如下三种状态:new(新增)、changed(改变)、deleted(删除)。我们可通过创建日期、修改日期、是否有效这三个字段的比较,来判断一条记录处于何种状态。
数据导出分为全量导出和增量导出,全量导出是对一张表、多张表,甚至整个数据库的拷贝;而增量导出只针对后期添加、更新及删除的数据的导出。
接下来以实例来说明增量导出的思路。
当利用数据交换系统进行导数据时,须先注册外部系统信息,每个外部系统分配一个唯一的ID,这个ID被确定后,是不能被修改的。
在这里假设已经注册了一个ID为001的外部系统。
假设一张人员信息表(userInfo),有ID、姓名、时间戳、创建日期、修改日期、是否有效6个字段。
在2010-11-10天,人员信息表添加了四条记录,记录具体如下:
|
ID
姓名
时间戳
创建日期
修改日期
是否有效
1
张三
1
2010-11-10 09:00:00.120
2010-11-10 09:00:00.120
0
2
李四
2
2010-11-10 10:21:23.100
2010-11-10 10:21:23.100
0
3
赵五
3
2010-11-10 11:00:00.420
2010-11-10 11:00:00.420
0
4
王六
4
2010-11-10 11:09:07.190
2010-11-10 11:09:07.190
0
?
在2010-11-12这天的9:13:00.001这个时间点进行了第一次数据导出,导出后保存系统操作日志信息,信息如下:
外部系统ID
表格名称
时间戳
操作日期
001
userInfo
4
2010-11-12 09:13:00.001
其中,时间戳获取的是人员信息表最大的时间戳。
?
在2010-11-13修改了ID=2的记录,并添加了一笔记录,记录具体如下:
ID
姓名
时间戳
创建日期
修改日期
是否有效
1
张三
1
2010-11-10 09:00:00.120
2010-11-10 09:00:00.120
0
2
李四
5
2010-11-10 10:21:23.100
2010-11-13 13:38:33.540
0
3
赵五
3
2010-11-10 11:00:00.420
2010-11-10 11:00:00.420
0
4
王六
4
2010-11-10 11:09:07.190
2010-11-10 11:09:07.190
0
5
方七
6
2010-11-13 15:38:33.540
2010-11-13 15:38:33.540
0
6
张飞
7
2010-11-13 15:40:33.540
2010-11-14 08:0033.540
0
我们现在来分析下这张表格,以2010-11-12这天的9:13:00.001这个时间点作为分水岭,
ID
姓名
时间戳
创建日期
修改日期
是否有效
1
张三
1
2010-11-10 09:00:00.120
2010-11-10 09:00:00.120
0
3
赵五
3
2010-11-10 11:00:00.420
2010-11-10 11:00:00.420
0
4
王六
4
2010-11-10 11:09:07.190
2010-11-10 11:09:07.190
0
这三条记录是导出前添加,导出后没有被修改。
?
ID
姓名
时间戳
创建日期
修改日期
是否有效
2
李四
5
2010-11-10 10:21:23.100
2010-11-13 13:38:33.540
0
这条记录是导出前添加,导出后被修改。
?
ID
姓名
时间戳
创建日期
修改日期
是否有效
5
方七
6
2010-11-13 15:38:33.540
2010-11-13 15:38:33.540
0
这条记录是导出后被添加,在下次导出前没有被修改。
?
ID
姓名
时间戳
创建日期
修改日期
是否有效
6
张飞
7
2010-11-13 15:40:33.540
2010-11-14 08:0033.540
0
这条记录是导出后被添加,在下次导出前被修改。
?
2010-11-15这天的9:10:30.221这个时间点进行了第二次数据导出,要实现的是增量导出。我们通过表格比较,下列几条记录这次导出的对象,记录具体如下:
ID
姓名
时间戳
创建日期
修改日期
是否有效
2
李四
5
2010-11-10 10:21:23.100
2010-11-13 13:38:33.540
0
5
方七
6
2010-11-13 15:38:33.540
2010-11-13 15:38:33.540
0
6
张飞
7
2010-11-13 15:40:33.540
2010-11-14 08:0033.540
0
这三条记录中,ID=2的记录是changed(改变)状态,其它两条处于new(新增)状态。虽然这三条记录都是这次导出的对象,但要加以区分,这样这三条记录要导入其它系统时,才可以区分开是添加,还是修改操作。
那么如何区分开这三条记录呢?
我们查找出最近一次导出日志,最近一次导出日志具体信息如下:
外部系统ID
表格名称
时间戳
操作日期
001
userInfo
4
2010-11-12 09:13:00.001
其中,时间戳为4,操作日期为2010-11-12 09:13:00.001,我们分别取出,并设置变量。
我们设置如下变量,Timestamp=4,OpeDate=” 2010-11-12 09:13:00.001”,CreDate(2)=” 2010-11-10 10:21:23.100”,UpdateDate(2)=” 2010-11-13 13:38:33.540”,IsEffect(2)=”0”(其中,CreDate(2)代表ID=2的用户信息,以此类推;UpdateDate(2)、IsEffect(2)等同)。
Timestamp变量的作用是通过比较获取增量数据;OpeDate、CreDate(i)(i>0的整数)、UpdateDate(i) (i>0的整数)这三个变量通过比较,判断该记录所状态(new(新增)、changed(改变));IsEffect(i) 判断该记录是否处于deleted(删除)状态。
如果isEffect(i)=”0”,且UpdateDate(i)>Credate(i),且Credate(i)>OpeDate,就是新增状态;否则修改状态。如果isEffect(i)=”1”说明是删除状态。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!