同步客户端-服务器数据库

2024-04-21

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

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

用户将能够在电话应用程序和网络应用程序上添加和编辑信息。我需要确保即使手机无法立即与服务器通信,在一处所做的更改也能反映到各处。

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

我知道客户端-服务器数据同步问题已经存在很长时间了,并且想要有关处理该问题的模式的信息 - 文章、书籍、建议等。我想了解处理同步的一般策略,以比较优点、缺点和权衡。


您必须决定的第一件事是关于在发生冲突的变化时哪一方被视为“权威”的一般政策。

即:假设记录 #125 于 1 月 5 日晚上 10 点在服务器上更改,并且同一记录于 1 月 5 日晚上 11 点在其中一部电话(我们称之为客户端 A)上更改。 上次同步是在 1 月 3 日。然后用户会在 1 月 8 日重新连接。

确定需要更改的内容是“容易”的,因为客户端和服务器都知道上次同步的日期,所以任何事情创建或更新(有关更多信息,请参阅下文),因为需要协调最后一次同步。

因此,假设唯一更改的记录是#125。 您要么决定两个版本中的一个自动“胜出”并覆盖另一个,要么您需要支持协调阶段,用户可以在其中决定哪个版本(服务器或客户端)是正确的版本,从而覆盖另一个。

这个决定非常重要,您必须权衡客户的“角色”。特别是如果不仅在客户端和服务器之间存在潜在冲突,而且不同的客户端可以更改相同的记录。

[假设 #125 可以由第二个客户端(客户端 B)修改,尚未同步的客户端 B 有可能提供同一记录的另一个版本,从而使之前的冲突解决方案变得毫无意义]

关于“创建或更新“上面的一点...如果记录源自其中一个客户端,您如何正确识别该记录(假设这在您的问题域中有意义)? 假设您的应用程序管理业务联系人列表。如果客户端 A 说您必须添加一个新创建的 John Smith,并且服务器上有一个客户端 D 昨天创建的 John Smith...您是否会创建两条记录,因为您无法确定它们不是不同的人?您是否也会要求用户解决此冲突?

客户是否拥有数据子集的“所有权”? IE。如果客户 B 被设置为区域 #5 数据的“权威”,客户 A 是否可以修改/创建区域 #5 的记录? (这将使一些冲突的解决变得更容易,但对于您的情况可能不可行)。

总结起来主要问题是:

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

参考书目:

  • 当然,更多关于这个维基百科 http://en.wikipedia.org/wiki/Data_synchronization.

  • 一个简单的同步算法 https://unterwaditzer.net/2016/sync-algorithm.html作者:虚拟目录同步器 https://vdirsyncer.readthedocs.org/en/stable/index.html

  • 关于数据同步的 OBJC 文章 http://www.objc.io/issue-10/data-synchronization.html

  • SyncML®:同步和管理您的移动数据 http://my.safaribooksonline.com/0130093696(在 O'Reilly Safari 上预订)

  • 无冲突的复制数据类型 http://hal.inria.fr/docs/00/61/73/41/PDF/RR-7687.pdf

  • 乐观复制 http://pagesperso-systeme.lip6.fr/Marc.Shapiro/papers/Optimistic_Replication_Computing_Surveys_2005-03_cameraready.pdfYasushi Saito(惠普实验室)和 MARC SHAPIRO(微软研究院)-ACM 计算调查,卷。 V,第 N,3 期,2005 年。

  • 亚历山大·特劳德、于尔根·纳格勒-伊莱因、弗兰克·卡尔格尔和迈克尔·韦伯。 2008。通过重用 SyncML 实现循环数据同步。第九届国际移动数据管理会议 (MDM '08) 的会议记录。 IEEE 计算机协会,美国华盛顿特区,165-172。 DOI=10.1109/MDM.2008.10http://dx.doi.org/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 日至 9 日)。 CIKM '02。 ACM,纽约,纽约,153-160。数字编号=http://doi.acm.org/10.1145/584792.584820 http://doi.acm.org/10.1145/584792.584820

  • Cunha, P. R. 和 Maibaum, T. S. 1981。《资源》抽象数据类型+同步-面向消息编程的方法-。第五届国际软件工程会议论文集(美国加利福尼亚州圣地亚哥,1981 年 3 月 9 日至 12 日)。国际软件工程会议。 IEEE 出版社,新泽西州皮斯卡塔韦,263-272。

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

来自Dr.Dobbs http://www.ddj.com site:

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

来自 arxiv.org:

  • 无冲突的复制 JSON 数据类型 http://arxiv.org/abs/1608.03960- 论文描述了 JSON CRDT 实现(无冲突复制数据类型 - CRDT - 是支持并发修改并保证此类并发更新收敛的数据结构系列)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同步客户端-服务器数据库 的相关文章

  • 是否可以将继承应用于 Singleton 类?

    今天面试时遇到一个问题 是否可以在单例类上应用继承概念 我说过 由于构造函数是私有的 因此我们无法扩展该 Singleton 类 他问我的下一件事是在该 Singleton 类上应用继承 因此 我将单例的构造函数设置为受保护的 认为孩子的构
  • Oracle:在更新具有多列的表的一个字段时复制行

    有没有一种方法可以一般复制一行 特别是在不指定所有列的情况下 在我的情况下 我有一个大表 我想在其中复制除 ID 和另一列之外的所有列 事实上 数据是在年初复制的 该表有 50 多列 因此如果我不必指定所有列 则更改架构会更加灵活和稳健 这
  • 寻找一种重构 D3.js 风格的方法链接模式的方法

    在学习 D3 js 时 我遇到了博客文章 http bost ocks org mike chart 解释其可重用代码单元背后的主要设计模式 我复制了下面的相关代码 下面呈现的模式的方式正是在 D3 代码库和插件中使用的方式 example
  • 对于 Web 应用程序结构的最佳实践,您有哪些建议? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我在工作中做了很多定制应用程序 我正在尝试为新应用程序定义一些标准 有点像元素 CSS 你如何组织样式表 我是否应该为整个网站提供一个基本样式表
  • 在没有条件的情况下,如何使查询不返回任何内容?

    相当简单 我有一对多 多对一关系 我想查询它 但是 当未提供任何 WHERE 子句信息时 我不希望返回任何结果 简单来说 如何使查询变得非贪婪 您可以添加一个始终为 false 的 where 子句 并附加您想要用 OR 提供的条件 sel
  • GUID 是否及时订购?如果 ORDER BY 与 GUID 变量类型一起使用,最近创建的记录会晚吗?

    GUID 是否及时订购 我的意思是 如果您将 ORDER BY 与 GUID 变量类型一起使用 最近创建的记录会晚吗 在 Windows 上 GUID UUID 是使用 UuidCreate 从加密随机数生成器创建的 根据 RFC 4122
  • 在任何 PostgreSQL 语句(甚至不返回结果的语句)上调用 row_to_json(row)

    我正在寻找始终从 PostgreSQL 语句返回 JSON 表示的查询 即使没有returning 这是一个例子 WITH result AS insert into users name age values drew 42 select
  • 查询 ssisdb 以查找包的名称

    我正在查询 ssis 目录以找出目录中所有包的名称 Folder1项目中只有6个包 但查询却给出了9条记录 1 SELECT P NAME FROM SSISDB internal projects PRJ INNER JOIN SSISD
  • C# 数据库包装设计

    我正在为 C 设计一个数据库包装器 以下是我有两个选择 选项A class DBWrapper IDisposable private SqlConnection sqlConn public DBWrapper sqlConn new S
  • 一种父子关系级联软删除的方法

    我有一个简单的架构 其中使用软删除 这就是它的设计方式并且无法更改 有两个表参与该架构 Company id is deleted and Employee id company id is deleted where company id
  • 如何选择按范围分组的值的计数

    斯塔克万岁 我需要选择按范围分组的值的计数 举例来说 假设我在表列中有以下值 1 2 4 5 6 8 9 11 13 16 然后 我想检索 5 范围内它们的计数 如下所示 From 0 to 4 there is 3 values 1 2
  • 计算日期之间的差异 - Postgres

    我需要计算 3 个不同日期的天数 我需要运行逻辑以从下面的伪逻辑获取整数值 future date 1 future date 2 今天 如何在 PostgreSQL 中实现这一点 为了实现日期相差天数 SELECT DATE PART d
  • 根据另一个表中的值查找总计数

    在Mysql中 我的表中有具有重复值的城市 表城市 Name New York USA New York USA Chicago USA Chicago USA Chicago USA Paris France Nice France Mi
  • Postgres 检查文本数组中的约束以确保值的有效性

    我想创建类似的东西 CHECK ALL scopes IN read write delete update scopes这是表中的一个字段text 我想确保该数组中的所有值都是上面的值之一 对此有何意见 是否有可能通过以下方式获取这些值S
  • Case 表达式在 SQL 查询中无法正常工作

    我想连接列supplier使用逗号分隔符创建表并将其放入名为 contact 的别名字段中 我使用过检查空值的案例 假设如果contact number2则为空contact number3将在别名字段中 反之亦然 这是我的查询 SELEC
  • 删除多对多关系中的相关行

    我正在删除位于多对多关系的一个站点上的表中的一行 我还想删除该关系另一端的任何相关行 例如 假设我有下表 我想从中删除一行Cars 我还想从中删除任何相关行Drivers当然 任何不再需要的行CarDrivers Table Cars Ca
  • 如何在 Presto 中删除重复数据

    我有一个 Presto 表 假设它有 id name update time 列和数据 1 Amy 2018 08 01 1 Amy 2018 08 02 1 Amyyyyyyy 2018 08 03 2 Bob 2018 08 01 现在
  • SQL Server 中的循环行

    我有一个包含 2 列的 SQL Server 表 Code 和 CodeDesc 我想使用 T SQL 循环遍历行并打印 CodeDesc 的每个字符 怎么做 如果您确实想循环遍历行 则需要光标 CURSOR http msdn micro
  • 实体框架..自引用表..获取深度=x的记录?

    我成功地在实体框架中使用自引用表 但我不知道如何获得所需深度的记录 这应该是什么逻辑 Model public class FamilyLabel public FamilyLabel this Children new Collectio
  • @Where 子句在 hibernate join 查询中不起作用

    我有 2 个带有 Where 注释的实体 第一个是类别 Where clause DELETED 0 public class Category extends AbstractEntity 且有如下关系 OneToMany fetch F

随机推荐