Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 内部简单数据同步_Sql_Synchronization_Sync - Fatal编程技术网

Sql 内部简单数据同步

Sql 内部简单数据同步,sql,synchronization,sync,Sql,Synchronization,Sync,我知道这篇文章很长,但也包含了解决我问题的建议。因此,问题本身并没有那么长。。。不要害怕 请帮助我处理以下场景: 我将有一个SQL server,我将在其中存储数据集。我还将拥有一组需要与服务器同步的PC客户端(所有客户端都有自己的本地SQL server)。PC将被唯一标识 例如: 假设我有两个PC客户端,PC1和PC2 在服务器上,我有以下数据集: DS1 DS2 在客户端PC上,我不会有任何开始。当PC1连接到服务器以查看“是否有新内容”时,它会注意到需要检索两个数据集,以便使用DS1和D

我知道这篇文章很长,但也包含了解决我问题的建议。因此,问题本身并没有那么长。。。不要害怕

请帮助我处理以下场景:

我将有一个SQL server,我将在其中存储数据集。我还将拥有一组需要与服务器同步的PC客户端(所有客户端都有自己的本地SQL server)。PC将被唯一标识

例如:

假设我有两个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,下载它,然后删除条目

问题是,如果有10000台电脑,可能修改了5000个数据集,我会在这个表中有很多条目

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

因此,您对此有何建议

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


谢谢

您正在考虑两种选择

  • 在修改时生成所需更新的列表,客户端会询问“我的更新列表中有什么内容”
  • 保留时间戳,以便客户可以询问“我的DSx最新时间是…,我需要更新吗?”
  • 我认为方案2更可取。我认为它对问题、从客户端崩溃中恢复等更具弹性。这是因为每个参与者只保留自己知道的信息:数据的日期。服务器不需要“理解”谁拿走了什么

    我认为您可以优化上传内容的决定。您说的好像客户机需要遍历它的所有数据集,每次检索一个时间戳,并决定检索。您可以使用web服务调用:

    I have DS1=<time>, DS2=<time> ...; which do I need to download?
    
    我有DS1=,DS2=。。。;我需要下载哪一个?
    
    实际决策是由服务器根据客户端发送的数据做出的,而不是客户端获取数据以允许其自己做出决策


    顺便说一句,我应该指出,还有一些商业产品可以处理这一切。你真的需要编码吗?

    嗨,Djna!谢谢你的回答。关于解决方案2,您确实有一个有趣的建议。但是,如果我有大量的数据集,恐怕我必须向服务器发送大量的时间戳,以便服务器能够决定返回什么。例如,如果我有10000个数据集,我必须发送10000个时间戳。我想我应该能够用16个字节来表示时间戳,对于一个数据集ID,再加上4个字节。因此,我猜10000个数据集的数据本身应该是200k。这个数据集可能会增长到15万个,但是如果你有1万个过时的数据集,那么数据量将是荒谬的,更不用说时间戳了。如果与整体可用数据相比,设定的过期日期可能比较少,则使用一些更巧妙的方案。例如,按层次组织数据并按层次更新数据。“我已经在1月14日1日14:15更新了data/abc下的项目”之后有什么变化吗?谢谢你关于层次结构的建议。听起来真是个好主意!