Architecture 有时脱机应用程序架构问题

Architecture 有时脱机应用程序架构问题,architecture,replication,n-tier-architecture,offline,Architecture,Replication,N Tier Architecture,Offline,我有一个针对SQLServerDB运行的n层winform客户机-服务器应用程序。我希望它能够有时运行“脱机”(未连接到数据库),并在重新连接时,重新锁定对主数据库的更改。现在,我有一个艰难的体系结构决策要做:我应该使用数据库复制还是自己使用队列/脚本等来管理它。我的应用程序是退出复杂的-我使用数据库和表之间包含自动增量键和forien键约束的表。我的部分数据不像图片和文档那样嵌入数据库中。我很想听听你的意见和过去的经验!谢谢,Adi,我以前从来没有做过这样的事,但在我看来,如果你那样做,你可能

我有一个针对SQLServerDB运行的n层winform客户机-服务器应用程序。我希望它能够有时运行“脱机”(未连接到数据库),并在重新连接时,重新锁定对主数据库的更改。现在,我有一个艰难的体系结构决策要做:我应该使用数据库复制还是自己使用队列/脚本等来管理它。我的应用程序是退出复杂的-我使用数据库和表之间包含自动增量键和forien键约束的表。我的部分数据不像图片和文档那样嵌入数据库中。我很想听听你的意见和过去的经验!谢谢,Adi,我以前从来没有做过这样的事,但在我看来,如果你那样做,你可能会遇到严重的问题

从技术上讲,我不认为这真的很难实现。基本上,您必须在每个客户机上设置一个数据库副本,并在客户机每次连接到服务器时与服务器同步,但我想您已经做到了这一点

我会在客户端的每个表上都有一个小列和一个日期戳,这样我就可以检查哪些记录已经离线更改了。在服务器端,使用一个datestamp列记录对象的最后一次更新就可以了

至于自动递增的主键,我会松开它们,因为您需要自己设置它们,以防止使用相同的键创建两个记录(您可能需要在同步时更改它们)

这是最简单的部分。。。现在事情会变得一团糟。。。你需要考虑到这会给你带来很多麻烦。。。会发生各种各样或不希望发生的事件,例如: -两个用户离线更改同一记录。 -一个用户在线更改记录,另一个用户离线更改记录 -一个用户在线删除记录,而另一个用户离线删除记录

潜在问题的清单层出不穷,在你开始解决这些问题之前,你必须列举每一个问题,并向你的客户记录他们期望系统如何处理每一个问题,否则当他们丢失数据时(不管你做什么,这都会发生),这将是你的错,而不是他们的错

我建议您为数据库中可以脱机更改的每个表构建版本控制系统。用户会弄乱他们的数据,对他们来说执行回滚将是一件好事。

免责声明:我假设您已经考虑过使用.NET数据集并对它们进行折扣,因为它们的设计只是为了帮助您描述的问题域。)

我曾经在一家为全国连锁店开发销售点系统的公司工作。主数据库存储在总部,而每家商店都有自己的数据库精简版本存储在该站点的本地。实际上,每家商店都一直处于离线状态,因此您所描述的情况并不完全相同,但是我们必须处理一些我认为您需要处理的同步/复制问题

我们的数据通信每天晚上都在进行:商店将在预先确定的时间连接到总部,上传数据更改包,并下载将应用于该商店本地数据库的类似数据更改包。然后,我们在两个站点(总部和商店)都有您可能称之为“数据同步引擎”的功能,它将处理这些数据包,将更改(插入/更新/删除)折叠回相关数据库

当您像这样执行基本数据复制时,正如Sergio所提到的,存在许多潜在的陷阱。一个是标识,即如何派生唯一标识表行的主键。另一个是版本控制,以及如何处理同一行的不同版本之间的冲突

在我们的例子中,我们使用guid作为主键,而不是使用自动递增列,从而使事情变得简单(-ier!)。使用guid并非没有问题,但在我们的例子中,这意味着我们可以为一个新的数据行分配一个主键,而不必担心其他人使用它

我不太清楚我们是如何处理版本控制问题的(已经有几年了!),但从记忆中我认为我们在每一行上都有两个时间戳:其中一个记录了总部更新该行的日期/时间;另一个,当它在商店更新时。每行也有两个“版本号”,表示总部和商店的版本。数据协调涉及相互比较这些时间戳和版本号,最新的更改“获胜”(当然假设另一方没有更改行)


正如Sergio指出的,您最大的问题将是处理数据协调冲突。在我们的案例中,当一家商店和总部在同一天更改了相同的数据项时,就会发生这种情况。我们解决了这个问题,总是在商店端的更改失败,并在总部编写了一个自定义数据协调应用程序,其中涉及用户直观地比较和合并一个数据项的两个冲突版本。理论上,我认为您可以使用一些定制的处理规则来自动合并不同的版本,但是您需要权衡开发这样的东西的成本与产生冲突的可能性。从内存来看,尽管有大量商店(几百家)对同一组数据进行更改,但这对我们的系统来说从来都不是一个大问题。当然是YMMV。

我已经在不同的地方多次这样做了(请参见下面Steve Rands的回答),我强烈建议您不要使用正常复制,尤其是在涉及多个数据库的情况下

我之所以这样说,是因为根据我的经验,复制不够聪明,无法处理远程站点重新联机(或决定添加)时可能出现的问题