移动端与服务器端数据库同步

 最近在写一个移动工具类应用。需要支持离线功能,所以本地需要一份数据库的拷贝,这样就涉及到移动端和服务器端数据库的同步问题。

  在设计时我要满足以下几个需求:

  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 */

}

  移动端设计:


public abstract class ClientBaseModel {

public long userId; <span style="font-family: Arial, Helvetica, sans-serif;">/* Global unique user id */</span>

public long id; /* Model id. Unique for user */

public long lastmodified; /* Last modified server time stamp */

public boolean deleted; /* delete flag */

public boolean dirty; /* Local dirty flag */

}

  分析:

  首先是如何选择表的主键id

  1. 使用auto increment主键?不行!根据前面支持离线的需求,id应该在移动端就已经生成。如果使用auto increment在同一个用户帐号的情况下只可以做到单个移动端的唯一性,无法保证多个移动端的唯一性,更加不能保证服务器端全局的唯一性。

  2. 使用UUID作为主键?可行!每一条数据在移动端创建时即为之生成UUID。这样基本可以保证服务器端全局的唯一性。对于使用UUID作为主键好不好的讨论很多,大家可以另行参考。

  3. 我的方案。使用userId和一个用户唯一的model id作为联合主键。model id需要保证在同一userId下唯一,这样再加上userId使得数据全局唯一。问题是如何选择model id?一个比较可行但是不能保证完全没有重复的是时间戳。

  4. 还有其他更好的主键方案吗?

  接下来是如何判断服务器端数据已经更新

  每一条数据存储一个last modified时间戳。这个时间戳是服务器端的时间。同一条数据如果移动端的lastmodified小于服务器端的lastmodified就可以判断数据已经更新。

  移动端数据更新

  移动端数据库增加一个dirty标志,dirty标志表示本地新增或者修改的数据,这些数据会在下一次同步时上传至服务器。

  如何处理数据删除

  根据前面last modified和dirty字段的设计,整个数据模型是一个增量式的。数据只允许新增和更新,所以这里增加一个deleted标志表示数据是否已经被删除。

  以上介绍完我的移动端和服务器端数据库同步的数据模型设计,接下来讲讲详细同步算法。

  不过。。。等等。。。公司年会的节奏,等有时间继续写。

  同步算法:

  1. 服务器端向移动端同步

  2. 移动端向服务器端同步

  android帐号验证框架

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2017-07-03

移动端与服务器端数据库同步的相关文章

数据库 同步-移动端与服务器端数据库的同步

问题描述 移动端与服务器端数据库的同步 最近做项目遇到个问题,手机客户端有个本地数据资源,可以离线的时候查询资源.当服务器中的相应数据发生变化时,手机端是如何与其获得数据同步的,就是将那些变化了的数据更新到手机上,还有那些服务器中删除的数据,在手机上该如何处理呢?大蛇们 解决方案 我相信这问题应该算是很常见的吧,有大神会么,帮忙解答下,谢谢~ 解决方案二: 没人回答么??好桑心啊 解决方案三: 想要知道服务器端的数据发生变化没有,首先后台要给你做一个接口,数据请求不要太大,用于判断服务器端数据是

sqlserver 2000数据库同步 同步两个SQLServer数据库的内容

复制前要做好的准备工作: 1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户 我的电脑 控制面板 管理工具 计算机管理 用户和组 右键用户 新建用户 建立一个隶属于administrator组的登陆windows的用户 2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作: 我的电脑 D:\ 新建一个目录,名为: PUB 右键这个新建的目录 属性 共享 选择"共享该文件夹" 通过"权限"

SQLServer数据库同步准实时方案

server|sqlserver|数据|数据库 1. 需求    1)如何将在线运营的SQLServer数据库数据及时同步到另外一个SQLServer数据库.    2)数据仓库系统的数据抽取会对源系统造成巨大压力,严重影响性能和响应速度.如何将生产数据快速抽取到历史数据仓库,改善业务系统的性能.    3)分布式数据库,如何将分部的数据库数据复制到总部数据库,以利于总部汇总统计.这些业务应用中常见的SQLServer数据库同步需求,都需专业的复制系统来完成. 2. 同步方案   浪擎·镜像系统

您是怎么看待服务器端数据库和android应用本地sqlite数据库

问题描述 您是怎么看待服务器端数据库和android应用本地sqlite数据库 一个线上的应用(比如说网易新闻)肯定是要跟服务器打交道的,但是当用户处于网络离线情况下,还能继续观看新闻(就是所谓的离线新闻),那么这些新闻数据肯定要保存在本地数据库(也有人说用json保存到文件里),那现在就有这样一个事情了.是不是有网就去服务器取数据,然后将取到的数据保存到本地的数据库(含数据更新),有些设置得更人性化的应用,还分是否2G/3G/wifi状态下读取服务器的数据. 服务器端数据库和本地数据库频繁的切

《OSPF和IS-IS详解》一6.1 OSPF数据库同步

6.1 OSPF数据库同步 OSPF和IS-IS详解 读至本章,读者想必知道,OSPF协议是一种结构性很强的路由协议.既然读者都清楚OSPF数据库同步的可靠性和精确性是如此重要,那么也就不会对用来管理OSPF数据库同步过程的状态机(名为邻居状态机)的复杂程度感到惊讶了.简而言之,在数据库同步过程中,邻居状态机会驱动(OSPF路由器)采取以下"行动". 1.当相邻的两台路由器决定彼此建立邻接关系时,会进行分工:一台起"主导"作用,另外一台会进行"配合&quo

《OSPF和IS-IS详解》一第6章 链路状态数据库同步6.1 OSPF数据库同步

第6章 链路状态数据库同步 OSPF和IS-IS详解 有一句话作者此前曾反复提及,现在再说一遍:链路状态路由协议的"精髓"在于,隶属同一区域的每台路由器都会根据存储在一个公共拓扑数据库里的信息,执行本机路由计算.因此,在同一区域内,每台路由器所存储的拓扑数据库的内容必须完全一样.路由器之间相互同步链路状态数据库的目的正是为此.在OSPF或IS-IS网络中,路由器只要上线运行,就必须与邻居路由器进行数据库同步,以确保各自所持数据库的内容完全相同.若路由器刚接入点到点链路,便会与链路对端的

SQLServer 2000 数据库同步详细步骤[两台服务器]_MsSql

为什么要同步SQL Server 2000 数据库,它都用在什么场合 SQL Server 2000 数据库同步配置的原理 从0开始一步一步配置SQL Server 2000 数据库同步,非常细 已经非常熟练,可以看精品版SQL Server 2000 数据库同步配置 配置SQL Server 2000 数据库同步时的 常见问题 为什么要同步SQL Server 2000 数据库,它都用在什么场合 数据实时备份同步,数据库服务器出问题时我们也有其正常工作时的备份 数据实时备份同步,一台服务器负载

《OSPF和IS-IS详解》一第6章 链路状态数据库同步

第6章 链路状态数据库同步 OSPF和IS-IS详解有一句话作者此前曾反复提及,现在再说一遍:链路状态路由协议的"精髓"在于,隶属同一区域的每台路由器都会根据存储在一个公共拓扑数据库里的信息,执行本机路由计算.因此,在同一区域内,每台路由器所存储的拓扑数据库的内容必须完全一样.路由器之间相互同步链路状态数据库的目的正是为此.在OSPF或IS-IS网络中,路由器只要上线运行,就必须与邻居路由器进行数据库同步,以确保各自所持数据库的内容完全相同.若路由器刚接入点到点链路,便会与链路对端的邻

sqlserver 2000数据库同步 同步两个SQLServer数据库的内容_MsSql

复制前要做好的准备工作: 1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户 我的电脑 控制面板 管理工具 计算机管理 用户和组 右键用户 新建用户 建立一个隶属于administrator组的登陆windows的用户 2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作: 我的电脑 D:\ 新建一个目录,名为: PUB 右键这个新建的目录 属性 共享 选择"共享该文件夹" 通过"权限"