浅谈企业内部系统之间的数据交换模式

最近刚好赶上公司的ERP升级至R12,导致原来旧的ERP周边系统大量的被修改。其中改动最大的部分就是数据交换部分。结合我们目前遇到的状况,我在这里简单的说一下我对企业内部系统之间的数据交换模式的看法。

请注意以下前提条件:

1、我们使用的Oracle数据库

2、我以周边系统同ERP系统的纯数据库之间的数据交换为基础,不涉及其他方式的数据交换,如XML等。

 

我认为数据交换应该分为以下两种方式:

1、两个数据库之间共用接口表

2、两个数据库分别提供供对方使用的接口表

 

先放第一种方式:两个数据库之间共用接口表

这种方式有一个好处就是不需要建很多表,我建议建一个单独的DB,称之为EDI DB。如果两个数据库需要进行数据交换,则针对相关表,在EDI DB上建相应的表。这个表至少应该有以下字段:

Last_Update,Process_flag,Process_date以及组成唯一键的字段组

例如

当有新数据时,插入数据,Process_flag = 1;

当更新数据时,更新相应的数据,Process_flag = 1;

这时需要抓取数据的一方可以根据Process_flag来进行数据复制,成功取到数据后,更新Process_flag,例如压为3,不成功不做任何处理。(有的人不成功会压一个值,但我个人认为不妥,下面有解释)

这样只要不出现例外,数据就抓到了目标数据库中。

以上是单向数据交换。如果双方数据库针对同样的数据需要进行双向交换,则需要再添加一个Process_flag。如ERP_Process_flag。抓取原理同上。

这样的模式看起来比较不错,双方数据库只需要建立到EDI DB之间的DB LINK就行了。但这种方式有两个个缺点。

1、当很多待抓取数据的数据库需要去目标数据库中抓取时,接口表就需要建立很多Process_flag和Process_date,最后让人眼花缭乱。

2、当很多待抓取数据的数据库同时去目标数据库中抓取时,会经常出现死锁现象。

那如何解决这个问题呢?

我向大家推荐另一种方法:两个数据库分别提供供对方使用的接口表

此方法需要建立比上述方法多一倍的表。

首先每个数据库都建立一个叫做EDI Object的用户,一但某个表的数据需要被复制到到另一个数据库,则就在EDI Object上建立一个相应的表,这个表应至少包括以下字段:

ID

这个ID是通过Sequence产生的

当原始表有新数据时,插入新的数据,ID也是新的

当原始表更新数据时,保留原始数据,同时再插入新的数据,ID也是新的。

说白了就是原始表的所有更新,都将历史数据保存在这个接口表中,用ID来区分数据更新的先后顺序

这个时候待抓取数据的数据库直接访问EDI Object这个用户名下的接口表,将里面的全部数据抓取走,并且在本地记录本次抓取的最后一个ID的值,以及抓取不成功的ID的值(是个列表)。而下次抓取时,就从本次记录的下一个ID开始抓取,但要包括上次没有抓取成功的ID。

这里需要注意一點点:

如果抓取失败,则与此笔数据具有相同的业务唯一的后续数据全部跳过,直到这笔数据被成功抓取。

对于失败数据的处理,应该建立一个记录表,记录每一笔失败的数据,但只记录相同业务逻辑唯一值的最后一笔出错数据。

这种方法可以很好的解决多个数据库同时去一个接口表中抓取数据而产生死锁的问题

对于第二种方法,错误数据会在下次执行程序时再次抓取。而在第一种方法中,如果失败了为Process_flag压一个值,则再次抓取时不能自动抓取上次错误的数据。

另外补充:第二种方法在最终的数据库中始终保留的是最后更新的数据,而非全部历史数据。

 

不知道各位还有没有更好的方法,欢迎指点~~

 

posted @ 2010-07-23 19:03  智会超  阅读(1908)  评论(0编辑  收藏  举报