京公网安备 11010802034615号
经营许可证编号:京B2-20210330
在数据仓库建设与商业智能分析体系中,维度建模是应用最广泛的建模方法论,而事实表与维度表是维度建模的两大核心构件,共同构成了数据分析的基础框架。不同于业务系统面向事务处理的表结构设计,数据仓库的表结构围绕 “分析决策” 设计,核心目标是支撑多维度、多角度的业务数据统计与洞察。很多初学者在入门数仓建模时,往往混淆两类表的定位、边界与设计逻辑,导致模型冗余、查询低效、统计口径混乱。本文将系统拆解维度表与事实表的核心定义、本质差异,结合电商订单经典场景给出完整可落地的建模案例,总结设计原则与常见误区,为数据仓库入门与实战提供标准化参考。
维度建模的核心思想是 “以业务过程为核心,用度量 + 描述的方式拆解业务数据”,由此衍生出事实表与维度表两类完全不同的表结构,二者各司其职、相辅相成。
事实表(Fact Table)是数据仓库的核心表,用于存储业务过程事件的量化度量数据,每一行对应一个独立的业务事件。事实表中存储的都是可聚合、可计算的数值型指标,也就是 “事实”,例如订单金额、销售数量、库存余量、访问时长、点击次数等。 事实表的核心特征是:数据量大、增长速度快、以业务事件为粒度、以关联维度的外键为核心结构。它本身不具备描述性信息,只存数值和维度 ID,所有的分类、筛选、标签属性都依托维度表提供。
维度表(Dimension Table)是事实表的附属描述表,用于存储业务事件的上下文属性信息,也就是我们观察数据的 “分析维度”。维度表中存储的都是描述性、分类性、标签性字段,例如日期、地区、用户属性、商品分类、渠道来源等。 维度表的核心特征是:数据量小、更新频率低、属性字段多、以单一主键为唯一标识。它是数据分析的 “视角入口”,所有的筛选、分组、标签拆解都依赖维度表实现,是实现多维度下钻、切片分析的基础。
两类表从定位、内容、结构到更新逻辑都存在本质区别,核心差异可通过下表直观对比:
| 对比维度 | 事实表 | 维度表 |
|---|---|---|
| 核心定位 | 存储业务度量值,是分析的计算对象 | 存储描述属性,是分析的筛选分组依据 |
| 数据内容 | 数值型指标(金额、数量、时长、次数等) | 文本 / 分类属性(名称、分类、等级、日期等) |
| 主键特征 | 一般为事件 ID,搭配多个维度外键 | 单一主键(维度 ID),唯一标识一条维度记录 |
| 数据量级 | 数据量大,随业务事件持续增长,是数仓的主体数据 | 数据量小,相对稳定,记录数远少于事实表 |
| 更新方式 | 增量插入为主,极少修改历史数据 | 缓慢更新为主,可新增、修改维度属性 |
| 典型场景 | 订单事实表、流量事实表、库存事实表 | 日期维度、用户维度、商品维度、地区维度 |
简单来说:事实表回答 “算什么”,维度表回答 “按什么算”。比如 “按月份统计各品类的销售额” 中,销售额是事实表的度量,月份和品类是维度表的属性。
我们以最通用的电商订单交易分析场景为例,完整展示事实表与维度表的设计逻辑、字段结构与关联方式,最终构成标准的星型维度模型。
业务场景:电商平台交易数据分析,需要支持按日期、用户、商品、地区四个维度,统计订单金额、订单量、商品数量、客单价等核心指标,支撑日常运营复盘与销售分析。 建模原则:以单条订单明细为事实粒度,搭建 1 张事实表 + 4 张维度表的星型模型。
表名:fact_order,粒度为 “单条订单商品明细”,每一行对应订单中的一个商品条目,所有外键关联对应维度表的主键。
CREATE TABLE fact_order (
order_detail_id BIGINT PRIMARY KEY COMMENT '订单明细ID(事实表主键)',
order_id BIGINT NOT NULL COMMENT '订单ID',
date_id INT NOT NULL COMMENT '日期维度外键',
user_id BIGINT NOT NULL COMMENT '用户维度外键',
product_id BIGINT NOT NULL COMMENT '商品维度外键',
area_id INT NOT NULL COMMENT '地区维度外键',
order_amount DECIMAL(10,2) NOT NULL COMMENT '商品订单金额(事实度量)',
product_num INT NOT NULL COMMENT '商品数量(事实度量)',
pay_amount DECIMAL(10,2) NOT NULL COMMENT '实付金额(事实度量)'
) COMMENT '订单交易事实表';
该表仅保留数值度量与维度关联 ID,无任何描述性文本字段,保证事实表的精简与高效。
表名:dim_date,是所有时间序列分析的核心维度,支持按年、季度、月、周、节假日等多粒度时间统计。
CREATE TABLE dim_date (
date_id INT PRIMARY KEY COMMENT '日期ID(格式:20240615)',
full_date DATE NOT NULL COMMENT '完整日期',
year INT NOT NULL COMMENT '年份',
quarter TINYINT NOT NULL COMMENT '季度',
month TINYINT NOT NULL COMMENT '月份',
week TINYINT NOT NULL COMMENT '周数',
weekday TINYINT NOT NULL COMMENT '星期几',
is_holiday TINYINT NOT NULL COMMENT '是否节假日:0否1是'
) COMMENT '日期维度表';
表名:dim_user,存储用户的属性标签,支持按用户特征分层分析。
CREATE TABLE dim_user (
user_id BIGINT PRIMARY KEY COMMENT '用户ID',
user_nickname VARCHAR(64) NOT NULL COMMENT '用户昵称',
gender TINYINT COMMENT '性别:0男1女',
age TINYINT COMMENT '年龄',
register_date DATE NOT NULL COMMENT '注册日期',
user_level VARCHAR(16) NOT NULL COMMENT '用户等级:普通/白银/黄金/钻石',
city VARCHAR(32) NOT NULL COMMENT '所在城市'
) COMMENT '用户维度表';
表名:dim_product,存储商品的分类、品牌等属性,支持按品类、品牌维度分析。
CREATE TABLE dim_product (
product_id BIGINT PRIMARY KEY COMMENT '商品ID',
product_name VARCHAR(128) NOT NULL COMMENT '商品名称',
category VARCHAR(32) NOT NULL COMMENT '商品品类',
brand VARCHAR(32) NOT NULL COMMENT '商品品牌',
price DECIMAL(10,2) NOT NULL COMMENT '商品售价',
on_shelf_date DATE NOT NULL COMMENT '上架日期'
) COMMENT '商品维度表';
表名:dim_area,存储行政区划信息,支持按地域层级下钻分析。
CREATE TABLE dim_area (
area_id INT PRIMARY KEY COMMENT '地区ID',
province VARCHAR(32) NOT NULL COMMENT '省份',
city VARCHAR(32) NOT NULL COMMENT '城市',
district VARCHAR(32) NOT NULL COMMENT '区县',
region VARCHAR(16) NOT NULL COMMENT '所属大区:华北/华东/华南等'
) COMMENT '地区维度表';
所有维度表通过主键与事实表的外键关联,形成以事实表为中心、维度表环绕的星型模型。实际分析时,通过 JOIN 关联维度表,即可实现多维度统计。 示例:统计 2024 年上半年,各大区每个月的家电品类销售额。
SELECT
d.month,
a.region,
SUM(f.order_amount) AS total_sales
FROM fact_order f
-- 关联日期维度,筛选时间范围
JOIN dim_date d ON f.date_id = d.date_id
AND d.year = 2024 AND d.month BETWEEN 1 AND 6
-- 关联商品维度,筛选家电品类
JOIN dim_product p ON f.product_id = p.product_id
AND p.category = '家电'
-- 关联地区维度,按大区分组
JOIN dim_area a ON f.area_id = a.area_id
GROUP BY d.month, a.region
ORDER BY d.month, total_sales DESC;
粒度优先原则。设计事实表首先确定粒度(如单条订单、单日汇总),粒度越细,分析灵活性越高,数据量也越大。
缓慢变化维适配。维度属性发生变化时,采用新增版本、覆盖更新等方式处理,保留历史分析的准确性。
维度属性塞入事实表。为了少写 JOIN 直接把商品名称、用户等级等属性放入事实表,会导致数据冗余、更新困难、口径不一致。
维度表过度拆分。将单一维度拆成多个子维度,形成雪花模型,增加关联复杂度,降低查询性能,多数场景星型模型更优。
事实表与维度表是数据仓库维度建模的基石,二者的分工与协作构成了数据分析的底层逻辑:事实表承载业务的量化价值,维度表提供分析的多元视角。事实表是数据仓库的骨架,决定了分析的粒度与度量范围;维度表是数据仓库的血肉,赋予了数据多维度解读的能力。
在实际建模中,遵循 “事实精简、维度丰富、粒度合理、口径统一” 的原则,结合业务场景设计适配的星型模型,既能保障查询效率,又能支撑灵活的多维度分析,为业务决策提供坚实的数据支撑。

数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
CDA数据分析师 出品 作者:李诗怡 一、数据处理概述 定义: 在正式开展数据分析之前,对原始采集的数据进行整理、修正、加工和精 ...
2026-11-06一、为什么数据要先标准化 拿到一份数据,各列的量纲往往完全不同:年龄单位是"岁"(约 20~60),收入单位是"元"(几千到几万) ...
2026-11-06一、为什么 Python 成了统计分析的主流工具 十年前做统计分析,主流选择是 SPSS、SAS、Stata。现在越来越多的研究者、分析师转向 ...
2026-11-06核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-11-06核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-11-06“大学生必备证书有哪些”最容易被答成一张越长越好的清单。但校招筛选的真实逻辑是:证书要对应你投的岗位任务,并且在校期间确 ...
2026-11-05大学期间能报的证书,先别急着看“含金量榜单”。更实用的第一步是问:我现在这个身份、这个学历,符合报考条件吗? 很多证书宣 ...
2026-11-05大学期间能考的证书很多,但真正需要先回答的是两个问题:当前有没有报考资格,以及这张证书对应什么岗位任务。 前者决定你能不 ...
2026-11-05先把结论说清楚:真正“只有在校大学生能考、毕业就彻底没资格”的证书数量不多,主要集中在语言类考试的部分专项、面向高校学生 ...
2026-11-05上班族问“考什么证书有用”,真正要解决的不是找一张“最值钱”的证,而是判断哪张证能嵌进你现有的岗位任务。同样一张证书,做 ...
2026-11-05职称证书不是统一的考试项目。同样“考职称”,经济、会计、统计、审计、软考走全国统一考试,工程、教师、卫生等系列多数走评审 ...
2026-11-0533岁选证书,最怕两件事:一是被“适合女生”的清单带着走,考完发现岗位用不上;二是投入大半年,报名时才发现学历、专业或工作 ...
2026-11-05“女生容易考的证书”这个问题,真正难的不是找一份名单,而是判断“容易”到底指什么。报名条件宽松、考试通过率高、拿证后能找 ...
2026-11-05“女生适合考什么证书”这类搜索,背后往往是同一个困惑:网上榜单太多,口径却说不清楚。有人把培训证书和职业资格混在一起排, ...
2026-11-05先把结论说清楚:没有一张证书对所有人都“又好考又实用”。同一个证,对在校生可能报名门槛都过不了,对有三年工作经验的人却只 ...
2026-11-05“考证书有哪些”这个问题,如果只想要一份名单,网上能搜到成百上千个。但真正有用的答案不是“有哪些”,而是“它们分别是什么 ...
2026-11-05“考什么证好一点”这句话,十个人问可能有十个意思。有人想问哪个证容易过,有人想知道哪个证找工作管用,还有人关心哪个证长期 ...
2026-11-05“考哪些证书最吃香”很难用一张榜单回答。同一张证书,在有的岗位是硬门槛,在另一些岗位只是加分项;对在校生和在职者的价值也 ...
2026-11-05家庭主妇能考的证书不少,但真正值得花时间的,不是“哪个证热门”,而是先确认你当前能不能报,再按每周可投入时间和未来出口缩 ...
2026-11-05“国家认证的职业技能证书”并不是某一本证书的正式名称,而是一句被大量使用的宣传口径。它可能指向人社部门的国家职业资格、备 ...
2026-11-05