Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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_Database_Design Patterns_Client Server_Data Synchronization - Fatal编程技术网

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

Sql 同步客户端服务器数据库,sql,database,design-patterns,client-server,data-synchronization,Sql,Database,Design Patterns,Client Server,Data Synchronization,我正在寻找一些通用策略,用于将中央服务器上的数据与不总是在线的客户端应用程序同步 在我的例子中,我有一个带有sqlite数据库的android手机应用程序和一个带有MySQL数据库的PHP web应用程序 用户将能够在电话应用程序和web应用程序上添加和编辑信息。我需要确保,即使手机无法立即与服务器通信,一个地方所做的更改也会反映在任何地方 我不关心如何将数据从手机传输到服务器,反之亦然。我之所以提到我的特殊技术,只是因为我不能使用MySQL的复制功能 我知道客户机-服务器数据同步问题已经存在很

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

在我的例子中,我有一个带有sqlite数据库的android手机应用程序和一个带有MySQL数据库的PHP web应用程序

用户将能够在电话应用程序和web应用程序上添加和编辑信息。我需要确保,即使手机无法立即与服务器通信,一个地方所做的更改也会反映在任何地方

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


我知道客户机-服务器数据同步问题已经存在很长很长时间了,我希望获得有关处理该问题的模式的信息(文章、书籍、建议等)。我想了解处理同步的一般策略,以比较优势、劣势和权衡。

您首先要确定的是一个一般策略,即在发生冲突的更改时,哪一方被视为“权威”

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

从客户机和服务器都知道上次同步的日期的意义上来说,确定需要更改的内容是“容易的”,因此自上次同步以来创建或更新的任何内容(有关详细信息,请参见下文)都需要进行协调

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

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

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

关于上面的“创建或更新”点。。。如果某个记录源于某个客户机,您如何正确识别该记录(假设这在您的问题域中是有意义的)? 假设你的应用程序管理一个商业联系人列表。如果客户端A说您必须添加一个新创建的John Smith,而服务器有一个昨天由客户端D创建的John Smith。。。你是否因为不能确定他们不是不同的人而创建了两个记录?您是否也会要求用户协调此冲突

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

总而言之,主要问题是:

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

  • 当然,更多关于这一点,关于

  • 作者

  • (关于奥莱利野生动物园的书)

  • 安史斋藤(惠普实验室)和马克·夏皮罗(微软研究有限公司)——ACM计算调查,第五卷,第N期,2005年3月

  • 亚历山大·特拉德、尤尔根·纳格勒·伊莱因、弗兰克·卡格尔和迈克尔·韦伯。2008通过重用SyncML实现循环数据同步。第九届移动数据管理国际会议记录(MDM'08)。IEEE计算机协会,华盛顿特区,美国,165-172。DOI=10.1109/MDM.2008.10

  • 林,F.,林,N.,和黄,R.2002。移动XML数据的高效同步。《第十一届信息和知识管理国际会议记录》(美国弗吉尼亚州麦克莱恩,2002年11月4日至9日)。CIKM'02。ACM,纽约,纽约,153-160。DOI=

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

(最后三个来自ACM数字图书馆,不知道您是否
const string path = "localrepository.db";

//Create our azure mobile app client
this.MobileService = new MobileServiceClient("the api address as setup on Mobile app services in azure");

//setup our local sqlite store and initialize a table
var repository = new MobileServiceSQLiteStore(path);

// initialize a Foo table
store.DefineTable<Foo>();

// init repository synchronisation
await this.MobileService.SyncContext.InitializeAsync(repository);
var fooTable = this.MobileService.GetSyncTable<Foo>();
await this.MobileService.SyncContext.PushAsync();
await this.saleItemsTable.PullAsync("allFoos", fooTable.CreateQuery());