以下例子以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”说明是删除状态。