缓慢变化维 (Slowly changing dimension)
维度建模的数据仓库中,有一个概念叫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)的更多相关文章
- 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)
开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...
- 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型及原型设计
在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库中?在数据 ...
- 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式
开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型 ...
- DataStage系列教程 (Slowly Changing Dimension)缓慢变化维
BI中维表的增量更新一般有2种: Type 1:覆盖更改.记录的列值发生变化,直接update成最新记录. Type 2:历史跟踪更改.记录值发生变化,将该记录置为失效,再insert一条新的记录. ...
- ODI 11g & 12c中缓慢变化维(SCD)的处理机制
缓慢变化维(Slowly changing Dimensions)指的是维表中的维度字段值会随着时间或业务调整,而在后续的分析中,历史数据仍然要使用旧的维度值,新的数据会使用当前维度值.在数据仓库建设 ...
- 如何用SQL语句处理缓慢变化维(渐变维,拉链表)SCD-2?
假设有一张居民维表,需要记录居民状态的变更历史,根据Kimball建模理论,设计居民维表如下: 另外在ODS中有居民信息的每日快照表(每天都记录一份居民的全量信息):O_USERINFO 如何将ODS ...
- HIVE- SCD缓慢变化
SCD缓慢变化维,比如一个用户维表,用户属性会变化,但是不会变化很剧烈,可能一年只会变化一两次,也不会所有用户的属性都会有变化,只有少量的数据发生变化,所以叫缓慢变化维.这种问题就是由于维度的变化所造 ...
- Data Flow ->> Slow Changing Dimension
这里简单讲下SCD 在讲之前贴上两个有用的链接地址.作者的两篇文件讲解了SCD是什么以及应用 http://www.cnblogs.com/biwork/p/3363749.html http://w ...
- DIV宽度自动缓慢变化
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
随机推荐
- 4.了解AngularJS模块和依赖注入
1.模块和依赖注入概述 1.了解模块 AngularJS模块是一种容器,把代码隔离并组织成简洁,整齐,可复用的块. 模块本身不提供直接的功能:包含其他提供功能的对象的实例:控制器,过滤器,服务,动画 ...
- @ResponseBody返回不能正确接收
Spring-MVC中@ResponseBody返回Bean到前台接收这么一串代码,还套着HTML标签: The resource identified by this request is only ...
- linux创建子进程--fork()方法
(1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下: #include <unistd.h> pid_t fork(void); 我们需要理解的是,调用一 ...
- 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...
- Peeking Iterator
Given an Iterator class interface with methods: next() and hasNext(), design and implement a Peeking ...
- 解读Unity中的CG编写Shader系列八(多光源漫反射)
转自http://www.itnose.net/detail/6117338.html 前文中完成最简单的漫反射shader只是单个光源下的漫反射,而往往场景中不仅仅只有一个光源,那么多个光源的情况下 ...
- ios 后台播放音乐1条注意事项
除了设置程序的后台模式,还需要几行代码 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory: ...
- 调试WebService
1.运行WebService的调用程序 2.浏览器中运行asmx,这一步是为了让w3wp.exe出现在下一步的列表中 3.“工具”或“调试”菜单-->附加到进程 (MS为什么把同一功能放在不同的 ...
- Struts2应用流程注解
当Web容器收到请求(HttpServletReques t)它将请求传递给一个标准的的过滤链包括(ActionContextCleanUp)过滤器. 经过Other filters(SiteMe ...
- 【编程题目】输出 1 到最大的 N 位数
65.输出 1 到最大的 N 位数(运算)题目:输入数字 n,按顺序输出从 1 最大的 n 位 10 进制数.比如输入 3,则输出 1.2.3 一直到最大的 3 位数即 999. 思路:肯定要考虑数字 ...