为数据仓库选择SCD类型时,您需要考虑哪些事项?

时间:2016-01-20 08:30:19

标签: data-warehouse

对于每种情况,事实表的注意事项是什么? 维度中的更改如何影响事实表以及如何在事实表中处理它们?

1 个答案:

答案 0 :(得分:3)

答案中最简单的部分是关于事实表。无论维度类型如何,都没有任何更改。这是因为事实和维度之间的关系是维度的代理键。

对于维度,您需要确定哪些列可以更改,以及您是否需要知道它们之前的值。

如果没有列可以更改,那么SCD0通常是最合适的。你可以将它用于类似日历的东西,也许,数据是恒定的,除非我们回归到中世纪的教皇而不是原子钟:)

有时您不关心以前的值,只有当前值很重要,无论事实的年龄如何。这里的一个例子可能是客户的电话号码。我说“可能”,因为这个意义取决于业务规则。这些是SCD1尺寸。

如果我们关心以前的历史,我们需要在SCD2和SCD3之间做出选择。

每次维度数据更改时,SCD2都会创建一个新行。业务密钥保持不变,但与新时间段相关的事实将具有新的行代理键。一个示例可能是客户地址,其中客户始终由业务密钥C12345标识,但事实表指向ID 13,987和2465,表示客户转移房屋,城镇等时地址的变化。

SCD3在当前行中保持“先前”值。如果我们需要知道的是字段的当前值及其先前的值,则每次该值更改时都不需要创建新行。更新SCD3维度需要将“当前”值移至“上一个”值,然后将新值写入“当前”值。

现在,术语变得有点混乱,因为维度实际上可以将所有这些类型组合在一起。考虑理论上的银行账户维度:

  • ID(代理键)
  • 号码(业务密钥)
  • 帐户名称(SCD1,取决于业务规则)
  • 期初余额(SCD0)
  • 授权签字人(SCD2,我们想要记录谁在某个时间点获得授权)
  • 关系经理(SCD3,我想要当前和先前的)

SCD类型告诉我当任何这些列发生变化时需要更新的内容。

  • SCD0:此值不应更改,不需要更新。
  • SCD1:更新业务键的所有行。
  • SCD2:每当此值更改时创建一个新行
  • SCD3:更新业务键的所有先前和当前值

Kimball进一步定义了SCD4-6,但这些不太常用。我不会详细介绍,这个答案已经足够长了:)

最后,还有基数问题需要考虑。如果您的事实一次可能与多个维度行相关,那么您可能需要一个Bridge表来处理这种关系。

总结:

  • 您的事实表包含维度表的外键
  • 尺寸行由代理键
  • 标识
  • 根据历史记录要求,给定的业务键可能有许多维度行。
相关问题