0

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

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

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

PS 我们说的是具有 20-3000 万行和多个属性的表,这些属性可能在任何给定时间发生变化,因此必须在 SCD 中产生新记录。

4

1 回答 1

1

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

如果您有一个包含“Key”、“Attribute1”和“Effective From”、“Effective To”列的表“Table1”,那么您可以将该表“分解”为“Key”、“Attribute1”形式的虚拟表,'Date',为该属性当前所在的每个日期投影一行。

(请注意,您可能希望将此作为针对日期维度的范围连接,因为这将是一个三角连接(即执行非常糟糕),您可能需要在 ETL 工具中/以编程方式分解行)

如果跨多个表执行此过程,您将拥有一组表,为您提供您关心的每一天的每个属性的完整每日快照。然后,根据“FK”和“日期”连接这些表就相当容易,从而为您提供所有属性值的完整每日快照。

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

鉴于数据量,这将需要一段时间,但应该可以实现。

于 2016-09-14T01:23:51.960 回答