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

When choosing an SCD type for a data-warehouse, what things do you have to consider?

对于每种情况,事实表的注意事项是什么? 维度的变化如何影响事实表以及这些在事实表中如何处理?

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

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

如果none列可以改变,那么SCD0通常是最合适的。您可能会将其用于日历之类的东西,其中数据是恒定的,除非我们恢复到中世纪的教皇主义而不是原子钟 :)

有时候你并不关心以前的价值,只有现在的价值是重要的,而不管事实的年代。这里的一个例子可能是客户的电话号码。我说 "might",因为该重要性取决于业务规则。这些是 SCD1 维度。

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

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

SCD3 在当前行中维护一个 "previous" 值。如果我们只需要知道一个字段的当前值和它以前的值,我们就不需要在每次值改变时都创建一个新行。更新 SCD3 维度需要将 "current" 值移动到 "previous" 值,然后将新值写入 "current" 值。

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

  • ID(代理键)
  • 数量(业务键)
  • 账户名(SCD1,取决于业务规则)
  • 期初余额 (SCD0)
  • 授权签字人(SCD2,我们想要记录谁在某个时间点被授权)
  • 关系经理(SCD3,我想要当前的和之前的)

SCD 类型告诉我当这些列中的任何一个发生变化时需要更新什么。

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

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

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

总结:

  • 您的事实 tables 包含维度 tables
  • 的外键
  • 维度行由代理键标识
  • 给定的业务键可能有很多维度行,具体取决于历史要求。