【问题标题】:What is the most efficient way to sync clients with server database将客户端与服务器数据库同步的最有效方法是什么
【发布时间】:2014-09-30 19:35:20
【问题描述】:

我将开发一个可以在线和离线工作的移动应用程序。

客户

  1. 客户端只能看到数据。他们无法更改服务器数据库或其数据库中的任何内容。
  2. 每个客户端都有自己的数据库,就像服务器数据库的副本。因为应用程序也必须离线工作。如果互联网可用,该应用会尝试自行更新。

服务器

  1. 管理员可以通过管理员客户端更改数据库。只有一个数据库为所有在线的客户提供服务。

我的问题是如何做到这一点。实现它的最有效方法是什么?当管理员更改服务器数据库并且客户端想要更新时,服务器应该如何提供介于客户端修订和服务器最后修订之间的数据。例如:

服务器

  • 修订版 1
  • 修订版 2
  • 修订版 3
  • 修订版 4

客户 A

  • 修订版 1
  • 修订版 2

客户 B

  • 修订版 1

当客户端 A 想要更新时,它应该得到修订版 3-4,当客户端 B 想要更新时,它应该得到修订版 2-3-4。

提前致谢。

【问题讨论】:

    标签: java android mysql ios database


    【解决方案1】:

    您可以在数据库中创建修订表(增量 ID)。一旦客户端上线,在启动时,您的应用程序会检查来自服务器的最大 ID 并将其与客户端的修订 ID 进行比较。如果服务器的最大 ID 大于客户端的,它会根据您服务器上的修订表更新系统(您可以将修订更新的过程名称插入其他列,以便您可以在检查过程中选择过程名称,然后运行这些过程更新,或其他列可能包含说明)

    客户端的版本不应大于服务器的。如果是这样,您应该降级客户的修订版。

    如果表中缺少修订,这不是问题,您的修订更新程序将不会针对该版本运行。 如果您使用的是 sql 存储过程,您的客户端更新将是这样的:(客户端版本是 R2,服务器版本是 R6,R5 被管理员删除)

    exec sp_revision_update R3
    exec sp_revision_update R4
    exec sp_revision_update R6
    

    在此示例中,R5 已从服务器中删除,并且 R6必须包含对先前版本的修复,因为某些客户端可能在 R5 被删除之前已拥有它。

    【讨论】:

      【解决方案2】:

      您可以尝试使用“ID”进行检查,这样您就可以从客户端接收最大 ID,然后服务器检查客户端是否需要更新,例如在您的服务器中,您的最大值。 ID 为 4,最大值为 4。 ID客户端是2(客户端A)你从3更新到最后一个ID,否则做任何事情。

      【讨论】:

      • 如果管理员不删除任何内容,您的解决方案将有效。比如server有r1、r2、r3、r4,client已经更新,和server一样。但是当管理员删除 r3 时,客户端将永远不会得到 r3 差异!因为您将提供最大 id。
      猜你喜欢
      • 2010-11-04
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多