2

数据库大师,

我希望有人可以为我设定正确的方向。

我有两张桌子。表 A 和表 B。当系统启动时,表 A 中的所有条目都会被处理并复制到表 B(根据表 B 的模式)。表 A 可以有数万行。

当系统启动时,表 B 通过数据库更改通知与表 A 保持同步。

如果系统重新启动,或者我的服务重新启动,我想重新初始化表 B。但是,我想用尽可能少的数据库更新来做到这一点。具体来说,我想:

  • 添加表 A 中但不在表 B 中的任何行,以及
  • 删除不在表 A 中但在表 B 中的所有行
  • 表 A 和表 B 共有的任何行都应保持不变

现在,我不是“数据库人”,所以我想知道这样做的传统方式是什么。

4

5 回答 5

2

用于exists将处理保持在最低限度。

沿着这些思路进行了修改,因此连接是正确的(还要验证我没有做愚蠢的事情并从您的描述中获取TableATableB倒退):

insert into TableB
    select 
        *
    from
        TableA a
    where
        not exists (select 1 from TableB b where b.ID = a.ID)

delete from 
    TableB b
where
    not exists (select 1 from TableA a where a.ID = b.ID)
于 2009-11-25T21:12:17.453 回答
1

Informix 的企业复制功能将为您完成所有这些工作。ER 的工作原理是将逻辑日志从一台服务器传送到另一台服务器,然后在辅助服务器上滚动它们。

您可以根据需要将其配置为细粒度(即只有少数表)。

您使用术语“数据库更改通知”-您是否已经在使用 ER 或者这是一些基于触发器的安排?

如果由于某种原因 ER 不能为您的配置工作,我建议重写通知模型以异步运行,即:

  • 将通知写入服务器“A”中包含时间戳或序列字段的表
  • 在服务器“B”上创建一个存储最后处理记录的时间戳/序列值的表
  • 在服务器“B”上运行一个守护进程:
    • 比较“A”和“B”时间戳/序列
    • 在“A”和“B”时间戳之间选择“A”记录
    • 将这些记录处理为“B”
    • 更新“B”时间戳/序列
    • 睡眠适当的时间段,然后循环

因此服务器“B”负责确保其副本与“A”同步。'A' 不会因为'B' 不可用而感到不便。

于 2009-11-26T01:15:43.540 回答
0

一种简单的方法是使用历史表,您将在其中放置自上次更新以来发生的 A 更改,并使用该表同步表 B,而不是直接从 A 复制到 B。同步完成后,您删除整个历史表并重新开始。

我不明白的是,如果您的服务或计算机未运行,则如何更新表 A 而不是 B。它们是在 2 个不同的数据库或服务器上找到的吗?

于 2009-11-25T21:10:44.150 回答
0

根据共同列连接两个表中的数据,这将为您提供在两个表中都匹配的行,即 A 和 B 中的数据。然后使用这个值(我们称之为集合 M)和集合操作,即集合减操作获得差异。

第一个要求:A 减去 M 第二个要求:B 减去 A 第三个要求:M

你明白吗?

于 2009-11-25T21:12:35.320 回答
0

我是 Sql Server 人,但自 Sql Server 2008 起,对于这种操作,可以使用功能调用MERGE

通过使用 MERGE 语句,我们可以在单个语句中执行插入、更新和删除操作。

所以我用谷歌搜索并发现了Informix also supports the same MERGE 语句,但我不确定它是否也处理删除,尽管插入和更新正在被处理。此外,这个语句自己处理事务

于 2009-11-26T02:11:41.010 回答