维度建模的数据仓库中,有一个概念叫Slowly Changing Dimensions,中文一般翻译成“缓慢变化维”,经常被简写为SCD。缓慢变化维的提出是因为在现实世界中,维度的属性并不是静态的,它会随着时间的流失发生缓慢的变化。这种随时间发生变化的维度我们一般称之为缓慢变化维,并且把处理维度表的历史变化信息的问题称为处理缓慢变化维的问题,有时也简称为处理SCD的问题。

个人感觉wiki上对缓慢变化维的定义比较详细,所以翻译此文并加入个人的观点看法。原文请参照 :https://en.wikipedia.org/wiki/Slowly_changing_dimension

Type 0:

类型0是被动的 ,如果维度值变化了它也不会有任何的操作。维度值只会保留第一次插入的值。现在很少会用到了。

Type 1:

这种方法将覆盖旧与新的数据,并因此不会跟踪历史数据。

例如表supplier

Supplier_Key

Supplier_Code

Supplier_Name

Supplier_State

123

ABC

Acme Supply Co

CA

在上面的示例中,Supplier_Code 是默认的主键,Supplier_Key 是代理键。从技术上讲,代理键不是必要的因为存在独特的主键 (Supplier_Code) 。但是,为了优化联接的性能使用整数而不是字符键 (除非中字符的密钥的字节数小于整数键中的字节数)。

假设Supplier_State从CA调整到了IL,这条记录将会被覆盖:

Supplier_Key

Supplier_Code

Supplier_Name

Supplier_State

123

ABC

Acme Supply Co

IL

类型 1 方法的缺点是在数据仓库中就没有历史记录。然而它也有优势,它很容易维护。

如果你的事实表中存在着对State的聚合计算,那就需要在status变化时重新计算。

Type 2:

假设Supplier_State从CA调整到了IL,将会新建一条递增的version。

Supplier_Key

Supplier_Code

Supplier_Name

Supplier_State

Version.

123

ABC

Acme Supply Co

CA

0

124

ABC

Acme Supply Co

IL

1

 
另外一种实现方式是增加一个生效日期段。

Supplier_Key

Supplier_Code

Supplier_Name

Supplier_State

Start_Date

End_Date

123

ABC

Acme Supply Co

CA

2001-12-1

2015-4-2

124

ABC

Acme Supply Co

IL

2015-4-3

NULL

第二行中的结束日期为NULL,用来表示当前的版本。但是更为推荐的是使用一个不可及的日期作为结束日期,比如9999-12-31。 这样可以为该字段添加索引而提高查询性能,更不用在查询的过程中替换NULL值。

使用特定的代理键(Supplier_Key )的事务可以永久的绑定在维度表中的特殊时间段内。如果你的事实表中存在着对State的聚合计算,不需要重新更新。

Type 3

此方法跟踪使用单独的列的更改来保留有限的历史记录。类型 3 保留有限的历史,因为它仅限于指定用于存储历史数据的列数。在 1 型和 2 型的原始的表结构是相同的,但类型 3 添加了额外的列。在以下示例中,一个附加的列添加到表来记录Supplier_State的原始状态 。

Supplier_Key

Supplier_Code

Supplier_Name

Previous_Supplier_State

Effective_Date

Current_Supplier_State

123

ABC

Acme Supply Co

CA

2015-4-3

IL

这个用来记录当前的和最近一次的历史记录,不能记录更早值。

Type 4

Type4是使用历史表来储存历史记录。一个表用来存储现有的数据而添加一个历史表来记录变化数据。它们使用相同的代理键。

比如上面的例子,原来的表名为Supplier,历史表为Supplier_History.

Supplier表

Supplier_Key

Supplier_Code

Supplier_Name

Supplier_State

123

ABC

Acme Supply Co

IL

Supplier_History表

Supplier_Key

Supplier_Code

Supplier_Name

Supplier_State

Create Date

123

ABC

Acme Supply Co

CA

2015-4-3

此方法类似于数据库审计表和捕获更改数据技术功能。

缓慢变化维 (Slowly changing dimension)的更多相关文章

  1. 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)

    开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...

  2. 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型及原型设计

    在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库中?在数据 ...

  3. 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式

    开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型 ...

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

    BI中维表的增量更新一般有2种: Type 1:覆盖更改.记录的列值发生变化,直接update成最新记录. Type 2:历史跟踪更改.记录值发生变化,将该记录置为失效,再insert一条新的记录. ...

  5. ODI 11g & 12c中缓慢变化维(SCD)的处理机制

    缓慢变化维(Slowly changing Dimensions)指的是维表中的维度字段值会随着时间或业务调整,而在后续的分析中,历史数据仍然要使用旧的维度值,新的数据会使用当前维度值.在数据仓库建设 ...

  6. 如何用SQL语句处理缓慢变化维(渐变维,拉链表)SCD-2?

    假设有一张居民维表,需要记录居民状态的变更历史,根据Kimball建模理论,设计居民维表如下: 另外在ODS中有居民信息的每日快照表(每天都记录一份居民的全量信息):O_USERINFO 如何将ODS ...

  7. HIVE- SCD缓慢变化

    SCD缓慢变化维,比如一个用户维表,用户属性会变化,但是不会变化很剧烈,可能一年只会变化一两次,也不会所有用户的属性都会有变化,只有少量的数据发生变化,所以叫缓慢变化维.这种问题就是由于维度的变化所造 ...

  8. Data Flow ->> Slow Changing Dimension

    这里简单讲下SCD 在讲之前贴上两个有用的链接地址.作者的两篇文件讲解了SCD是什么以及应用 http://www.cnblogs.com/biwork/p/3363749.html http://w ...

  9. DIV宽度自动缓慢变化

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

随机推荐

  1. 14 BasicHashTable基本哈希表类(一)——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

  2. ssh免密码登入

    通常做许多事情(git puh/脚本等等),不停输入密码是件很不愉快的事情,破解如下: http://www.linuxproblem.org/art_9.html 1. 生成rsa密钥 ssh-ke ...

  3. iframe框架中用js改变父级Url

    <script type="text/javascript">        var path = window.location.href;//当前也面的跳转     ...

  4. python查找并删除相同文件-UNIQ File-wxPython-v6

    相比第一版,新增:菜单,对话框,文件过滤器,操作结果保存,配置功能(自己写了一个读写配置文件的功能),提示语优化,模块分化更合理. 截图: 源代码: UniqFile-wxPython-v6.py: ...

  5. fstream的使用方法介绍

    转载自:  fstream的使用方法介绍 - saga's blog - C++博客 http://www.cppblog.com/saga/archive/2007/06/19/26652.html ...

  6. 先进的React GUI编辑器 — Structor,所见即所得!

    先进的React GUI编辑器 — Structor https://helmetrex.com/ 手把手教你基于 ES6 架构自己的 React Boilerplate 项目 http://www. ...

  7. FindinFiles - Windows文件内查找插件

    FindInFiles for Windows 今天分享一个不错的插件工具:FindInFiles.如其名,其功能和Visual Studio的Ctrl+H快捷键类似,方便Windows使用者在资源管 ...

  8. Valentine's Day Round 1001.Ferries Wheel(hdu 5174)解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5174 题目意思:给出 n 个人坐的缆车值,假设有 k 个缆车,缆车值 A[i] 需要满足:A[i−1] ...

  9. 如何让VS2013编写的程序

    总体分c++程序和c#程序 1.c++程序 这个用C++编写的程序可以经过设置后在XP下运行,主要的“平台工具集”里修改就可以. 额外说明:(1)程序必须为Dotnet 4.0及以下版本.(XP只支持 ...

  10. Android实现Banner界面广告图片循环轮播(包括实现手动滑动循环)

    前言:经常会看到有一些app的banner界面可以实现循环播放多个广告图片和手动滑动循环.本以为单纯的ViewPager就可以实现这些功能.但是蛋疼的事情来了,ViewPager并不支持循环翻页.所以 ...