检索新添加的数据库记录

时间:2011-05-24 20:59:54

标签: database etl

假设我们有以下通用场景:

  1. RDBMS作为数据源,是一个实时数据库(一直填充数据)。
  2. SQL Server 2008作为数据目标,位于远程位置。
  3. 我们需要编写一个软件解决方案:

    1. 初次运行后,它会 经常(让我们说几次 一天)从中提取一些特定数据 来源。的“特殊性” 数据在于曾经的事实 映射/转换是 设计,他们将保持这种方式。
    2. 提取的数据将被放入目的地,等待另一个进程(我们的范围之外)消耗。等待消费意味着他们会暂时停留在那里。
    3. 具有以下特点:

      1. 提取可以是复杂 (意思是它不是一个 从a直接提取 具体表,但组合 连接)。
      2. 来源中涉及的大量数据。通常约数千万行,但预计不会超过几百行。
      3. 具有以下所需限制:

        1. 与数据库无关 可能的来源方。
        2. 在源RDBMS中保持最小干预,因为它不属于“我们”,任何更改/添加/请求都遵循“不灵活”的过程。
        3. 我们不能理所当然地认为从源代码中提取的表格会有某种时间戳,自动增加键或其他最终会帮助我们进行“范围查询”的表格从“此值及之后”中检索记录。
        4. 问题:因为我们经常从实时源提取数据,我们如何有效地检索新添加的记录,同时考虑到上述特征/限制?如果你不得不打破其中一个限制,那将是哪一个?是否有一个术语描述了这个问题(比如数据差异或......)?我主要关心的是如何以有效的方式检索“差异”。

          注意:我支持打破数据库不可知论的想法,并发挥各种RDBMS(元数据?)提供的有用机制,以从我们感兴趣的表中获取最近添加的行。我为通用而道歉,但我也期待一个通用的答案。

2 个答案:

答案 0 :(得分:1)

首先我要说的是,我并不羡慕你必须处理这类要求。

那就是说,如果没有办法告诉上次导入后添加了什么,就必须提取所有数据并将其与目标进行比较,不是吗?

我可以想到两种方法来最小化源RDBMS上的负载:

  1. 更新结构以允许通过ID或时间戳识别新项目。

  2. 向RDBMS添加触发器,将任何INSERTS和UPDATES转发给您并维护一个没有源的缺点的镜像。

  3. 然后,其他人可能会提出更好的解决方案。可能涉及伏都教:)

    祝你好运。

答案 1 :(得分:1)

  

我主要关注的是如何做到   检索一个“差异”   高效的方式。

您如何以有用的方式识别差异?鉴于此

  • 你不能把差异作为基础 时间戳。
  • 你不能把差异作为基础 序号。

您可能必须依赖唯一通用的方法:存储提取的密钥,并使用它们来查找差异。 (这适用于新行,但对更新的行没有帮助。)

您是否能够有效地做到这一点很大程度上取决于您允许存储提取的密钥的位置,以及您可以在实时数据和存储的密钥之间使用哪种连接。