Oracle 11g - 基于关系模型中的现有历史数据构建 Type 2 SCD

Oracle 11g - Building a Type 2 SCD based on existing historical data in a relational model

我是一名 ETL 开发人员,目前的任务是根据关系数据库中的现有历史数据开发 a type 2 SCD。我完全有能力创建一个负责跟踪未来数据更改的 2 类 SCD,但是当涉及到手头的任务时,我完全无能为力。

关系模型在我们的 ODS 中。基于该关系模型,我应该在 DW 维度中构建平面记录。有多个属性需要监视更改,每个属性都在关系模型的特定相关表中。历史变化必须每天保存,如果同一天发生多次变化,则只保留最后一次。

我该如何解决这个问题?我迷路了。提前致谢。

P.S。我们正在谈论具有 20-30 百万行和多个属性的表,这些属性可能在任何给定时间发生变化,因此必须在 SCD 中产生新记录。

这确实会很痛苦。我从你的问题中假设包含属性值的 tables 当前是独立变化的(或者你不需要问这个问题)。

如果您的 table 'Table1' 包含 'Key'、'Attribute1' 和 'Effective From'、'Effective To' 列,那么您可以 'explode' table 以 'Key'、'Attribute1'、'Date' 的形式转换为虚拟 table,为该属性当前的每个日期投影一行.

(请注意,您可能 不想 将此作为针对日期维度的范围联接来执行此操作,因为这将是 Triangular Join(即执行真正严重),您可能需要分解 ETL 中的行 tool/programmatically)

如果您跨多个 table 执行此过程,您将有一组 table 为您提供您关心的每一天的每个属性的完整每日快照关于。然后很容易加入那些基于 'FK' 和 'Date' 的 table,为您提供所有属性值的完整每日快照。

然后,当然,您需要 运行 通过另一个过程来折叠具有相同键、连续日期和所有相同属性值的行,即 'unexplode' 行,返回到'effective from','effective to'形式。再次注意,这基本上是一个逐行操作(或者至少是一个窗口函数),并且基于集合的方法将执行得非常糟糕。就个人而言,我只是通过一些 .net/java 代码来实现这一点。

考虑到数据量,这需要一段时间,但应该可以实现。