最近在写一个移动工具类应用。需要支持离线功能,所以本地需要一份数据库的拷贝,这样就涉及到移动端和服务器端数据库的同步问题。
在设计时我要满足以下几个需求:
1. 同步时双向传输数据最小化。双向即,服务器端更新同步到移动端,和移动端更新同步到服务器。每次只传输两端差异数据。
2. 支持离线。支持离线本身是一种好的用户体验,而它带来的一个其他的好处是每次移动端数据库查询仅需查询本地数据库,这样就避免了过多的服务器端查询。本地数据库减少了很多服务器的压力,当然也给用户省了流量。数据库更新操作也是如此,仅更新本地数据库,然后在适当的时机与服务器端进行同步。更进一步的说,移动端查询和更新数据只跟本地数据库打交道。
3. 冲突解决。如果一个用户帐号在多个移动端进行离线使用,势必会产生数据冲突。
设计的关键在于数据模型的设计,和同步算法。以下是我的想法。
下面是对象类代码,对应数据库的表字段。
服务器端设计:
public abstract class ServerBaseModel {
public long userId; /* Global unique user id */
public long id; /* Model id. Unique for user */
public long lastmodified; /* Last modified server time stamp */
public boolean deleted; /* delete flag *