商务智能复习-Dimensional Modeling

核心概念与模型结构

基本组件

  • 事实表 (Fact Table)
    • 多维模型的核心,记录业务事件的度量值(可量化数据)。
    • 度量值:通常为数值型(可加、半加、不可加),是分析的对象。
    • 外关键字 (FK):连接维度表,组合构成事实表的主键。
    • 粒度 (Granularity):事实表中一行所代表的含义(如:每一笔POS交易中的单个商品条目)。
  • 维度表 (Dimension Table)
    • 入口:是用户查询、筛选和报表分组的“列”。
    • 属性:文本型或离散数据,提供描述性信息(如:日期、产品名、商店地址)。
    • 特点:列多行少(相对于事实表),属性高度反规范化。
  • 融合:通过外键将维度表和事实表连接起来(见下方的星型模型)。

常见模型架构

模型类型 特点 适用场景与优缺点
星型模型 (Star Schema) 事实表居中,维度表直接挂接(无中间层)。 优点:连接简单,查询性能高(低开销),支持物理加速。缺点:数据冗余大。
雪花模型 (Snowflake Schema) 维度表被进一步规范化(拆分为子维度表)。 优点:节省存储空间。缺点:表关系复杂,连接开销大,降低浏览性能。
星座/星系模型 多个事实表共享一组一致性维度表。 企业级数据仓库总线结构的基础,用于跨主题分析。

维度建模的四步设计过程

  1. 选取业务处理过程:确定分析的主题(如:零售营销、库存管理)。
  2. 定义粒度 (Defining Granularity):确定事实表中每一行代表什么(最关键的一步)。例如:是每个POS事务,还是每个POS事务中的单品?粒度越细,分析能力越强。
  3. 选定维度 (Choosing Dimensions):确定描述业务的环境(Who, When, Where, What, How)。
  4. 选定事实 (Identifying Facts):确定度量值(如:销售量、销售额、成本额)。

三种核心事实表模型 (案例:库存与订单)

根据业务需求,事实表可以分为三种类型,适用于不同的分析场景:

事务事实表 (Transaction Fact)

  • 粒度:每个事务事件一行。
  • 适用场景:记录离散的操作(如:每次商品出库、每次订单生成)。
  • 加载方式插入 (Insert)
  • 更新策略:不重新存取旧行。
  • 日期维度:包含事务发生日期
  • 示例:POS零售营销事务表(记录每笔销售)、库存事务表。

周期快照事实表 (Periodic Snapshot Fact)

  • 粒度:每段固定时间(如每天)一行。
  • 适用场景:记录规律性的状态(如:每日库存水平、银行账户每日余额)。
  • 加载方式插入 (Insert)
  • 更新策略:不重新存取旧行(但会不断插入新行)。
  • 日期维度:包含周期结束日期
  • 关键概念半加型事实
    • 含义:度量值只能在部分维度上相加。
    • 示例:“库存量”可以在“产品”或“商场”维度上相加,但不能跨越“日期”维度相加(1月1日库存 + 1月2日库存 无意义)。
    • 处理:对于不可加的度量值,通常采用平均、统计等方法。
  • 示例:商场库存周期快照、货栈库存周期快照。

累积快照事实表 (Accumulating Snapshot Fact)

  • 粒度:每个生命周期(如一个订单、一次装运)一行。
  • 适用场景:跟踪具有明确起止点的流程(如:订单从生成到发货、入库到出库的生命周期)。
  • 加载方式插入 (Insert) + 更新 (Update)
  • 更新策略:随着流程推进,不断地更新该行的状态与日期外键。
  • 日期维度:包含多个标准关键环节的日期(角色扮演维度:如订单日期、加工日期、装运日期、发票日期)。
  • 特点:事实表数据密集,能直观计算各环节的时间差(如:订购到发货延迟)。
  • 示例:仓库库存累积事实、订单作业累积事实。

三种模型对比总结

特征 事务粒度 周期快照粒度 累积快照粒度
代表的时间段 时间点 规律性可预见间隔 不确定时间跨度(短期)
事实表加载 插入 插入 插入与更新
事实行更新 不重新存取 不重新存取 任何时候都要重新存取
日期维度 事务发生日期 时间段终止日期 标准关键环节的多个日期
事实内容 事务活动 预定时间间隔的性能 给定生命期的性能

高级维度设计技巧

退化维度 (Degenerate Dimension)

  • 定义:维度表为空,具体的维度值(如订单编号、发票编号)直接存放在事实表中。
  • 作用:用于将事务细节分组,或反向连接回操作型系统。

杂项维度 (Junk Dimension)

  • 定义:将一堆低基数(取值少)、互不相关、且不方便归入其他维度的标志位(如:支付类型、订单类型、是否代办)组合成一个单独的维度表。
  • 目的:避免事实表膨胀(不加改变地留在事实表中)或维度表膨胀(每个标志建一个表)。

角色扮演维度 (Role-Playing Dimension)

  • 定义:同一个物理维度表在同一个事实表中被多次引用,扮演不同角色。
  • 实现:后台维护一个标准维度表(如日期表),前端通过建立多个视图 (View) 来区分不同角色(如:Order_Date_ViewShip_Date_ViewInvoice_Date_View)。
  • 优点:节省存储空间,保持一致性。

维度表的属性体系结构 (Attribute Hierarchies)

  • 反规范化 (星型):将体系的各个层级(如:SKU -> 小类 -> 大类 -> 部门)扁平化存入同一张维度表。
  • 规范化 (雪花型):将体系层级拆分为独立的维度表(如:产品维表、小类维表、大类维表)。
  • 选择标准:是否需要跨主题共享维度?如果是,建议适度规范化(雪花)以节省空间并便于共享。但为了查询性能,通常保持星型结构。

维度支架 (Dimension Outrigger)

  • 定义:从主维度表(如客户维度)延伸出一个次级维度表(如:县人口统计支架维度)。
  • 作用:用于连接低基数的属性集,或将外部数据(如人口统计数据)附加到现有维度上。
  • 特点:粒度与主维度不同,通过视图可隐藏使其在逻辑上像星型结构。

数据仓库总线与一致性 (DW Bus Architecture)

总线矩阵 (Bus Matrix)

  • 结构
    • :代表业务处理过程/主题(如:零售营销、库存快照)。
    • :代表共享的公共维度(如:日期、产品、商场)。
  • 作用:规划企业级数据仓库架构,明确哪些维度是在多个主题间共享的。

一致性维度 (Conformed Dimension)

  • 核心:跨主题共享的维度必须完全一致。
  • 特征
    • 一致的维度关键字。
    • 一致的属性列名、定义和值。
  • 层级
    • 原子型维度:最细粒度的定义(如:单个产品)。
    • 上钻维度 (Roll-up):原子型维度的子集(如:商标维度)。如果上钻维度是原子维度的严格子集,则视为一致。

一致性事实 (Conformed Fact)

  • 定义:在不同事实表(或数据备份)中,同一种度量值的定义、单位、计算方法必须保持一致。若无法一致,则需赋予不同名称。

客户关系管理 (CRM) 中的特殊问题

客户维度的特点

  • 行数极多:通常数百万行。
  • 属性极多:姓名地址解析(拆分为多个片段)、日期属性、分类属性、聚集属性。

渐变维度 (Slowly Changing Dimensions - SCD)

当维度属性值随时间发生变化时(如客户搬家、产品换部门),有几种处理策略:

类型 策略名称 做法 特点
Type 1 改写属性值 直接覆盖旧值 优点:简单;缺点:丢失历史数据,无法按旧属性分析历史事实。
Type 2 添加维度行 新增一行记录新值,旧行保留 优点:准确跟踪历史,保留历史一致性;缺点:维度表膨胀。
Type 3 添加维度列 增加一列保存旧值(如“前部门”) 优点:可查看新旧对比;缺点:只能保存最近一次变化,不可无限扩展。
Type 6 混合型 结合1+2+3 综合以上特点,对空间要求较高,但分析最灵活。

快变维度 (Rapidly Changing Dimensions)

  • 挑战:属性变化极快,用 Type 2 会导致维度表极速膨胀。
  • 解决方案:微型维度 (Mini-Dimension)
    • 将变化快的属性(如:年龄、收入等级、信用等级)剥离出来,形成独立的微型维度表。
    • 做法:将连续值离散化(如收入分为 5 个档次)。将每种属性组合作为一行。
    • 优点:独立于庞大的客户维度,查询性能高。

深度可变体系 (Variable Depth Hierarchy)

  • 挑战:组织结构或客户关系是树形结构,且层次深度不固定。
  • 解决方案:桥接表 (Bridge Table)
    • 在客户维度和事实表之间增加一张桥接表,记录父节点与子节点的关系。
    • 自顶向下:维度表对应父节点(查询下属)。
    • 自下向上:维度表对应子节点(查询上级)。

其他设计考虑

  1. 多货币与计量单位
    • 多货币:建立货币转换事实表,包含源货币、目标货币、兑换率和日期。
    • 多计量单位:在事实表中加入转换因子(如:盎司转磅),存储后在视图中计算。
  2. 事实表的规范化
    • 策略尽量避免将事实表拆分为多个单度量表。
    • 例外:当不同度量值的粒度不同时(例如:订单总折扣在标题级,而销售量在分列项级)。
    • 解决方案:尽可能将粗粒度事实向下分配(Assign)到细粒度,保持同一粒度。
  3. 实时分区 (Real-Time Partition)
    • 场景:在常规静态仓库前建立动态分区,以容纳当天/实时数据。
    • 三种形式:事务粒度、周期快照、累积快照。需保证与静态仓库的无缝连接。