简介
数据仓库中的缓慢变化维度是一个重要的概念,它被用来实现分析系统中数据的历史性。如你所知,数据仓库是用来分析历史数据的,它对存储数据的不同状态至关重要。
在数据仓库中,我们有事实表和维度表来存储数据。维度表是用来分析事实表中的措施的。在数据环境中,数据在操作数据库中启动,数据将被提取-转换-加载(ETL)到数据仓库以适应分析环境。
客户、产品是维度表的例子。这些维度属性会随着时间的推移而被修改,在数据仓库中,我们需要维护历史。在运营系统中,我们可能会覆盖修改过的属性,因为我们可能不需要数据的历史方面。由于我们在数据仓库中的主要目标是以历史的角度来分析数据,我们可能无法简单地覆盖数据,我们需要实施特殊的技术来维护历史,考虑到数据仓库的分析和数量方面。这个实现是使用数据仓库中的慢速变化维度完成的。
在讨论慢速变化维度(SCDs)的细节之前,让我们列出不同的慢速变化维度,如下表所示。
SCD类型 | 摘要 |
类型 0 | 忽略任何变化并审计变化。 |
类型1 | 覆盖更改 |
类型2 | 历史记录将被添加为新行。 |
类型3 | 历史将被添加为一个新的列。 |
类型4 | 一个新的维度将被添加 |
类型6 | 类型2和类型3的组合 |
现在让我们看看每个类型的缓慢变化维度。
SCD类型0
有些情况下,你会忽略任何变化。例如,当一个雇员加入一个组织时,有一些加入的相关属性,如加入的指定和加入日期等,不应该随着时间的推移而改变。
下面是关于数据仓库中缓慢变化维度的类型0的例子。
在上面的客户维度中,FirstDesignation,JoinDate和DateFirstPurchase是不会被更新的属性,这是类型0 SCD。
SCD类型1
在类型1的SCD中,你只需覆盖维度中的数据。可能会有这样的情况,当记录在维度中启动时,你没有全部的数据。例如,当客户记录被启动时,你可能没有得到所有的属性。因此,当客户记录在操作数据库中被启动时,客户记录中会有空的或空的记录。一旦ETL被执行,这些空记录将在数据仓库中被创建。一旦这些属性在操作数据库中被填充,就必须在数据仓库中更新。
如果现有的属性是空的,并且你从操作表中接收一个值,那么类型1 SCD就会被识别。
在上面的客户维度表中,客户CustomerKey11015和11019的AnnualIncome是空的。当这些记录在操作数据库中被更新时,这些值应该在数据仓库中被更新,而不考虑这些是历史值。
SCD类型2
数据仓库中的第二类慢速变化维度是数据仓库中最常用的维度。正如我们所讨论的,数据仓库是用于数据分析的。如果你需要分析数据,你需要适应数据的历史方面。让我们看看我们如何实现SCD类型2。
对于SCD类型2,我们需要包括另外三个属性,如StartDate,EndDate和IsCurrent,如下图所示。
在上面的客户维度中,有两条记录,让我们说客户代码为AW00011012的客户已经被提升为高级管理人员。然而,如果你简单地用新值更新记录,你将看不到以前的记录。因此,一个新的记录将被创建,有一个新的CustomerKey和一个新的 Designation。然而,其他属性将保持不变。
正如你在上图中看到的,CustomerCodeAW00011012有一条新的记录,编号为11013。所有新的交易将与CustomerKey11013 有关,而以前的交易则与CustomerKey11012 有关。这种机制有助于保留客户的历史方面,如下面的查询中所示。
SELECT C.Designation,SUM(SalesAmount) SalesAmount,SUM(TotalProductCost) TotalProductCost
FROM FactInternetSales F
INNER JOIN Dim_Customer C ON F.CustomerKey = C.CustomerKey
GROUP BY C.Designation
一旦查询被执行,将观察到以下结果。
正如你所看到的,在上述结果中可以看到管理指定,这意味着它已经涵盖了历史方面。类型2 SCD是不能避免在数据仓库的维度表中使用代理键的实现方式之一。
SCD类型3
数据仓库中的类型3缓慢变化维度是一个简单的实现,历史将被保存在额外的列中。如果我们将我们在类型2 SCD下讨论的相同场景与类型3 SCD联系起来,客户维度将看起来像下面这样。
正如你所看到的,数据的历史方面被保留为不同的列。然而,如果你想保留历史数据,这种方法将是不可扩展的。此外,这种技术将只允许保留历史的最后一个版本,与类型2 SCD不同。
通常情况下,这将更适合于实现雇员的姓名变更。在某些情况下,女性雇员在结婚后会改变她们的名字。在这种情况下,你可以使用类型3 SCD,因为这些类型的变化不会迅速发生。
SCD类型4
正如我们在SCD类型2中所讨论的,我们通过在维度中添加不同版本的行来维护历史。 然而,如果变化是快速的,类型2 SCD将是不可扩展的。
例如,让我们假设我们想根据客户以前的付款情况来保留客户的风险类型。因为这是一个与客户相关的属性,所以它应该被存储在客户维度中。这意味着每个月都会有一个新版本的客户记录。如果你有1000个客户,你将会看到每个月有12000条记录。你可以想象,这种在数据仓库中缓慢变化的维度是不可扩展的。
下面是事实和客户维度表之间的关系。
为了解决这个问题,引入了SCD类型4。在这个技术中,一个快速变化的列被移出维度并被移到一个新的维度表中。这个新的维度与事实表相连,如下图所示。
通过以上在数据仓库中实现第4类缓慢变化的维度,你将消除主要维度中不必要的体积。然而,你仍然有能力执行所需的分析。
SCD类型6
数据仓库中的第6类慢速变化维度是第2类和第3类SCD的组合。这意味着6型SCD在其实现中既有列又有行。
通过这个实现,你可以进一步提高数据仓库的分析能力。如果你想找出当前和历史职业之间的分析,你可以使用以下查询。
SELECT C.Occupation,C.CurrentOccupation,
SUM(SalesAmount) SalesAmount,SUM(TotalProductCost) TotalProductCost
FROM FactInternetSales F
INNER JOIN Dim_Customer C ON F.CustomerKey = C.CustomerKey
GROUP BY C.Occupation,C.CurrentOccupation
以上查询将提供以下结果。
如果没有类型6,数据仓库中的缓慢变化维度,就必须使用复杂的查询。
在Type 6 SCD中,不仅是当前职业,你也可以使用第一个职业,以便提供更多的分析。
结论
数据仓库中的缓慢变化维度被用来进行不同的分析。这篇文章提供了如何实现不同类型的慢速变化维度的细节,如类型0、类型1、类型2、类型3、类型4和类型6。类型2和类型6是数据仓库中最常使用的维度。