数据仓库 - 缓慢改变具有多对多关系的维度

时间:2013-11-01 00:45:00

标签: sql many-to-many ssas data-warehouse scd

作为一个例子,我们说我有一个具有两个维度和一个度量的事实表

FactMoney表


ProjectKey int

PersonKey int

CashAmount money


这两个维度的定义如下:

DimProject(类型0维度 - 即静态)


ProjectKey int

ProjectName varchar(50)


DimPerson(类型2缓慢变化的维度)


PersonKey int

PersonNaturalKey int

PersonName varchar(50)

EffectiveStartDate datetime

EffectiveEndDate datetime

IsCurrent位


到目前为止非常简单。现在我将介绍一个人类分类概念。

DimCategory


CategoryKey int

CategoryName varchar(50)


在DimPerson和DimCategory之间建立M2M关系

BridgePersonCategory


PersonKey int

CategoryKey int


所以 - 人们可以拥有1..n类别。

我的问题是 - 由于Person是一个缓慢变化的维度,当一个人的名字发生变化时,我们会添加一个新人行并更新我们的生效日期并且是当前标志,没什么大不了的。

但我们如何对这个人的类别做些什么呢?每次弹出新人版本时,是否需要向桥接表添加更多行?

作为必然结果,如果一个人的类别发生变化,这是否意味着我们需要在人员表中创建一个新行?

3 个答案:

答案 0 :(得分:2)

关于你的主要问题:我想说你需要在类别表中添加类别(可能是从旧人行中复制它们)。因此,您可以继续对处于新(已更改)状态的人进行分类。

关于类别更改:我更愿意不添加人员行,但在类别表中添加初始有效期和到期日期。通过这种方式,每个类别都可以独立地改变。但是你需要注意不是时间点查询,因为你可能会超出类别

答案 1 :(得分:1)

但我们如何对这个人的类别做些什么呢?每次弹出新人版本时,我们是否需要在桥接表中添加更多行?

仅限,如果您想更改此人的类别。因为,只有人名更改不是DimPerson表中的人员键。 DimPerson和PersonCategory之间的关系仍然有效。当人名改变时,他仍然属于同一类别。意味着任何时间点的人都只能属于一个类别。 要解决这个问题,您必须在联结表(PersonCategory)中创建一个SCD2,以便与Keys和Effective Dates建立关系。

这也将回答您的下一个问题。 作为必然结果,如果一个人的类别发生变化,这是否意味着我们需要在人员表中创建一个新行?

如有任何进一步澄清,请与我们联系。

答案 2 :(得分:0)

  

因为,只有人名更改的不是DimPerson表中的人员密钥。

如果你在DimPerson上有SCD2,我会说这是不正确的,因为@ScottHerbert说。因为在这种情况下PK(我假设它的PersonKey)正在改变,只有BK(我假设它的PersonNaturalKey)将保持不变。但是你不会在商业密钥上建立关系,因为那样你就失去了哪个人拥有哪个类别的历史记录。

在我看来,你必须使用来自person的新PK和来自Category的旧PK为Person Cat添加新版本。

同样适用于类别,如果名称正在更改此类别,则会获得一个新的PK,您必须将其添加到Bridge表中。