类型1变化
概念
当一个维度值的源发生变化,并且不需要再星型模式中保留历史时,通常采用的是类型1来相应变化情况。仅仅是使用变化的维度值即可。该技术通常应用于源数据元素是为了更正错误而发生更改的情况。
案例
重写维度值,如下所示:关于维度表Customer中Johnson Sue的生日发生了改变,采用类型变化1来处理。这个时候只是修改了维度表的数据,其他的没有发生改变。
采用类型变化1带来的影响是:先前的事实存在的环境发生了改变,所以在制作关于发生变化了的维度属性的报表时,可能出现前后不一致的状态。所以尽量避免使用类型1.
优势
对于做ETL过程来时是比较简单的,只需要将值进行修改即可。
劣势
不能够维护历史数据,数据元素的变化情况没有保存。从分析上看就是类型变化1只能够分析整个信息,
类型2变化
概念
类型2变化保存了变化的历史事实。描述变化前的事件和过去的值的关联,描述变化后的事实与将与新值关联。
案例
这里我们看到采用类型2变化的结果,客户Sue Johnson的地址发生改变(AZ->CA)采用变化类型2.在维度表中添加了新的一行。如果采用类型变化1,那么所有的订单就和现在的居住环境关联,而与以前的没有关系。如果想查看变化前的订单与居住环境的关联是不行的。
优势
保留了历史事实,过去的事实只与过去的环境进行关联,现在的事实只与现在的环境进行关联。
劣势
在进行ETL过程中需要添加新的行,而且在通过上例中的Customer_ID来进行分组时,需要使用distinct来处理。虽然变化类型2保存了事实的历史环境,但是未能保存维度历史。容易发现给定的某一个自然键在维度表中有多条记录表示,但是却并不知道什么时候采用哪条记录才是合适的。此类信息仅仅以事实的形式展示。所以为了解决这个问题,有时采用时间对的方式,添加两列:开始时间和结束时间。
类型3变化
概念
在大部分的情况下,可以采用类型1变化或者类型2变化来解决问题,但有的时候需要采用类型3变化来解决。当需要分析所有伴随着新值和旧值的变化前后记录的事实时,需要采用类型变化3来解决,而不是采用类型变化1或者类型变化2。
主要是要研究两个方面的需求:
1)分析所有事实的能力,使用新值记录变化发生前后的情况
2)分析所有事实的能力,使用旧值记录变化发生前后的情况
对于上述两个需求,单独使用类型变化1或者类型变化2都不能满足需求。
案例
在上述案例中,我们可以看到:客户的地址分配从开始的East变为了Northest和Southest。我们添加了两列,一列记录了先前的地址情况,一列是变化后的地址情况,那么进行分析的时候就可以完全顾及到上面所提出的所有需求。
在上面中region_current始终保持的是最新的值,和类型变化1是一样的。
类型3一般使用在选区和地理重划上,在金融和会计分组也常常采用类型变化3.
优势
采用类型变化3可以做重复的过程。在本例中我们使用了两列来保留历史的情况,如果Robert Davis的区域继续改变,那么这两列继续调整,但是最开始的版本将会不复存在。所以为了弥补这个情况,我们可以设置多列来解决。
比如:region_current /region_last_year/region_two_years_ago等等。
劣势
类型变化3不保留事实的历史内容,我们无法通过类型变化3来确定一个事实的发生的确切环境。比如:我们无法确定当产生一个特殊订单是Robert Davis 是属于哪个区域的。这个时候可以结合类型变化2.将会结合类型变化2和类型变化3。
类型1/2缓慢变化
概念
因为一些特殊的需求,我们需要将类型1和类型2结合使用。考虑以下需求:当需要设计一个星型模型来跟踪一个订单,这个时候客户的名称不是个人而是公司,而公司的名称是会发生改变的。如果在分析中总是使用公司的最新的名称来使用,那么我们将采用类型变化1,但是如果我们需要考虑在订单生效的时候的公司的名称,那么我们就不能单纯的采用类型变化1或者类型变化2了,
当发生变化的数据的需求导致类型1和类型2变化。这个时候可以提供一对属性来解决,每个属性有相同的来源,但是一个对应的是类型变化1,而另外一个是采用的类型变化2.
案例
我们在分析的时候就可以如下方式:
优势
混合相应是可以重复的,可以记录连续的变化情况。只有在真实的分析需求时候才能实施混合变化,操作型报表可以使用操作型的系统来使用。
劣势
加重了ETL过程,复杂性增加了ETL工作量也降低了可用性。需要确保任何解决方案对需求来说都是切实可行的。
总结
1)在类型2中,我们通过添加时间戳的方式来展开针对维度的时间点的分析。
2)类型3变化提供了历史情况的不同方面。
3)混合的类型1和类型2变化同时结合类型1和类型2变化。
4)类型1变化总是保存最新的值
5)类型2使用最新的值去分析最新的数据,而使用旧值去分析以前的数据。
6)类型3使用最新的值分析所有的数据,同时也可以使用旧值去分析所有的数据。