ZhangZhihui's Blog  

判断步骤

1️⃣ 看表内容

  • 属性字段多 → 倾向维度表

  • 指标字段多 → 倾向事实表

2️⃣ 看业务含义

  • 描述实体 → 维度表

  • 记录事件/交易 → 事实表

3️⃣ 看数据增长方式

  • 历史追溯 → 维度表可拉链

  • 新增为主 → 事实表

4️⃣ 看表粒度

  • 每条记录唯一描述一个实体 → 维度表

  • 每条记录唯一描述一次业务事件 → 事实表

 

1. 观察表的业务角色和数据粒度

  • 事实表(Fact Table)

    • 通常记录业务过程或事件(如销售、订单、库存变动)。

    • 表中的数据是 可度量的(measurable),如金额、数量、时间、成本等。

    • 数据通常具有 时间粒度,可能会随业务增长而快速累积。

    • 典型字段:order_id, amount, quantity, transaction_date

  • 维度表(Dimension Table)

    • 描述事实表的上下文或属性(如客户、产品、地区、时间)。

    • 表中的数据是 描述性的(descriptive),通常不会像事实表一样快速增长。

    • 典型字段:customer_name, product_category, region_name

思路:问自己 “这个表记录的是事件吗?还是描述对象的属性?”

  • 如果是事件 → 偏事实表

  • 如果是描述对象 → 偏维度表


2. 看主键和外键

  • 事实表

    • 通常包含多个外键(FK),指向维度表。

    • 主键可能是复合主键(多个维度 FK 的组合)或者一个业务生成的唯一 ID。

  • 维度表

    • 主键通常是单一的业务主键或代理键(Surrogate Key)。

    • 通常不包含指向其他表的外键(除了可能的层级关系,比如产品类别表指向上级类别表)。

例子

订单事实表(Fact_Sales):
- PK: order_id
- FK: customer_id, product_id, store_id
- Measures: quantity, total_amount

产品维度表(Dim_Product):
- PK: product_id
- Attributes: product_name, category, brand

3. 看表的字段类型

  • 事实表

    • 大量数值型字段(可加总、可度量)。

    • 时间字段通常很重要,用于分析趋势。

  • 维度表

    • 以文本、分类码、枚举字段为主。

    • 描述性字段占多数(如名字、类别、属性)。


4. 观察数据的增长和使用模式

  • 事实表

    • 数据量大,增长快,通常按时间追加。

    • 用于聚合、统计和分析。

  • 维度表

    • 数据量相对较小,增长慢。

    • 主要用于提供事实表分析的上下文信息。


5. OLTP 系统的提示

  • OLTP 系统中通常没有明确的“事实表”和“维度表”概念。

  • 可以通过 业务分析 来映射:

    • 找到 业务事件表 → 对应事实表

    • 找到 业务实体表 → 对应维度表


✅ 总结判断思路

判断点事实表维度表
数据内容 事件/事务/度量 描述/属性
主键/外键 复合主键或事件 ID;多个 FK 指向维度表 单一主键;通常无外键
字段类型 数值字段多;可度量 描述性字段多
数据量与增长 大且增长快 小且增长慢
时间粒度 通常有时间字段 通常没有或非关键

 

 

对于那些既有属性又有指标的表如何将其拆分为维度表和事实表?
 

明白了,你说的情况就是 混合型表,既有描述性字段(属性),又有可度量字段(指标)。在 OLTP 系统里很常见,比如 订单表 里既有 customer_nameproduct_name(属性),又有 quantityamount(度量)。在数据仓库建模中,需要 拆分成事实表和维度表 来满足星型或雪花模型的设计原则。下面我给你详细步骤。


1. 确定事实和维度的核心原则

  1. 事实表:

    • 记录业务事件或事务,每一行代表一次事件(transaction/event)。

    • 包含 度量(measures),如数量、金额、成本。

    • 包含指向维度表的外键(FK),而不是描述字段。

  2. 维度表:

    • 描述事实表中的对象(实体)。

    • 包含属性(descriptive attributes)和层级信息(hierarchy)。

    • 通常生成一个 代理键(surrogate key) 作为事实表的外键。


2. 拆分步骤

假设有一个 OLTP 表 Order

order_idorder_datecustomer_namecustomer_regionproduct_nameproduct_categoryquantitytotal_amount

步骤 1:识别“度量”和“属性”

  • 度量(Measures): quantity, total_amount → 放入事实表

  • 描述性字段(Attributes): customer_name, customer_region, product_name, product_category → 可以拆成维度表

  • 事件标识/时间字段: order_id, order_date → 属于事实表


步骤 2:定义维度表

客户维度表(Dim_Customer):

customer_id (PK)customer_namecustomer_region

产品维度表(Dim_Product):

product_id (PK)product_nameproduct_category

注意:维度表一般生成 代理键,用于事实表外键关联。


步骤 3:定义事实表

订单事实表(Fact_Order):

order_id (PK)order_datecustomer_id (FK)product_id (FK)quantitytotal_amount
  • 原来的描述性字段(名字、分类等)都替换为维度表的外键

  • 度量字段保留在事实表

  • 每行代表一个业务事件(订单)


步骤 4:处理层级和冗余属性

  • 如果维度表存在层级(如 product_category -> product_subcategory -> product_name),可做 雪花模型 或保留在维度表

  • 维度表可以保留冗余属性来方便分析,比如 customer_region 可以直接在客户维度表


3. 拆分策略总结

  1. 列分析:每列判断是度量还是属性

    • 度量 → 事实表

    • 属性 → 维度表

  2. 生成维度表:对描述性属性分组,生成独立维度表

  3. 生成代理键:每个维度表生成 surrogate key,用作事实表外键

  4. 重建事实表:保留度量、事件标识、时间字段和维度外键

 

posted on 2025-12-17 15:27  ZhangZhihuiAAA  阅读(4)  评论(0)    收藏  举报