在数据仓库中实施缓慢变化的维度(SCDs)

73 阅读7分钟

简介

数据仓库中的缓慢变化维度是一个重要的概念,它被用来实现分析系统中数据的历史性。如你所知,数据仓库是用来分析历史数据的,它对存储数据的不同状态至关重要。

在数据仓库中,我们有事实表和维度表来存储数据。维度表是用来分析事实表中的措施的。在数据环境中,数据在操作数据库中启动,数据将被提取-转换-加载(ETL)到数据仓库以适应分析环境。

客户、产品是维度表的例子。这些维度属性会随着时间的推移而被修改,在数据仓库中,我们需要维护历史。在运营系统中,我们可能会覆盖修改过的属性,因为我们可能不需要数据的历史方面。由于我们在数据仓库中的主要目标是以历史的角度来分析数据,我们可能无法简单地覆盖数据,我们需要实施特殊的技术来维护历史,考虑到数据仓库的分析和数量方面。这个实现是使用数据仓库中的慢速变化维度完成的。

在讨论慢速变化维度(SCDs)的细节之前,让我们列出不同的慢速变化维度,如下表所示。

SCD类型

摘要

类型 0

忽略任何变化并审计变化。

类型1

覆盖更改

类型2

历史记录将被添加为新行。

类型3

历史将被添加为一个新的列。

类型4

一个新的维度将被添加

类型6

类型2和类型3的组合

现在让我们看看每个类型的缓慢变化维度。

SCD类型0

有些情况下,你会忽略任何变化。例如,当一个雇员加入一个组织时,有一些加入的相关属性,如加入的指定和加入日期等,不应该随着时间的推移而改变。

下面是关于数据仓库中缓慢变化维度的类型0的例子。

Type 0 Slowly Changing Dimensions in Data Warehouse

在上面的客户维度中,FirstDesignationJoinDateDateFirstPurchase是不会被更新的属性,这是类型0 SCD。

SCD类型1

在类型1的SCD中,你只需覆盖维度中的数据。可能会有这样的情况,当记录在维度中启动时,你没有全部的数据。例如,当客户记录被启动时,你可能没有得到所有的属性。因此,当客户记录在操作数据库中被启动时,客户记录中会有空的或空的记录。一旦ETL被执行,这些空记录将在数据仓库中被创建。一旦这些属性在操作数据库中被填充,就必须在数据仓库中更新。

如果现有的属性是空的,并且你从操作表中接收一个值,那么类型1 SCD就会被识别。

Type 1 Slowly Changing Dimensions in Data Warehouse

在上面的客户维度表中,客户CustomerKey11015和11019的AnnualIncome是空的。当这些记录在操作数据库中被更新时,这些值应该在数据仓库中被更新,而不考虑这些是历史值。

SCD类型2

数据仓库中的第二类慢速变化维度是数据仓库中最常用的维度。正如我们所讨论的,数据仓库是用于数据分析的。如果你需要分析数据,你需要适应数据的历史方面。让我们看看我们如何实现SCD类型2。

对于SCD类型2,我们需要包括另外三个属性,如StartDateEndDateIsCurrent,如下图所示。

Type 2 Slowly Changing Dimensions in Data Warehouse

在上面的客户维度中,有两条记录,让我们说客户代码为AW00011012的客户已经被提升为高级管理人员。然而,如果你简单地用新值更新记录,你将看不到以前的记录。因此,一个新的记录将被创建,有一个新的CustomerKey和一个新的 Designation。然而,其他属性将保持不变。

Implementation of Type 2 Slowly Changing Dimensions in Data Warehouse.

正如你在上图中看到的,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

一旦查询被执行,将观察到以下结果。

Sample dataset for the Type 2 SCD.

正如你所看到的,在上述结果中可以看到管理指定,这意味着它已经涵盖了历史方面。类型2 SCD是不能避免在数据仓库的维度表中使用代理键的实现方式之一。

SCD类型3

数据仓库中的类型3缓慢变化维度是一个简单的实现,历史将被保存在额外的列中。如果我们将我们在类型2 SCD下讨论的相同场景与类型3 SCD联系起来,客户维度将看起来像下面这样。

Type 3 SCD

正如你所看到的,数据的历史方面被保留为不同的列。然而,如果你想保留历史数据,这种方法将是不可扩展的。此外,这种技术将只允许保留历史的最后一个版本,与类型2 SCD不同。

通常情况下,这将更适合于实现雇员的姓名变更。在某些情况下,女性雇员在结婚后会改变她们的名字。在这种情况下,你可以使用类型3 SCD,因为这些类型的变化不会迅速发生。

SCD类型4

正如我们在SCD类型2中所讨论的,我们通过在维度中添加不同版本的行来维护历史。 然而,如果变化是快速的,类型2 SCD将是不可扩展的。

例如,让我们假设我们想根据客户以前的付款情况来保留客户的风险类型。因为这是一个与客户相关的属性,所以它应该被存储在客户维度中。这意味着每个月都会有一个新版本的客户记录。如果你有1000个客户,你将会看到每个月有12000条记录。你可以想象,这种在数据仓库中缓慢变化的维度是不可扩展的。

下面是事实和客户维度表之间的关系。

Schema design before implementing Type 4 SCD.

为了解决这个问题,引入了SCD类型4。在这个技术中,一个快速变化的列被移出维度并被移到一个新的维度表中。这个新的维度与事实表相连,如下图所示。

Schema design after implementing Type 4 SCD.

通过以上在数据仓库中实现第4类缓慢变化的维度,你将消除主要维度中不必要的体积。然而,你仍然有能力执行所需的分析。

SCD类型6

数据仓库中的第6类慢速变化维度是第2类和第3类SCD的组合。这意味着6型SCD在其实现中既有列又有行。

Sample dataset for Type 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

以上查询将提供以下结果。

Results with Type 6 SCD.

如果没有类型6,数据仓库中的缓慢变化维度,就必须使用复杂的查询。

在Type 6 SCD中,不仅是当前职业,你也可以使用第一个职业,以便提供更多的分析。

结论

数据仓库中的缓慢变化维度被用来进行不同的分析。这篇文章提供了如何实现不同类型的慢速变化维度的细节,如类型0、类型1、类型2、类型3、类型4和类型6。类型2和类型6是数据仓库中最常使用的维度。