内部简单的数据同步

时间:2010-01-13 11:26:59

标签: sql synchronization sync

我知道帖子很长但它也包含我问题的建议解决方案。因此,问题本身不是那么久......不要害怕。 :)

请帮我解决以下问题:

我将有一个SQL服务器,我将存储数据集。我还将有一堆PC客户端(都有自己的本地SQL服务器)需要与服务器同步。 PC将被唯一识别。

示例:

假设我有2台PC客户端,PC1和PC2。

在服务器上,我有以下数据集:

DS1 DS2

在客户端PC上,我没有任何东西可以开始。当PC1连接到服务器以查看“有什么新内容”时,它会注意到需要检索两个数据集,因此它将使用DS1和DS2更新其本地数据库。 PC2也会发生同样的情况。现在,让我们说PC2在本地修改DS2。当PC2连接到服务器时,它将更新服务器上的DS2,并对其本地DS2进行更改。最后,当PC1再次连接以查看是否有任何更改时,它会注意到DS2已更改,它将检索它并使用服务器中的DS2覆盖其本地DS2。

不要担心并发问题,因为并非所有PC都可以更改任何数据集。只有某个数据集的所有者才能更改它(所有者被定义为单个PC。)

我想到了一些解决方案,但它们看起来效率不高;也许别人会有一些想法。

第一个解决方案:

在服务器上,我将创建一个名为“SyncTable”的表,我将在其中写入对数据集的任何更改。

示例:

假设PC1需要检索DS1,PC2需要检索DS4和DS5。

同步表将包含:

PC1 DS1
PC2 DS4
PC2 DS5

因此,当PC2连接到服务器时,它会查看此表,注意它需要下载DS4和DS5,继续执行此操作然后从服务器表中删除它的两个条目。因此,在PC2同步后,服务器表将只包含“PC1 DS1”。下次,当PC2连接时,注意到它没有条目,因此知道它是“最新的”。当PC1连接时,会发生完全相同的事情:它会注意到它需要下载DS1,下载然后删除条目。

问题在于,如果有10 000台个人电脑,并且可能修改了5000个数据集,那么我在此表中会有很多条目。

第二种解决方案是存储与每个数据集关联的修改时间戳。这样做的问题是客户端PC必须遍历所有本地记录,并将本地时间戳与服务器上的最后一个时间戳进行比较,以查看是否有任何更改。不确定给出大量记录的效率如何。看来如果他们直接知道在哪里寻找变化而不是每次都记录所有记录会更好......

因此,您对此有何建议?

使用的技术:客户端PC上的MS SQL Server Compact Edition 3.5和服务器上的MySQL。通信将通过Web服务完成。因此,合并复制/远程数据访问已经完成。

谢谢!

1 个答案:

答案 0 :(得分:0)

您正在考虑两个选项

  1. 在修改时生成所需更新的列表,客户端询问“我的更新列表中有什么”?
  2. 保留时间戳,以便客户可以询问“我最近的DSx时间是......,我是否需要更新?”
  3. 我认为选项2是可取的。我认为它对问题更具弹性,从客户端崩溃中恢复等等。这是因为每个参与者只保留它所知道的内容:数据的日期。服务器不需要“理解”谁采取了什么。

    我认为您可以优化上传内容的确定。您说话就好像客户端需要遍历其所有数据集,一次检索一个时间戳,并做出检索决定。相反,您可以进行Web服务调用:

    I have DS1=<time>, DS2=<time> ...; which do I need to download?
    

    服务器根据客户端发送的数据做出实际决策,而不是客户端提取数据以允许它自己做出决定。

    顺便说一句,我应该指出,有商品而不是处理这一切。你真的需要编码吗?