作为一个例子,我们说我有一个具有两个维度和一个度量的事实表
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位p>
到目前为止非常简单。现在我将介绍一个人类分类概念。
DimCategory
CategoryKey int
CategoryName varchar(50)
在DimPerson和DimCategory之间建立M2M关系
BridgePersonCategory
PersonKey int
CategoryKey int
所以 - 人们可以拥有1..n类别。
我的问题是 - 由于Person是一个缓慢变化的维度,当一个人的名字发生变化时,我们会添加一个新人行并更新我们的生效日期并且是当前标志,没什么大不了的。
但我们如何对这个人的类别做些什么呢?每次弹出新人版本时,是否需要向桥接表添加更多行?
作为必然结果,如果一个人的类别发生变化,这是否意味着我们需要在人员表中创建一个新行?
答案 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表中。