gpt4 book ai didi

c# - 增量更新应用程序数据的最佳方法

转载 作者:太空狗 更新时间:2023-10-30 01:58:47 46 4
gpt4 key购买 nike

几年来,我一直在开发一个应用程序,我使用后端数据库对其进行了更新。关键是所有内容都缓存在客户端上,因此它永远不需要网络连接即可运行,但当它确实有连接时,它总是会获取最新更新。每个更新的应用程序都附带最新版本的数据库,我希望它在数据库更新后仅下载最少量的数据。

我目前使用带有时间戳的表来检查更新。它看起来像这样。

ID - Name - Description- Severity - LastUpdated
0 - test.exe - KnownVirus - Critical - 2009-09-11 13:38
1 - test2.exe - Firewall - None - 2009-09-12 14:38

这种方法非常适合我以前的需要,但我希望扩展应用程序的更多功能以使用这种动态方法。所有数据当前存储为 XML , 但我不想在数据库中存储完整的 XML 文件,只传输更改的数据。

那么您将如何允许一种相当简单的方法在数据库中存储动态内容 (text/xml/json/xaml),并让客户端只下载新的更新?我正在考虑拥有可以处理直接插入的 XML 的逻辑

ID - Data - Revision
15 - XXX - 15

XXX会像 <Content><File>Test.dll<File/><Description>New DLL to load.</Description></Content>并将被插入到缓存中,但这显然很复杂,因为我需要按顺序加载它们。

已经提到的另一种方法是将其基于类似于源代码控制的东西,将版本存储在文件的根目录中并计算增量以确定需要发送给客户端的最小数据量。

有人对如何在没有数据损坏风险的情况下解决这个问题有任何建议吗?我还会扩展一些功能,使我能够恢复可能的错误修订,并用新的工作修订替换它们。

最佳答案

这实际上取决于您使用的工具和您已有的架构。是否已经有具有某些逻辑和数据访问层的服务器?

动态方法可能会变得复杂、缓慢并限制解决方案的数量。为什么需要动态结构?在关系数据库中使用名称-值对方法仅添加数据是否可行?静态和统一的数据结构更容易处理。

在进入细节之前,您应该考虑不同的场景。

  • 可以添加项目
  • 可以更改项目
  • 可以删除项目(我假设)

添加问题不大。客户端需要记住它从服务器获得的最后一个修订号,然后你编写一个查询,从那里获取所有内容。

变化基本相同。你应该关心元素的识别。您需要一个不可更改的代理键,因为它似乎是您已经拥有的 ID。 (指南在这里可能会有用。)

删除是棘手的。您需要将项目标记为已删除而不是实际删除它们,或者有一个已删除的 ID 列表以及它们被删除时的修订号。

在客户端中存储数据:考虑在客户端中使用 SQLite 等关系数据库。 (它不需要安装,它只是存储在一个文件中。例如,Firefox 在 SQLite 数据库中存储了很多内容。)在服务器中使用它时,您可能可以重用一些代码。它也是基于事务的,这有助于保持一致性(在同步期间出错时回滚)。

XML - 如果您真的需要它 - 可以像字符串一样存储在数据库中。

当使用支持 SQLite 的抽象层或 ORM(例如 NHibernate)时,即使服务器使用另一个数据库,您也可以重用一些代码。请注意,此类 ORM 的学习曲线可能相当陡峭。如果您对此一无所知,那就太过分了。

您不需要在客户端和服务器中强制重用代码。

同步本身应该不会很复杂。您在客户端中有一个修订号,在服务器中有一个最新修订版。从那时起,您将在客户端中获取所有新的/更改的和删除的项目,并将其应用于本地商店。更新本地修订号。犯罪。完成。

我永远不会只更新修订版的一部分,因为这样你就无法真正知道自上次同步以来发生了什么变化。因为您进行差异更新,所以必须有一个明确定义的客户端状态。

关于c# - 增量更新应用程序数据的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13108416/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com