抽取增量数据算法说明

以下例子以sql server数据库系统为准。

为了实现对数据库能够实现增量导出,要求被导出的表格建立时间戳、创建日期、修改日期、是否有效四个字段(其中,创建日期和修改日期要精确到毫秒)。

当表格进行insert操作时,其中时间戳会自动更新,创建日期和修改日期初始化为当前服务器时间,是否有效初始化为0。这时,创建日期和修改日期是相等的。当一笔记录固化到数据库中后,创建日期要保持不变。当执行update操作时,时间戳自动更新,创建日期保持不变,修改日期更新为当前服务器日期,这时创建日期和修改日期是不相等的,且修改日期是大于创建日期。当执行delete操作时,时间戳自动更新,创建日期和修改日期不变,是否有效改变为1

在每个表格的记录中,每条记录可分为如下三种状态:new(新增)changed(改变)deleted(删除)。我们可通过创建日期、修改日期、是否有效这三个字段的比较,来判断一条记录处于何种状态。

数据导出分为全量导出和增量导出,全量导出是对一张表、多张表,甚至整个数据库的拷贝;而增量导出只针对后期添加、更新及删除的数据的导出。

接下来以实例来说明增量导出的思路。

当利用数据交换系统进行导数据时,须先注册外部系统信息,每个外部系统分配一个唯一的ID,这个ID被确定后,是不能被修改的。

在这里假设已经注册了一个ID001的外部系统。

假设一张人员信息表(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=4OpeDate=” 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变量的作用是通过比较获取增量数据;OpeDateCreDate(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”说明是删除状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值