我是一名ETL开发人员,目前的任务是根据关系数据库中现有的历史数据开发类型2的SCD。我完全有能力创建一个类型2的SCD,负责跟踪数据的未来更改,但当涉及到手头的任务时,我完全没有用。
关系模型在我们的ODS中。基于这个关系模型,我应该在DW维度中构建平面记录。有多个属性需要进行更改监控,每个属性都在关系模型中的特定相关表中。历史更改必须每天保存,如果同一属性在同一天发生多个更改,则只有最后一个更改存在。
我该如何应对?我迷路了。提前谢谢。
附言:我们所说的表有2000-3000万行和多个属性,这些属性可能在任何给定的时间发生变化,因此必须在SCD中产生新的记录。
这确实会很痛苦。我从你的问题中假设,包含属性值的表目前是独立变化的(或者你不需要问这个问题)。
如果表"Table1"包含"Key"、"Attribute1"one_answers"Effective From"、"Effective To"列,则可以将该表"分解"为形式为"Key","Attribute1","Date"的虚拟表,并为该属性当前所在的每个日期突出一行。
(请注意,您可能不想将其作为日期维度的范围联接,因为这将是一个三角联接(即执行非常糟糕),您可能需要在ETL工具中/以编程方式分解行)
如果您在多个表上执行此过程,您将有一组表,为您提供您关心的每一天的每个属性的每日快照。然后,可以很容易地基于"FK"one_answers"Date"连接这些表,从而为您提供所有属性值的完整每日快照。
然后,当然,你需要通过另一个过程来运行这个过程,以折叠具有相同Key、连续日期和所有相同属性值的行,即"未编码"行,回到"有效起始"、"有效终止"形式。再次注意,这基本上是一个逐行操作(或者至少是一个窗口函数),基于集合的方法会执行得非常糟糕。就我个人而言,我只是通过一些.net/java代码来实现这一切。
考虑到数据量,这将需要一段时间,但应该是可以实现的。