不同系统之间往往需要进行数据同步,保持数据的一致性。
比如每天需要从HR主数据中同步人员数据到其他的业务系统系统
对于这种不同数据库之间的数据同步,无非就是要解决远程数据变化的三种形式:insert、update、delete。
1、当远程数据insert的时候,新增数据插入为本地数据。
2、当远程数据update的时候,如果更新的数据为需要的字段,更新本地数据,否则不处理
3、当远程数据delete的时候,在本地数据执行物理删除或者逻辑删除。
解决第一种情况需要一个唯一字段:比如下表中的ID,ID全局唯一,当远程数据产生新的ID可判断为insert,
解决第二种情况需要一个唯一字段+一个增长字段:比如下表中的UpdateTime,该字段根据时间增长,通过比较两天的数据ID,ID重复的为update
解决第三种情况需要在第二种情况的基础上加上一个删除标志位,当满足第二种情况且删除标准位为Y,则为delete
总结一下要实现两个数据库之间的数据同步需要满足以上描述的三种条件:
唯一字段、增长字段、删除标志位
ID |
Data1 |
Data2 |
UpdateTime |
Isdelete |
1 |
新增数据1 |
A |
2013-10-20 |
N |
2 |
新增数据2 |
B |
2013-10-20 |
N |
3 |
新增数据3 |
C |
2013-10-20 |
N |
ID |
Data1 |
Data2 |
UpdateTime |
Isdelete |
2 |
更新数据2 |
A |
2013-10-21 |
N |
3 |
删除数据3 |
B |
2013-10-21 |
Y |
4 |
新增数据4 |
C |
2013-10-21 |
N |
假设另外一种情况、以上的条件只有一个唯一的ID,比如下面的表格,没有增长字段、没有删除标志位。
如何去同步两边的数据?
ID |
Data1 |
Data2 |
1 |
新增数据1 |
A |
2 |
新增数据2 |
B |
3 |
新增数据3 |
C |
ID |
Data1 |
Data2 |
2 |
更新数据2 |
A |
3 |
删除数据3 |
C |
4 |
新增数据4 |
B |
解决的方法是:第一次同步数据之后,生成一张表A,包含两个字段,第一个字段是ID,第二个字段是除了ID之外的其他所有字段拼接起来的Hash字段;
第二次同步的时候将源表做同样的处理生成B表,关联A表和B表,
比较ID相同,Hash字段不相等的,为更新的数据;
ID在A表存在、B表不存在,为删除的数据;
ID在B表存在、A表不存在,为新增的数据