一种简单的异构数据库同步方法
最近正在着手的一个项目,由于有不联网时也能使用的需求,采用网络中心数据库和本地数据库部分同步的方式。因此有以下技术需求:
1.网络数据同步到本地;
2.本地数据同步到网络;
一、网络数据同步到本地。网络数据表和本地对应表中都增加updatetime字段,当更改记录内容时,同时更新此字段,则本地数据库可以通过比较updatetime字段,只更新比本地updatetime新的记录。新增或修改的记录可以检索到,没有问题,但是删除的记录怎么做到本地也同步删除呢?采用遍历的方法固然能实现,但在量比较大时,太费时费力了。想到一个方法就是增加deleted字段,在服务器上删除记录时,不直接删除记录,而是只设置此标志为真(同时更新updatetime),这样本地数据库就可以检索到哪些记录是要删除掉的了,直接删除本地对应的记录。而服务器上的标记为deleted的记录,则可以本地更新后(由服务器主动通知本地更新或本地定时更新)删除这些记录即可,或者删除掉deleted标志为真并且updatetime在多久之前的记录即可。
二、本地数据同步的网络。联网时,直接同步操作的网络数据库即可。不联网时,本地增删改的记录如何同步呢?和上面的方法类似,同样增加一个updatetime2应能解决。在我的项目中,由于本地可通过api的方式获取当前是否联网,所以可以将未同步的记录,都做一个uploaded为假的标记。在联网时upload这些记录即可。但要注意服务器在本地断网时,也有了修改,网络修改和本地修改的时间有先有后,如何解决冲突呢?可以根据自己项目的具体需求确定以本地或网络或以最新的修改为准等。在我这个项目中,需求是以本地为准,因此直接根据uploaded标记上传即可(某些表需要依由旧到新的顺序依次更新,这样才能使本地的状态和网络数据库一致)。