数据仓库维度建模:缓慢变化维SCD类型3原理与实战版本控制

张开发
2026/4/3 19:02:56 15 分钟阅读
数据仓库维度建模:缓慢变化维SCD类型3原理与实战版本控制
数据仓库维度建模缓慢变化维SCD类型3原理与实战版本控制一、引言二、定义什么是缓慢变化维度SCD类型32.1 定义缓慢变化维度SCD2.2 定义SCD类型3双版本字段型三、核心原理SCD类型3版本控制流程图四、结构设计SCD类型3表结构规范4.1 设计规则4.2 标准表结构以用户维度为例五、实战演示SCD类型3实现版本控制完整步骤5.1 初始状态无变化5.2 第一次变化用户从「北京→上海」5.3 第二次变化用户从「上海→广州」5.4 第三次变化用户等级「普通→VIP」六、SQL实战SCD类型3更新语句6.1 城市变化更新SQL6.2 会员等级变化更新SQL七、SCD类型3版本控制核心特点7.1 特点一存储模式7.2 特点二版本保留规则7.3 特点三性能优势7.4 特点四适用场景七、SCD类型3 优缺点总结7.1 优点7.2 缺点八、SCD类型3适用场景必须掌握8.1 推荐使用场景8.2 不推荐使用场景九、SCD类型1/2/3 简易对比快速记忆十、总结结束语The Begin点点关注收藏不迷路一、引言在数据仓库维度建模中缓慢变化维度Slowly Changing DimensionSCD是处理维度表数据变化的核心技术而SCD类型3版本字段型是兼顾历史记录存储空间的经典方案广泛用于需要保留「上一版本当前版本」的业务场景。很多数仓开发新手对SCD类型3的原理、实现、适用场景理解模糊容易在维度变化时出现数据错误、历史丢失等问题。本文将从定义、核心原理、流程图、实战SQL、版本控制逻辑、优缺点六大维度深度解析SCD类型3手把手教你用它实现数仓维度版本控制。二、定义什么是缓慢变化维度SCD类型32.1 定义缓慢变化维度SCD缓慢变化维度指业务中不经常变化但会偶尔发生修改的维度数据如用户修改手机号、商品调整分类、员工更换部门等。2.2 定义SCD类型3双版本字段型SCD类型3通过在维度表中增加历史版本字段的方式分别存储当前值 上一个历史值实现简单版本控制。只保留当前版本 上一版本不保留全量历史不新增行只更新字段适合仅需追溯「上一次状态」的场景简单理解SCD类型3 一张表、一行数据、两个版本当前上一版三、核心原理SCD类型3版本控制流程图原始维度表包含当前版本字段业务数据发生变化如用户修改城市判断是否为变化字段将旧值写入【历史版本字段】将新值更新到【当前版本字段】完成版本控制保留当前上一版核心流程变化前 → 旧值移入历史字段 → 新值覆盖当前字段 → 一行数据保留双版本四、结构设计SCD类型3表结构规范4.1 设计规则保留原有主键ID保留当前版本字段如 city、user_level新增历史版本字段如 previous_city、previous_level一行数据永久对应一个维度实体不新增行4.2 标准表结构以用户维度为例字段名字段含义版本类型user_id用户ID主键固定不变user_name用户姓名固定不变city当前城市当前版本previous_city上一次城市历史版本user_level当前会员等级当前版本previous_level上一会员等级历史版本五、实战演示SCD类型3实现版本控制完整步骤5.1 初始状态无变化用户ID1001初始城市北京会员等级普通user_iduser_namecityprevious_cityuser_levelprevious_level1001张三北京NULL普通NULL初始时历史字段为NULL无历史版本5.2 第一次变化用户从「北京→上海」执行规则previous_city 旧值北京city 新值上海变化后结果user_iduser_namecityprevious_cityuser_levelprevious_level1001张三上海北京普通NULL5.3 第二次变化用户从「上海→广州」执行规则previous_city 上一版当前值上海city 新值广州变化后结果user_iduser_namecityprevious_cityuser_levelprevious_level1001张三广州上海普通NULL5.4 第三次变化用户等级「普通→VIP」执行规则previous_level 旧值普通user_level 新值VIP最终状态user_iduser_namecityprevious_cityuser_levelprevious_level1001张三广州上海VIP普通六、SQL实战SCD类型3更新语句6.1 城市变化更新SQL-- SCD类型3用户城市变化更新UPDATEuser_dimSETprevious_citycity,-- 旧值存入历史字段city广州-- 新值覆盖当前字段WHEREuser_id1001;6.2 会员等级变化更新SQL-- SCD类型3用户等级变化更新UPDATEuser_dimSETprevious_leveluser_level,user_levelVIPWHEREuser_id1001;七、SCD类型3版本控制核心特点7.1 特点一存储模式一行数据、双版本存储不新增行不扩展行数7.2 特点二版本保留规则仅保留「当前版本 上一个版本」无法保留更早历史如北京→上海→广州只保留广州上海更早版本会被覆盖丢失7.3 特点三性能优势无需JOIN多表查询速度极快存储空间占用极小7.4 特点四适用场景适合只需要查看上一次状态不需要全量历史追踪的业务。七、SCD类型3 优缺点总结7.1 优点结构简单易开发、易维护不增加行数表体积小、查询快存储空间最优无需大量冗余SQL逻辑简单执行性能高7.2 缺点只能保留上一版无法追溯全量历史历史会被覆盖无法查看更早数据灵活性有限不适合需要多版本分析的场景八、SCD类型3适用场景必须掌握8.1 推荐使用场景只需查看当前上一次状态的维度变化频率低、无需完整历史存储资源紧张、追求性能简单业务维度用户地址、会员等级、商品分类8.2 不推荐使用场景需要全量历史版本追踪审计、金融、合规等场景需要按历史时间切片分析推荐SCD类型2九、SCD类型1/2/3 简易对比快速记忆SCD类型处理方式历史保留行数变化类型1直接覆盖直接更新不保留历史无不变类型2新增行新增一行保留全历史全量历史增加类型3新增字段增加历史字段保留上一版仅上一版不变十、总结SCD类型3定义通过增加历史版本字段实现「当前值上一值」的版本控制。核心规则旧值移入历史字段新值覆盖当前字段一行双版本。版本控制能力仅保留上一版本更早历史会被覆盖。优势简单、高效、省空间劣势无法保留全量历史。使用建议不需要全量历史、追求性能的场景优先使用SCD类型3。结束语SCD类型3是缓慢变化维度中轻量高效的经典方案非常适合中小型数据仓库、简单维度变化管理场景。后续我将持续更新SCD类型2实战、全量历史追踪、数仓建模高级技巧欢迎关注、点赞、收藏The End点点关注收藏不迷路

更多文章