首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在支持SCD2的表上发生SCD1更改时,应更新哪些内容

在支持SCD2的表上发生SCD1更改时,应更新哪些内容
EN

Stack Overflow用户
提问于 2021-05-14 21:04:53
回答 3查看 112关注 0票数 0

我不确定这个问题是否在Kimball数据仓库文献中得到了回答--我找不到答案。

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

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

我能给出的唯一理由是,当我在业务键列或SCD1列上运行COUNT(DISTINCT ...)时,我希望它能给出相同的结果。

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

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

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

EN

回答 3

Stack Overflow用户

发布于 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中,事实与事实发生时处于活动状态的维度的“版本”相关联。为了使与某个版本相关联的事实“与该属性的当前值相关联”,必须在维度的所有版本上更新该当前值。

例如,如果您有

代码语言:javascript
复制
SalesFact(Date,CustomerId,Amount)

代码语言:javascript
复制
CustomerDim(CustomerId, CustomerBK, EffectiveDate, EndEffectiveDate, IsCurrent, Name, SalesPersonId)

如果希望将历史销售事实与客户的当前SalesPerson而不是销售时处于活动状态的SalesPerson相关联,则必须为该客户的所有版本更新CustomerDim。例如

代码语言:javascript
复制
update CustomerDim set SalesPersonId = 1234 where CustomerBk = 'Acme'

或者像这样的查询

代码语言:javascript
复制
select sum(Amount)
from SalesFact s
join CustomerDim c
  on s.CustomerId = c.CustomerId
where c.SalesPersonId = 1234

不会退还该销售人员的客户的旧销售额。

票数 1
EN

Stack Overflow用户

发布于 2021-05-14 22:41:23

根据定义,当SCD1属性更改时,所有行都必须更新。如果只更改最新版本,则为SCD2更新。

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

票数 0
EN

Stack Overflow用户

发布于 2021-05-17 04:21:14

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67534845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档