缓慢变化维解决方案

缓慢变化维解决方案


 

Slowly Changing Dimensions (SCD) are dimensions that have data that slowly changes.

缓慢变化维:数据会发生缓慢变化的维度就叫”缓慢变化维”。

举个例子就清楚了:

在一个零售业数据仓库中,事实表保存着各销售人员的销售记录,某天一个销售人员从北京分公司调到上海分公司了,那么如何来保存这个变化呢?也就是说销售人员维度要怎么恰当的处理这一变化。先来回答一个问题,为什么要处理,或保存这一变化?如果我们要统计北京地区或上海地区的总销售情况的时候,这个销售人员的销售记录应该算在北京还是算在上海?当然是调离前的算在北京,调离后的算在上海,但是如标记这个销售人员所属区域?这里就需要处理一下这个维度的数据,即我们缓慢变化维需要做的事情。

处理缓慢变化维一般按不同情况有以下几种解决方案:

一.  新数据覆盖旧数据

此方法必须有前提条件,即你不关心这个数剧的变化。例如,某个销售人员的英文名改了,如果你不关心员工的英文名有什么变化则可直接覆盖数据仓库中的数据。

 二.  保存多条记录,并添加字段加以区分

这种情况下直接新添一条记录,同时保留原有记录,并用单独的专用的字段保存区别。如:

(以下表格中Supplier_State表示上面例子中所属区域,为描述清晰,不用代理键表示)

添加是否可用来标识新旧数据:


Supplier_key


Supplier_Code


Supplier_Name


Supplier_State


Disable


001


ABC


Phlogistical Supply Company


CA


Y


002


ABC


Phlogistical Supply Company


IL


N

 

添加数据版本信息标记新旧数据:


Supplier_key


Supplier_Code


Supplier_Name


Supplier_State


Version


001


ABC


Phlogistical Supply Company


CA


0


002


ABC


Phlogistical Supply Company


IL


1

 

添加记录的生效日期和失效日期来标识新旧数据

 


Supplier_key


Supplier_Code


Supplier_Name


Supplier_State


Start_Date


End_Date


001


ABC


Phlogistical Supply Company


CA


01-Jan-2000


21-Dec-2004


002


ABC


Phlogistical Supply Company


IL


22-Dec-2004


 

 

空的End_Date表示当前版本数据,或者你也可以用一个默认的大时间 (如: 12/31/9999)来代替空值, 这样数据还能被索引识别到.

 

混合模式:

这种模式是以上几种模式的混合体,相对而言此种方法更全面,更能应对错综复杂且易变化的用户需求,也是较为常用的。

 


Row_Key


Supplier_key


Supplier_Code


Supplier_Name


Supplier_State


Start_Date


End_Date


Current Indicator


1


001


ABC001


Phlogistical Supply Company


CA


22-Dec-2004


15-Jan-2007


N


2


001


ABC001


Phlogistical Supply Company


IL


15-Jan-2007


1-Jan-2099


Y

        此种方法有以下几条优点: 

  1.  能用简单的过滤条件选出维度当前的值。
  2. 能较容易的关联出历史任意一时刻事实数据的值。
  3. 如果事实表中有一些时间字段(如:Order Date, Shipping Date, Confirmation Date),那么我们很容易选择哪一条维度数据进行关联分析。

其中Row_KeyCurrent Indicator字段是可有可无的,加上去更方便,毕竟维度表的数据都不大,多点冗余字段不占太大空间但能提高查询效率。

这种设计模式下事实表应以Supplier_key为外键,虽然这个字段不能唯一标识一条维度数据,从而形成了事实表与维表多对多的关系,因此在做事实和维度做关联时应加上时间戳字段(或Indicator字段)。

 三.  不同字段保存不同值

这种方法用不同的字段保存变化痕迹,但是不能象第二种方法一样保存所有变化记录,它只能保存两次变化记录.适用于变化不超过两次的维度。


Supplier_key


Supplier_Name


Original_Supplier_State


Effective_Date


Current_Supplier_State


001


Phlogistical Supply Company


CA


22-Dec-2004


IL

 四.  另外建表保存历史记录

 即另外建一个历史表来表存变化的历史记录,而维度只保存当前数据。

Supplier:


Supplier_key


Supplier_Name


Supplier_State


001


Phlogistical Supply Company


IL

Supplier_History:


Supplier_key


Supplier_Name


Supplier_State


Create_Date


001


Phlogistical Supply Company


CA


22-Dec-2004

 

这种方法仅仅记录一下变化历史痕迹,其实做起统计运算来还是不方便的。

五.保证事实表和维表的参照完整性

维度表如果保存多条记录,事实表需要做相应处理,来保证参照完整性

方案一:复合主键参照维度表

Supplier Dimension:


Version_Number


Supplier_key


Supplier_Code


Supplier_Name


Supplier_State


Start_Date


End_Date


1


001


ABC001


Phlogistical Supply Company


CA


22-Dec-2004


15-Jan-2007


0


001


ABC001


Phlogistical Supply Company


IL


15-Jan-2007


1-Jan-2099

 

Fact Delivery: (为描述清晰,同样不使用代理键标识维度)


Delivery_Key


Supplier_key


Supplier_version_number


Quantity


Product


Delivery_Date


Order_Date


1


001


0


132


Bags


22-Dec-2006


15-Oct-2006


2


001


0


324


Chairs


15-Jan-2007


1-Jan-2007

 Version_Number和Supplier_key可作为复合主键在两实体间建立链接,可解决事实表和维表多对多关系问题

方案二:在事实表参照维度表的代理键,解决参照完整性

Supplier Dimension:


Surrogate_key


Version_Number


Supplier_key


Supplier_Code


Supplier_Name


Supplier_State


Start_Date


End_Date


1


1


001


ABC001


Phlogistical Supply Company


CA


22-Dec-2004


15-Jan-2007


2


0


001


ABC001


Phlogistical Supply Company


IL


15-Jan-2007


1-Jan-2099

Fact Delivery:


Delivery_Key


Supplier _Surrogate_key


Quantity


Product


Delivery_Date


Order_Date


1


1


132


Bags


22-Dec-2006


15-Oct-2006


2


1


324


Chairs


15-Jan-2007


1-Jan-2007

 

 

时间: 2024-11-05 15:52:24

缓慢变化维解决方案的相关文章

OLAP --ODS 项目总结 -- 说说缓慢变化维

如果不是OLAP 系统或者BI系统,我们在生产环境下常遇到这样的问题 需要同步两个表.比如交通驾驶人,每个月需要同步. 表O_DRIVER_SOURCE 是来自第三方的源表,O_DRIVER_TARGET是本系统需要使用的目标表.现在需要同步这两个表很容易想到的 解决方案是 1.使用存储过程,有点复杂 2. merge into 语句 Merge into target O_DRIVER_TARGET Using O_DRIVER_SOURCE On ( O_DRIVER_SOURCE.driv

数据仓库专题(9)-缓慢变化维处理技术

一.案例描述 在一个零售业数据仓库中,事实表保存着各销售人员的销售记录,某天一个销售人员从北京分公司调到上海分公司了,那么如何来保存这个变化呢?也就是说销售人员维度要怎么恰当的处理这一变化. 先来回答一个问题,为什么要处理,或保存这一变化?如果我们要统计北京地区或上海地区的总销售情况的时候,这个销售人员的销售记录应该算在北京还是算在上海?当然是调离前的算在北京,调离后的算在上海,但是如标记这个销售人员所属区域?这里就需要处理一下这个维度的数据,即我们缓慢变化维需要做的事情. 二.解决方案 2.1

缓慢变化维 (Slowly changing dimension)

      维度建模的数据仓库中,有一个概念叫Slowly Changing Dimensions,中文一般翻译成"缓慢变化维",经常被简写为SCD.缓慢变化维的提出是因为在现实世界中,维度的属性并不是静态的,它会随着时间的流失发生缓慢的变化.这种随时间发生变化的维度我们一般称之为缓慢变化维,并且把处理维度表的历史变化信息的问题称为处理缓慢变化维的问题,有时也简称为处理SCD的问题. 个人感觉wiki上对缓慢变化维的定义比较详细,所以翻译此文并加入个人的观点看法.原文请参照 :http

DataStage系列教程 (Slowly Changing Dimension)缓慢变化维

BI中维表的增量更新一般有2种: Type 1:覆盖更改.记录的列值发生变化,直接update成最新记录. Type 2:历史跟踪更改.记录值发生变化,将该记录置为失效,再insert一条新的记录. 这两种其实都可以通过sql的left join来实现,不过DataStage给我们提供一个组件,可以很好的实现这个功能,这就是slowly changing dimension. 1 缓慢变化维表示例 如图1所示,是一个常用的缓慢变化维,该表的进数逻辑为: 当记录新插入到改表时,STARTDATE是

使用SSIS Slow Changing Transformation组件管理缓慢变化维

最近尝试用SSIS自带的 Slow Changing Transformation组件处理缓慢变化维,看到有一篇文章写的很详细,就按照步骤进行操作同时进行翻译.原网址来自:Managing Slowly Changing Dimension with Slow Changing Transformation in SSIS. 介绍 作为数据库专家或者ETL的开发者你可能偶尔会碰到需要维护和管理缓慢变化唯的场景.在SQL Server中有多种方法来实现,最简单的是使用SSIS 数据流组件中的Slo

关于数据仓库中缓慢变化维的总结

首先说一下概念,缓慢变化维(Slowly Changing Dimensions)指的是:维度表里面的数据并非是始终不变的,总会随着时间发生变化: 假设我们有一张我们公司的销售员维度表如下,记录了每个销售员的一些基本信息,那么随着时间的变化销售员可能会在各省公司间调岗,如将周杰伦调入北京分公司,针对这种变化,业务系统会直接将业务数据库中周杰伦的地址直接update为北京,而不会考虑历史变化,不过在数据仓库中由于有时我们需要进行历史变化分析,或者防止销售数据记录错误,所以需要对这种变化进行相应的处

hive数仓中缓慢变化维

像用户的手机号,居住城市这些维度会变化的场景,会对用户维度表里面的数据造成影响,这种情况叫做缓慢变化维度. 1.需要跟踪最新变化,就更新数据为最新 2.需要保存历史数据的话, 就可以将主键设置为dwid 添加一个列 对应数据有效值(标识开始和过期时间) 3.维度需要的比较少的话,可以直接增加历史对应维度列(适合较少的维度值和变化度) 原文地址:https://www.cnblogs.com/tangsonghuai/p/11443588.html

SSAS处理快速变化维(Quickly Changing Dimension)的一种思路

快速变化维(QCD)是相对于缓慢变化维(SCD)而言的,像[会员维度]里的[会员级别]这类变更不是很频繁的维度属性就属于SCD,而像[年龄].[最后交易日期]这类变更频繁的维度显然不能以SCD的思路去解决问题,SCD能处理的维度通常都在oltp库里通常会做Change_Log,例如会员升级降级的时间点会在生产库做记录,但像[年龄].[最后交易日期]这类维度如果也在oltp库做记录很快就会维度表爆炸,说到这里看官可能会对年龄这个维度有些疑问:为什么不用交易表里的交易时间来算“当时年龄”呢?不要着急

HIVE- SCD缓慢变化

SCD缓慢变化维,比如一个用户维表,用户属性会变化,但是不会变化很剧烈,可能一年只会变化一两次,也不会所有用户的属性都会有变化,只有少量的数据发生变化,所以叫缓慢变化维.这种问题就是由于维度的变化所造成的. 解决方式: 是否保留历史数据 保留多久历史数据 历史状态如何与事实表关联 SCD1 保留最新状态 注册日期 用户编号 手机号码 2019-01-01 0001 111111 2019-01-01 0002 222222 2019-01-01 0003 333333 2019-01-01 00