0

我正在寻找一些输入。我正在设计一个多用户、多供应商、n 层数据库应用程序。

该系统的每个本地安装都必须将其记录复制到单个中央服务器。安装的数据库应用程序的用户不能直接使用此服务器,并且 Internet 是访问它的唯一途径。中央数据库仅用于报告,因此复制只需单向到中央服务器。

主要目标是尽可能快地将记录发送到中央数据库,以确保“伪实时”快照。

这是我到目前为止所得到的:

  1. 使用 Internet 上的 Web 服务器(SOAP 服务)上传压缩/加密文件(XML 数据)。“中央”数据库服务器定期轮询 Web 服务器以收集和导入数据。

  2. 本地数据库系统不会删除记录,而是将它们标记为已删除。

  3. 数据库中的每个表都有一个主键,使用类似 GUID 的代理键(即没有 auto-inc 字段)来防止中央数据库上的键违规。

  4. 我已经打折使用客户端的数据库服务器来运行提取和上传过程,因为在客户站点上对该系统的 IT 支持很少,所以如果上传失败(由于本地防火墙/代理服务器问题),那么我想要用户尽快知道,这样他们就可以对其进行分类。

  5. 提取过程一次只需要由一个客户端应用程序运行,因为它将查询整个本地数据库以提取更改。

我正在努力解决的问题是数据库结构能够有效(和准确)地提取最近更改的记录。这也会在用户工作时发生,即需要注意用户在提取过程中打开记录以供编辑,并且需要它“在后台”运行,以免过多地打扰用户。

即我是否使用基于日期和时间的方法?我是否使用某种状态字段,甚至是可以查询然后清除的单独更改日志表?

为这篇长文道歉,但我会重视任何人在开发此解决方案方面的任何经验。

TIA,

斯图尔特

4

1 回答 1

0

您可能想看看Slony for PostgreSQL 是如何做到的。

实际上,它不是查询实际表的更改,而是使用表上的触发器将更改的数据记录到单独的日志记录表中(这些插入/更新/删除)。然后,它变得简单,在日志表中增加一个字段(无论是事务 ID、时间等),以仅获取自上次以来的更改,并在所有相关方拥有日志条目后删除它们。请注意,这也消除了您修改原始表(及其客户端)以了解存在但在逻辑上已删除的行的 #2 点。

当然,根据您的数据库引擎,有几个细节可能会使事情复杂化。最初的Slony 设计文档很好地涵盖了这些问题以及为什么它会以这种方式做事。即使您不使用 PostgreSQL,它也可能值得一读。

于 2009-01-15T18:06:41.140 回答