如何同步客户端服务器数据库?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (57)

我正在寻找一些通用策略,用于将中央服务器上的数据与不总是在线的客户端应用程序进行同步。

在我的特殊情况下,我有一个带有sqlite数据库的android手机应用程序和一个带有MySQL数据库的PHP web应用程序。

用户将能够在电话应用程序和Web应用程序上添加和编辑信息。即使手机无法立即与服务器通信,我也需要确保在一个地方进行的更改反映到处都是。

我不关心如何将数据从手机传输到服务器,反之亦然。我只提到我的特定技术,因为我不能使用例如MySQL可用的复制功能。

我知道客户端 - 服务器数据同步问题已经存在了很长很长的时间,并且想知道关于处理问题的模式的信息(文章,书籍,建议等)。我想知道处理同步的一般策略,以比较优势,劣势和折衷。

提问于
用户回答回答于

总结起来主要的问题是:

  • 考虑到分离客户端在创建新记录之前可能尚未访问服务器,如何定义“身份”。
  • 以前的情况,无论解决方案多么复杂,都可能导致数据重复,因此必须预见如何定期解决这些问题,以及如何通知客户他们认为“Record#675”实际上已合并/取代为记录#543
  • 决定冲突是否可以通过法令解决(例如,如果前者自上次同步后更新,则服务器版本总是胜过客户端)或通过手动干预
  • 法令的情况下,特别是如果您决定优先考虑客户,则还必须注意如何处理其他尚未同步的客户,这些客户可能会有更多更改。
  • 以前的项目没有考虑到数据的粒度(为了使描述更简单)。我只想说,而不是像在我的例子中那样在“记录”级别进行推理,相反,您可能会发现在现场级别记录更改更合适。或者一次处理一组记录(例如人员记录+地址记录+联系人记录),一次将其集合视为一种“元记录”。

参考书目:

  • 更多关于这个,当然,在维基百科上
  • Vdirsyncer的作者提供了一个简单的同步算法
  • 关于数据同步的OBJC文章
  • SyncML®:同步和管理移动数据(在O'Reilly Safari上预订)
  • 无冲突复制数据类型
  • 乐观的复制 YASUSHI SAITO(惠普实验室)和MARC SHAPIRO(微软研究有限公司) - ACM Computing Surveys,Vol。V,N号,2005年3月。
  • Alexander Traud,Juergen Nagler-Ihlein,Frank Kargl和Michael Weber。2008.通过重用SyncML进行循环数据同步。第九届国际移动数据管理会议论文集(MDM '08)。IEEE Computer Society,华盛顿特区,美国,​​165-172。DOI = 10.1109 / MDM.2008.10 http://dx.doi.org/10.1109/MDM.2008.10
  • Lam,F.,Lam,N。和Wong,R。2002.移动XML数据的高效同步。在第十一届信息和知识管理国际会议论文集(美国弗吉尼亚州麦克莱恩,2002年11月4日 - 09日)上。CIKM '02。ACM,纽约,NY,153-160。DOI = http://doi.acm.org/10.1145/584792.584820
  • Cunha,PR和Maibaum,TS 1981.资源和设备; 抽象数据类型+同步 - 面向消息编程的一种方法。在第五届软件工程国际会议论文集(美国加利福尼亚州圣地亚哥,1981年3月9日至12日)上。国际软件工程会议。IEEE Press,Piscataway,NJ,263-272。

(最后三个来自ACM数字图书馆,不知道你是否是会员,或者是否可以通过其他渠道获得)。

Dr.Dobbs网站:

  • Bill Wagner 2004年5月19日(设计台式机和移动PC应用程序的最佳实践 - Windows / .NET)使用SQL Server CE和SQL RDA创建应用程序

来自arxiv.org:

  • 无冲突的复制JSON数据类型 - 本文描述了JSON CRDT实现(无冲突复制数据类型 - CRDT - 是支持并发修改并保证此类并发更新收敛的一系列数据结构)。
用户回答回答于

我建议在每个表格中都有一个时间戳列,并且每次插入或更新时都要更新每个受影响行的时间戳记值。然后,遍历所有表,检查时间戳是否比目标数据库中的时间戳更新。如果它较新,则检查是否需要插入或更新。

观察1:由于从源数据库中删除行,因此要注意物理删除,并且必须在服务器数据库中执行相同的操作。可以解决这个问题,避免物理删除或记录具有时间戳的表中的每个删除操作。像这样:DeletedRows = (id, table_name, pk_column, pk_column_value, timestamp)因此,必须读取DeletedRows表的所有新行,并使用table_name,pk_column和pk_column_value在服务器上执行删除。

观察2:注意FK,因为将数据插入到与另一个表相关的表中可能会失败。数据同步之前,应该停用每个FK。

扫码关注云+社区

领取腾讯云代金券