第二章:BI建模基础与维度建模理论

本章聚焦面试高频的维度建模核心概念:星型模型、雪花模型、缓慢变化维(SCD)及事实表分类。掌握这些理论,能帮助你在设计数据仓库时做出正确决策,并应对面试中的原理与场景题。

维度建模选择 星型模型(单表扩展) 雪花模型(规范化) SCD类型1/2/3 SCD类型1/2/3 事务事实表 周期快照事实表 累积快照事实表 无事实事实表

Q1:星型模型和雪花模型分别适用于什么场景?

面试官考察点:对两种模型优缺点的理解,能否根据业务需求做出合理选择。

回答框架:定义对比 → 适用场景 → 性能与维护权衡 → 实际案例。

简短示例回答:星型模型适用于查询性能优先的场景,如BI报表,因其维度表退化、查询简单。雪花模型适用于数据一致性要求高、存储空间敏感的OLAP场景,但查询需多表关联。某电商大促看板使用星型模型,将用户地址直接冗余存储,避免每次关联省份表。

可能追问:①实际项目中如何平衡规范化和性能?②雪花模型能自动优化吗(如物化视图)?③维度表太大时如何处理?

避坑提醒:不要只说“雪花模型更规范”而忽略性能代价;面试中可强调“星型模型是Kimball推荐的主流方案,雪花模型常用于可提前预关联的静态维度”。

Q2:缓慢变化维(SCD)有哪些类型?你如何选择?

面试官考察点:对SCD原理的掌握,以及在实际ETL中的处理经验。

回答框架:类型定义(1/2/3)→ 各自优缺点 → 选择依据(需求是否追溯历史、记录数)→ 混合策略。

简短示例回答:SCD1覆盖原值,用于不希望保留历史的属性(如手机号)。SCD2通过新增有效日期区间保留完整历史,用于需要追溯的维度(如岗位职级)。SCD3保留当前和上一个值的两字段,用于有限回溯(如“上一步地址”)。

可能追问:①SCD2如何避免数据爆炸?②拉链表与SCD2的区别?③如何用SQL实现SCD2的增量更新?

避坑提醒:别掉入“所有维度都用SCD2”的误区,面试官期待你指出:高基数且变化频繁的维度可用快照方式替代。

Q3:请列举事实表的分类,并说明各自典型用途。

面试官考察点:对事实表粒度和累积方式的理解。

回答框架:分类(事务/周期快照/累积快照/无事实)→ 粒度定义 → 典型场景 → 设计注意点。

简短示例回答:事务事实表记录单笔事件(如订单支付明细),粒度最细。周期快照事实表按固定周期汇总(如每月库存余额)。累积快照事实表记录生命周期(如订单从下单到签收各阶段)。无事实事实表用于关联维度但无度量(如用户-产品浏览记录)。

可能追问:①如何选择事实表类型?②累积快照事实表如何处理多状态更新?③无事实事实表如何与含度量的事实表配合?

避坑提醒:回答时强调“粒度决定事实表类型”,不要混淆周期快照与累积快照的本质区别(前者按时间周期,后者按流程状态)。

项目案例:某电商平台销售数据仓库建模

项目名称:电商销售分析数据仓库 V2.0 重构

业务背景:原存储过程直接关联交易库,报表响应慢(>30s),且历史维度无法追溯促销活动影响。

规模指标:日订单量500万+,维度表大小:用户表2亿行,商品表800万行;事实表日增量约3亿行。

技术栈:Hive + Spark(ETL)、StarRocks(查询引擎)、Airflow(调度)、Hadoop HDFS(存储)。

核心难点:①高基数用户维度采用SCD2导致拉链表膨胀,每日新增1.5亿行占分区;②促销活动重复计算同一商品;③多币种转换一致性。

面试高频追问:①拉链表如何做增量合并?②如何对StarRocks进行模型选择(主键模型 vs 聚合模型)?③如何处理SCD2与周期快照的冲突?

可迁移回答话术:“面对用户维度爆炸,我们采用拉链+增量快照混合策略:将‘是否活跃’标志放入SCD1字段,仅对活跃用户保留SCD2全历史,非活跃用户只保留最新记录,减少无效分区。促销模型用累积快照跟踪活动生命周期,避免重复计算。”

维度建模速查表

模型/概念核心特点适用场景示例
星型模型维度表退化,查询单层JOINBI报表、OLAP快速聚合销售订单模型:订单事实 + 用户/商品/时间维度
雪花模型维度表规范化,多表JOIN数据仓库基础层、一致性要求高商品维度 split 出品牌表、类目表
SCD类型1覆盖原值,无历史手机号、邮箱等不追溯属性用户手机号更新直接覆盖
SCD类型2新增记录+生效日期员工岗位、商品售价追溯拉链表记录每次薪级变更
SCD类型3双字段保留当前和上一个有限回溯(如“上次所处部门”)员工表中增加 pre_dept_name 列
事务事实表每行一笔事件支付记录、点击日志订单支付成功事实表(粒度:订单x支付时间)
周期快照事实固定周期汇总库存、余额、广告曝光量每日仓库库存快照表(粒度:商品x日期)
累积快照事实跟踪流程状态订单履行、工单处理订单生命周期表(含各阶段时间戳)

面试加分提示:在回答维度建模相关问题时,主动提及“我们使用了Kimball四步法(选择业务过程、声明粒度、确认维度、确认事实)”,并给出具体项目例子,显示系统性思维。