0

我不确定 Kimball Data-Warehouse 文献中是否回答了这个问题——我找不到答案。

假设您有一个表,其中包含几个 SCD2 感知列和一些 SCD1 列。问题很简单:当 SCD1 列发生更改时,哪些记录会更新?

您是否更改所有记录,当前记录和所有历史记录?还是只更改最近的(打开的)记录?我倾向于“全部”,而我所有的同事都坚持“仅最近”。

我可以给出我意见的唯一原因是,COUNT(DISTINCT ...)当我在业务键列或 SCD1 列上运行它时,我希望给出相同的结果。

考虑一下,有两种特殊情况:如果记录没有当前版本,如果最近的记录超出范围并且没有新实例怎么办?如果我使用我的 SCD2 逻辑来准备将来会自动激活的记录怎么办?

如果我只更新最新的开放版本,那意味着我在第一个特殊情况下不会更改任何内容,而在另一种情况下,我需要更改所有未来(准备好的)记录。想一想……我相信“全部”是正确的答案。

谁能指出一个著名的白皮书网站(如 Kimball,Microsoft)给出答案?

4

3 回答 3

1

全部。类型 1 的意图是事实与属性的当前值相关联:

在此处输入图像描述

https://www.kimballgroup.com/2013/02/design-tip-152-slowly-changeing-dimension-types-0-4-5-6-7/

在类型 2 SCD 中,事实与事实发生时处于活动状态的维度的“版本”相关联。为了使与版本关联的事实“与属性的当前值关联”,必须在维度的所有版本上更新当前值。

例如,如果你有

SalesFact(Date,CustomerId,Amount)

CustomerDim(CustomerId, CustomerBK, EffectiveDate, EndEffectiveDate, IsCurrent, Name, SalesPersonId)

如果您想将历史销售事实与客户的当前销售人员关联,而不是销售时活动的销售人员,您必须为该客户的所有版本更新 CustomerDim。例如

update CustomerDim set SalesPersonId = 1234 where CustomerBk = 'Acme'

或者像这样的查询

select sum(Amount)
from SalesFact s
join CustomerDim c
  on s.CustomerId = c.CustomerId
where c.SalesPersonId = 1234

不会退回该 SalesPerson 客户的旧销售额。

于 2021-05-14T13:19:58.837 回答
0

该方法称为缓慢变化的维度,而不是缓慢变化的属性。忽略更高级别的复杂性,维度是 SCD0,1 或 2 - 因此,如果 SCD2 维度中的任何属性发生更改,则您将创建一条新记录。

试图使维度内的属性具有不同的 SCD 级别只会让您陷入您所描述的混乱之中。

于 2021-05-16T20:21:13.633 回答
0

根据定义,必须在 SCD1 属性更改时更新所有行。如果您只更改最新版本,则它是 SCD2 更新。

如果您有大量版本行,您可以考虑将 SCD1 和 SCD2 维度拆分到单独的表中。这确实增加了事实(类型 4)的额外参考,或者需要将新的 SCD2 维度雪花化到新的 SCD1 维度。这两个选项都解决了对混合维度的更新问题。

于 2021-05-14T14:41:22.670 回答