3

例如,假设我有一个包含两个维度和一个度量的事实表

FactMoney 表


ProjectKey int

PersonKey int

现金金额


这两个维度的定义如下:

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


ProjectKey int

项目名称 varchar(50)


DimPerson(第 2 类缓变维度)


PersonKey int

PersonNaturalKey int

人名 varchar(50)

EffectiveStartDate 日期时间

EffectiveEndDate 日期时间

IsCurrent 位


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

昏暗类别


CategoryKey int

类别名称 varchar(50)


并在 DimPerson 和 DimCategory 之间建立 M2M 关系

桥人类别


PersonKey int

CategoryKey int


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

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

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

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

4

3 回答 3

2

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

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

于 2013-11-02T15:40:06.550 回答
1

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

仅当您想更改人员的类别时。因为,只有人名改变了 DimPerson 表中的人键。DimPerson 和 PersonCategory 之间的关系仍然有效。当人名改变时,他仍将属于同一类别。这意味着一个人在任何时候都只能属于一个类别。为了克服这个问题,您必须在联结表 (PersonCategory) 上创建一个 SCD2,以便使用键和有效日期建立关系。

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

请让我知道任何进一步的澄清。

于 2015-10-08T14:12:08.853 回答
0

因为,只有人名改变了 DimPerson 表中的人键。

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

在我看来,您必须使用来自人的新 PK 和来自类别的旧 PK 向 Person Cat 添加一个新版本。

类别也是如此,如果名称正在更改,此类别将获得一个新的 PK,您必须将其添加到 Bridge 表中。

于 2016-09-28T13:21:17.730 回答