我正在寻找一些意见。我正在设计一个多用户,多供应商,n层数据库应用程序。
此系统的每个本地安装必须将其记录复制到单个中央服务器。安装的数据库应用程序的用户无法直接使用此服务器,并且Internet是唯一的途径。中央数据库仅用于报告,因此复制只需要单向中央服务器。
主要目标是尽可能快地将记录提供给中央数据库,以确保“伪实时”快照。
这是我到目前为止所得到的:
使用Internet上的Web服务器(SOAP服务)上载压缩/加密文件(XML数据)。 “中央”数据库服务器轮询Web服务器以定期收集和导入数据。
本地数据库系统不会删除记录,但会将其标记为已删除。
数据库中的每个表都有一个主键,使用类似GUID的代理键(即没有auto-inc字段)来防止中央数据库发生密钥冲突。
我使用客户端的数据库服务器打折以运行提取和上传过程,因为在客户站点上对此系统的IT支持很少,因此如果上传失败(由于本地防火墙/代理服务器问题) )然后我希望用户尽快知道所以他们可以把它分类。
提取过程一次只能由一个客户端应用程序运行,因为它将查询整个本地数据库以提取更改。
我正在努力的是数据库结构,以便能够有效(和准确)地提取最近更改的记录。此外,当用户正在工作时也会发生这种情况,即在提取正在进行时需要注意打开记录以进行编辑的用户,并且需要它在“后台”运行,以免过多地打断用户。
即。我使用日期&基于时间的方法?我是否使用某种状态字段,甚至是可以查询然后清除的单独更改日志表?
为长篇文章道歉,但我重视任何人对开发此解决方案的经验。
TIA,
斯图尔特
答案 0 :(得分:1)
您可能想看看PostgreSQL的Slony如何做到这一点。
实际上,不是在实际表中查询更改,而是使用表上的触发器将更改的数据记录到单独的日志记录表中(这些插入/更新/删除)。然后,在日志记录表中增加字段(无论是事务ID,时间等),只需获取自上次以来的更改,并在所有感兴趣的各方拥有它们后删除日志条目,它变得简单明了。请注意,这也会删除修改原始表(及其客户端)的#2点,以了解存在但逻辑删除的行。
当然,根据您的数据库引擎,有几个细节会使问题复杂化。 original Slony design document可以很好地解决问题,以及为什么它会按照它的方式做事。即使您没有使用PostgreSQL,也许值得一读。