缓慢变化维度处理技术

一、概念

  • 缓慢变化维度(SCD):这是一个针对于维度表定义的名词,指的是一些随着时间会发生变化的一些属性。

二、变化跟踪策略

不同的变化跟踪策略适用于不同的维度分析场景,以下类型没有好,更好,最好的区分。需要数据管理员结合当前业务过程和维度属性特征做选择。在这里,每种策略会分配一个SCD类型号,类型号是针对于维度属性而言,不是针对一张表,所以一张表内不同属性可以使用不同的SCD类型来跟踪变化。

  1. 类型0:保持原始值
    该类型表示维度表的属性绝对不会变化,如客户的原始积分,或者日期维度表的大部分属性

  2. 类型1:重写
    表示此种类型的属性在发生变化时,维度表会将该列更新为当前值。该属性始终反映最近的情况,下图的部门名称属性就属于类型1
    在这里插入图片描述

  3. 类型2:增加新行
    该类型是真正能反映历史变化的一种类型,在发生更新时,会新插入一条记录。并且针对每一条记录会有一列有效时间和一列失效时间来表示该条记录有效的时间范围。
    在这里插入图片描述
    这种类型不需要对事实表做任何处理。在不同日期产生的事实,会对应到在该日期生效的维度行中,并以该维度行的属性进行上卷。
    注意:类型2是精确跟踪缓慢变化维度属性的主要技术,因为新维度行能自动划分事实表的历史,因此这是一种非常好的技术

  4. 类型3:增加新属性
    当维度表需要关注变化过程的时候,比如,每一个维度属性发生重建时。比如地区划分,部门划分,类目划分。当重建这些体系的时候。有针对这些属性变更前和变更后对事实数据按这些属性上卷的分析和对比,用之前的处理方式就显得有些吃力。
    类型3的处理方式就是新增加一个字段,来记录历史属性,确保要么通过新的,要么通过旧的属性值来考察新的和历史事实表。
    在这里插入图片描述
    然而,针对不可预测的,频繁变化的属性值,这个方案是无能为力的。该类型适合于某个变化影响维度表中大量行的情况

  5. 类型4: 增加微型维度
    以上几种类型关注了维度表的缓慢渐进变化,但是当变化率加快的时候,特别是针对几百万,上千万行的维度表,使用之前的类型处理就会让浏览和查询性能变得极其低下。
    类型4的解决方案提供了一个新的维度来消除这些频繁变化的属性,这类维度叫做微型维度。例如,一个客户维度表含有年龄,消费水平,收入级别,购买频度这些频繁变化的属性,我们可以将这些属性抽象为一个人口统计维度。并将每一个属性划分成不同的范围,这个范围需要提前定义,因为之后要实现更细致的划分是很困难的。
    在这里插入图片描述
    上图是微型维度的简单表实现,相对于在维度表中跟踪历史所有的变化,这种方式将数据量缩减了成千上万倍。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例程序,用于演示如何使用缓慢变化维度(Slowly Changing Dimensions,SCD)来处理维度数据的变化: ``` -- 创建员工表 CREATE TABLE employee ( employee_id INT PRIMARY KEY, name VARCHAR(50), department_id INT, start_date DATE, end_date DATE, is_current_employee BIT ); -- 创建部门表 CREATE TABLE department ( department_id INT PRIMARY KEY, name VARCHAR(50) ); -- 创建 SCD2 类型维度表 CREATE TABLE employee_dimension ( employee_id INT PRIMARY KEY, name VARCHAR(50), department_id INT, start_date DATE, end_date DATE, is_current_employee BIT, effective_start_date DATE, effective_end_date DATE, version_number INT ); -- 插入初始的员工维度记录 INSERT INTO employee_dimension SELECT employee_id, name, department_id, start_date, end_date, is_current_employee, GETDATE(), '9999-12-31', 1 FROM employee; -- 创建存储过程来处理员工维度表的变化 CREATE PROCEDURE process_employee_changes @employee_id INT, @name VARCHAR(50), @department_id INT, @start_date DATE, @end_date DATE, @is_current_employee BIT AS BEGIN -- 禁用旧版本的记录 UPDATE employee_dimension SET effective_end_date = @start_date - 1, is_current_employee = 0 WHERE employee_id = @employee_id AND is_current_employee = 1; -- 插入新版本的记录 INSERT INTO employee_dimension SELECT @employee_id, @name, @department_id, @start_date, @end_date, @is_current_employee, GETDATE(), '9999-12-31', (SELECT MAX(version_number) + 1 FROM employee_dimension WHERE employee_id = @employee_id) END; -- 调用存储过程来更新员工维度表 EXEC process_employee_changes 1, 'John Smith', 2, '2022-01-01', '9999-12-31', 1; ``` 以上代码演示了一个简单的 SCD2 类型维度表设计和存储过程实现。在该示例,employee_dimension 表包含了员工维度数据的历史记录。当员工的信息发生变化时,存储过程会禁用旧版本的记录,并插入一个新版本的记录,保留员工信息的历史记录。这种方法可以让数据分析人员在进行分析时,能够追溯到过去的数据变化,更加准确地分析数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值