【问题标题】:Local copy of database in clients managed by server由服务器管理的客户端中的本地数据库副本
【发布时间】:2012-06-12 12:21:39
【问题描述】:

我有一个外部连接有限的数据库(最多 5 个)。由于这个原因,我介绍了一个维护所有数据库操作的服务器应用程序。该服务器使用带有回调的 WCF 服务来通知客户端所有更改。客户端将数据库的本地副本存储在序列化字典中。当一切正常时,如果一个客户端或服务器执行更改,则几乎立即通知所有其他客户端/服务器。问题是有时客户端不同步,唯一的修复方法是删除数据库的本地副本(有时也在服务器上)。我发现当从数据库中删除某些对象时会发生这种情况。我使用带有自动更新的日期时间来查找更改的行,但这不适用于已删除的对象。一张表有超过 160000 行,因此将它们与本地副本进行比较是......麻烦。所以问题是:

1) 谁能指出创建和维护数据库本地副本的好算法(在实际数据库和服务器之间,以及服务器和客户端之间)(我不能使用复制)

2) 比序列化字典更好的本地存储方式。(加载所有数据时应用会占用大量空间)

附言。我想了几个没有数据库的解决方案,但我总是得出结论,我需要那个本地副本。

【问题讨论】:

    标签: database wcf synchronization client-server local-storage


    【解决方案1】:

    1) 任何人都可以指点我创建和创建好的算法吗? 维护数据库的本地副本(在实际数据库和服务器之间, 以及服务器和客户端之间)(我不能使用复制)

    在您的情况下,最简单的解决方案可能是将IsDeleted 列添加到您的数据表中。 在这种情况下,您不应更新同步过程(添加对该新列的支持除外),但您需要使用“and not IsDeleted = 1” where 子句更新 SQL 查询。

    如果您想跟踪对象何时被删除,您也可以使用DeletionDate 和“and DeletionDate is not null”。

    这种方法有一些限制,但它可能是解决删除记录问题的最具成本效益的解决方案,因为同步算法不受影响。

    2) 比序列化字典更好的本地存储方式。(app 加载所有数据时占用大量空间)

    如果在内存中存储数据不合适,我会使用文件。平面 TXT 文件或 XML 不适合大数据集。您可以使用紧凑型 RDBMS 或 No-SQL 数据库。我对 No-SQL 不是很熟悉,所以不能在这里提出建议。 MS SQL Compact 4.0 足够轻量级,可以在您的情况下使用。您只需将几个 DLL 复制到客户端计算机即可开始使用它,并且您的 MS SQL 经验仍然适用。

    http://msdn.microsoft.com/en-us/library/aa983326(v=vs.110).aspx

    【讨论】:

    • 感谢您的建议。我也考虑过这样的列(状态列也可以包含其他信息),但我认为额外的列将仅用于几行(大量未使用的 mysql 数据库空间)。不幸的是,我将不得不使用它,因为我看不到任何其他选项,除非有人会在此处发布它。您对问题 2 有什么建议吗?
    • 对于删除,创建一个 tombstone 表来存储被删除行的 PK。并在同步期间使用该表级联删除。
    猜你喜欢
    • 2018-04-20
    • 1970-01-01
    • 2017-09-14
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多