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

首先说一下概念,缓慢变化维(Slowly Changing Dimensions)指的是:维度表里面的数据并非是始终不变的,总会随着时间发生变化:

假设我们有一张我们公司的销售员维度表如下,记录了每个销售员的一些基本信息,那么随着时间的变化销售员可能会在各省公司间调岗,如将周杰伦调入北京分公司,针对这种变化,业务系统会直接将业务数据库中周杰伦的地址直接update为北京,而不会考虑历史变化,不过在数据仓库中由于有时我们需要进行历史变化分析,或者防止销售数据记录错误,所以需要对这种变化进行相应的处理,主要有以下三种办法:

1、TYPE1

与业务数据保持一直,同样为直接update。这样就难以记录历史变化,如果周杰伦于15年7月调入北京,那么我们想要知道北京销售员在15年的销售数据时,就会将周杰伦的业绩算入北京分公司下,实际上周杰伦7月份以前的销售数据均应算在台北,所以为了避免这样的问题就有了TYPE2的处理方式。

2、TYPE2

保留历史变化,如下图:

不过带来一个问题,当事实表中的销售数据与此维度表进行关联时,由于存在customer_id的数据有两条100的,所以会关联出两个数据,这样是有问题的,那么就引入了一个代理键的概念,相当于数据仓库为维度表分配一个主键,而不用当初业务数据库中的主键,如下:

不过此时又带来了另外一个问题,当业务事实表中有新的销售业绩数据插入的时候,需要在外键列中插入维度表的dw_customer_id,那么此刻需要先找到维度表中的customer_id,然后再找到最大的dw_customer_id插入进去(因为主键往往是自增的,最大的肯定是最新的),但是某些情况下如果向事实表中插入历史数据的情况,就无法判断具体是哪个台北周杰伦还是北京周杰伦的业绩了,所以往往在维度表中同样加入时间列,如2000/1/1-2015/7/1来记录周杰伦在台北,而周杰伦在北京时间字段起始为2015/7/2,末尾时间字段可以记录空值或用9999/9/9替代,有新变化再进行更新。

3、TYPE3

有时需求中并非所有字段的变化都进行记录并且不需要每次变化都记录,比如我们可能只关心address(所在地)的最近两次变化,那么可以这样记录:

这样做只可以记录少量的变化次数,需要的话也可以相应加上时间列,这种方式一般用到的比较少,多数均为TYPE1,TYPE2,根据是否有必要记录历史变化进行选择。

时间: 2024-11-05 17:33:16

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

hive数仓中缓慢变化维

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

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

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

缓慢变化维 (Slowly changing dimension)

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

缓慢变化维解决方案

缓慢变化维解决方案   Slowly Changing Dimensions (SCD) are dimensions that have data that slowly changes. 缓慢变化维:数据会发生缓慢变化的维度就叫"缓慢变化维". 举个例子就清楚了: 在一个零售业数据仓库中,事实表保存着各销售人员的销售记录,某天一个销售人员从北京分公司调到上海分公司了,那么如何来保存这个变化呢?也就是说销售人员维度要怎么恰当的处理这一变化.先来回答一个问题,为什么要处理,或保存这一变

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

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

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

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

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

深入浅出数据仓库中SQL性能优化之Hive篇

转自:http://www.csdn.net/article/2015-01-13/2823530 一个Hive查询生成多个Map Reduce Job,一个Map Reduce Job又有Map,Reduce,Spill,Shuffle,Sort等多个阶段,所以针对Hive查询的优化可以大致分为针对MR中单个步骤的优化(其中又会有细分),针对MR全局的优化,和针对整个查询(多MR Job)的优化,下文会分别阐述. 在开始之前,先把MR的流程图帖出来(摘自Hadoop权威指南),方便后面对照.另

数据仓库中的 SQL 性能优化(Hive篇)

一个Hive查询生成多个map reduce job,一个map reduce job又有map,reduce,spill,shuffle,sort等多个阶段,所以针对hive查询的优化可以大致分为针对MR中单个步骤的优化(其中又会有细分),针对MR全局的优化,和针对整个查询(多MR job)的优化,下文会分别阐述. 在开始之前,先把MR的流程图帖出来(摘自Hadoop权威指南),方便后面对照.另外要说明的是,这个优化只是针对Hive 0.9版本,而不是后来Hortonwork发起Stinger