第二章:BI建模基础与维度建模理论
本章聚焦面试高频的维度建模核心概念:星型模型、雪花模型、缓慢变化维(SCD)及事实表分类。掌握这些理论,能帮助你在设计数据仓库时做出正确决策,并应对面试中的原理与场景题。
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全历史,非活跃用户只保留最新记录,减少无效分区。促销模型用累积快照跟踪活动生命周期,避免重复计算。”
维度建模速查表
| 模型/概念 | 核心特点 | 适用场景 | 示例 |
|---|---|---|---|
| 星型模型 | 维度表退化,查询单层JOIN | BI报表、OLAP快速聚合 | 销售订单模型:订单事实 + 用户/商品/时间维度 |
| 雪花模型 | 维度表规范化,多表JOIN | 数据仓库基础层、一致性要求高 | 商品维度 split 出品牌表、类目表 |
| SCD类型1 | 覆盖原值,无历史 | 手机号、邮箱等不追溯属性 | 用户手机号更新直接覆盖 |
| SCD类型2 | 新增记录+生效日期 | 员工岗位、商品售价追溯 | 拉链表记录每次薪级变更 |
| SCD类型3 | 双字段保留当前和上一个 | 有限回溯(如“上次所处部门”) | 员工表中增加 pre_dept_name 列 |
| 事务事实表 | 每行一笔事件 | 支付记录、点击日志 | 订单支付成功事实表(粒度:订单x支付时间) |
| 周期快照事实 | 固定周期汇总 | 库存、余额、广告曝光量 | 每日仓库库存快照表(粒度:商品x日期) |
| 累积快照事实 | 跟踪流程状态 | 订单履行、工单处理 | 订单生命周期表(含各阶段时间戳) |
面试加分提示:在回答维度建模相关问题时,主动提及“我们使用了Kimball四步法(选择业务过程、声明粒度、确认维度、确认事实)”,并给出具体项目例子,显示系统性思维。