缓慢变化维

顾名思义,缓慢变化维(Slowly Changing Dimension, SCD)就是变化相对缓慢(相对与快速变化的事实表来说)的维度。在现实世界中,维度的属性并不是静态的,它会随着时间流逝发生缓慢的变化,这种随着时间会发生变化的维度我们一般称为“缓慢变化维”,并且把处理维度表的历史变化信息的问题称为处理缓慢变化维的问题,有时也简称为“处理SCD的问题”。

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

对于同一维度中属性的变化,采用不同的变化跟踪技术是很常见的。在维度建模理论中,有8种处理方式,包括基础的5种以及混合的3种;在大数据时代有2种极限型处理方式;总共10种处理方式

1 基础型

1.1 type0: 原样保留

对于某些维度属性,值不会发生变化,因此可以保留初始值。此方法什么也不做,因此称为 type0。例如日期维度的大多数属性,值都不会发生变化,如月份、季度、是否节假日等属性。 除不会发生变化的维度属性可使用 type0 外,对于只关心初始值的维度属性也可使用此处理方式。如商品上架售卖时间:一个商品上架售卖后可能由于缺货下架,补充库存后又再次上架,这种情况会产生多个商品上架售卖时间,如果重点关注的是商品首次上架售卖时间,则采用 type0;类似的还有商品所属供应商,虽然随着时间推移,某商品可能从最开始的a供应商供货转移到b供应商供货,但是如果我们关注的是原始最初供应的供应商,也采用 type0.

1.2 type1: 重写

该类型和业务系统保持一致,直接update,将维度属性修改为最新值,直接覆盖原有的值,不保留历史信息。该类型总是反映最近的情况,会破坏历史情况,因此适合业务只关心最新属性值、不关心历史信息的情况。例如,某个销售人员的英文名改了,如果你不关心员工的英文名有什么变化则可直接覆盖(修改)数据仓库中的数据。

我们以商品维度为例: 维度属性值变化前:

商品键 品类
SPU001 科技

维度属性值变化后:

商品键 品类
SPU001 教育

1.3 type2: 增加新行

在维度表中增加新的一行,新行中采用新的属性值。此方式及其变种是处理缓慢变化维的主要技术。这种方法需要维度主键更具一般性,若仅采用自然键/持久键,则会出现多行描述同一成员的情况,即主键不唯一。因此这种方法需要借助代理键,在为维度成员建立新行时,为其分配新的主代理键,将其作为事实表的外键。

现在每条数据都唯一,但又一个问题,现在不知道哪个是当前在用的数据,虽然可以通过代理键找最大的(因为主键往往是自增的,最大的通常是最新的数据),但某些情况下要插入历史数据就不好找了,所以在维度表中加入时间序列,用NULL或者很大的时间(如2999-12-31)来标识哪条是当前最新数据,有变化再进行更新。

此方法一般需要新增 3 列:1) 行生效日期/时间戳 2) 行截止(失效)日期/时间戳 3) 当前行标识(也可不使用当前行标识,由失效日期来判断是否是当前行);在某些情况下,也可增加列: 版本。

我们仍以商品维度为例: 维度属性值变化前:

商品键(代理键) 商品键(自然键) 品类 行生效日期 行失
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值