我不确定这个问题是否在Kimball数据仓库文献中得到了回答--我找不到答案。
假设您有一个表,其中包含两个支持SCD2的列和一些SCD1列。问题很简单:当SCD1列发生更改时,哪些记录会被更新?
您是否更改所有记录,包括当前记录和所有历史记录?还是只更改最近的(打开的)记录?我倾向于使用“所有”,而我的所有同事都坚持使用“仅最近的”。
我能给出的唯一理由是,当我在业务键列或SCD1列上运行COUNT(DISTINCT ...)时,我希望它能给出相同的结果。
考虑到这一点,有两种特殊情况:如果一条记录没有当前版本,如果最近的记录超出范围并且没有新实例,该怎么办?如果我使用SCD2逻辑来准备将来将自动激活的记录,该怎么办?
如果我只更新最新的开放版本,那么这意味着我不会在第一个特殊情况下更改任何东西,而在另一个情况下,我需要更改所有未来的(准备好的)记录。想想..。我相信“全部”是正确的答案。
谁能指出一个著名的白皮书网站(如Kimball、微软)给出答案?
发布于 2021-05-14 21:19:59
全。类型1的目的是将事实与属性的当前值相关联:

https://www.kimballgroup.com/2013/02/design-tip-152-slowly-changing-dimension-types-0-4-5-6-7/
在类型2SCD中,事实与事实发生时处于活动状态的维度的“版本”相关联。为了使与某个版本相关联的事实“与该属性的当前值相关联”,必须在维度的所有版本上更新该当前值。
例如,如果您有
SalesFact(Date,CustomerId,Amount)和
CustomerDim(CustomerId, CustomerBK, EffectiveDate, EndEffectiveDate, IsCurrent, Name, SalesPersonId)如果希望将历史销售事实与客户的当前SalesPerson而不是销售时处于活动状态的SalesPerson相关联,则必须为该客户的所有版本更新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不会退还该销售人员的客户的旧销售额。
发布于 2021-05-14 22:41:23
根据定义,当SCD1属性更改时,所有行都必须更新。如果只更改最新版本,则为SCD2更新。
如果您有大量版本行,则可以考虑将SCD1和SCD2维度拆分到单独的表中。这确实从事实(类型4)添加了一个额外的引用,或者需要将新的SCD2维度雪花般添加到新的SCD1维度。这两个选项都解决了混合维度的更新问题。
发布于 2021-05-17 04:21:14
这种方法被称为缓慢改变维度,而不是缓慢改变属性。忽略更高级别的复杂性,维度是SCD2 0、1或2-因此,如果SCD0、1或2中的任何属性发生更改,您将创建一条新记录。
试图使维度中的属性具有不同的SCD级别只会使您陷入您所描述的混乱。
https://stackoverflow.com/questions/67534845
复制相似问题