数仓入门篇-维度模型与第三范式

简介: 第三范式(3NF)是关系数据库规范化核心标准,要求消除传递依赖,确保数据无冗余、“一事一地”。维度模型则面向分析优化,采用星型结构与反规范化设计,以牺牲存储换查询性能与业务可读性。二者各适其用:3NF用于OLTP系统保一致性,维度模型用于OLAP场景提分析效率。(239字)

什么是第三范式(3NF)?

概念背景

第三范式(Third Normal Form, 3NF)源于关系型数据库理论,由 E.F. Codd 提出,也是传统 OLTP(在线事务处理)系统(如 ERP、CRM)的标准设计方法。Inmon 学派主张在数据仓库中也采用 3NF 构建企业级数据仓库(EDW)。

核心原则

要满足 3NF,表结构必须依次满足以下三个条件:

  • 第一范式(1NF):列不可再分(原子性)。
  • 第二范式(2NF):非主键列完全依赖于主键(消除部分依赖)。
  • 第三范式(3NF):非主键列直接依赖于主键,不存在传递依赖(即:非主键列之间不能相互依赖)。

通俗理解:3NF 的核心目标是消除冗余,确保“一事一地”。每个事实只存储一次,通过外键关联来还原完整信息。

3NF 实例说明:电商订单系统

假设我们要存储“订单”、“用户”和“商品”的信息。

如果不遵循 3NF(存在冗余和传递依赖):

订单ID

用户ID

用户名

用户所在省份

商品ID

商品名称

商品类别

数量

金额

1001

U01

张三

广东

P01

iPhone

手机

1

5999

1002

U01

张三

广东

P02

耳机

配件

2

299

问题:如果张三改了名字,或者“广东”改为“广东省”,需要修改多行数据;如果删除了所有订单,张三的信息也就丢失了。

遵循 3NF 的设计(拆分为多个表):

表 A:用户表 (Users) - 存储用户属性

用户ID (PK)

用户名

所在省份

U01

张三

广东

表 B:商品表 (Products) - 存储商品属性

商品ID (PK)

商品名称

商品类别

P01

iPhone

手机

P02

耳机

配件

表 C:订单事实表 (Orders) - 仅存储交易过程和关联键

订单ID (PK)

用户ID (FK)

商品ID (FK)

数量

金额

下单时间

1001

U01

P01

1

5999

2026-03-01

1002

U01

P02

2

299

2026-03-02

优点:数据极度规范,无冗余,更新维护成本低(改用户名只需改一行),数据一致性高。
缺点:查询时需要大量的 JOIN 操作(订单表 JOIN 用户表 JOIN 商品表),对于海量数据分析,性能较差。


什么是维度模型(Dimensional Modeling)?

概念背景

维度模型由 Ralph Kimball 提出,专为 OLAP(在线分析处理)和数据仓库设计。它的核心目标不是消除冗余,而是优化查询性能提升业务可读性

核心结构:星型模型(Star Schema)

维度模型通常由两类表组成:

  • 事实表(Fact Table):位于中心,存储业务过程的度量值(如金额、数量)和外键。通常是窄而深的表。
  • 维度表(Dimension Table):围绕在事实表周围,存储描述性的文本属性(如谁、什么、哪里、何时)。通常是宽而浅的表。

核心原则反规范化(Denormalization)。为了减少 JOIN,允许维度表中存在冗余数据,甚至将层级结构(如 省->市->区)扁平化放在一张表中。

维度模型实例说明:电商销售分析

我们将上述 3NF 的例子转化为维度模型(星型模型):

事实表:销售事实表

销售ID

日期Key

用户Key

商品Key

销售金额

销售数量

1

20260301

101

501

5999

1

2

20260302

101

502

598

2

维度表:用户维度表- 包含冗余和层级

用户Key (PK)

用户ID

用户名

性别

年龄段

省份

城市

会员等级

注册日期

101

U01

张三

25-30

广东

深圳

黄金

2025-01-01

维度表:商品维度表

商品Key (PK)

商品ID

商品名称

一级类目

二级类目

品牌

单价

501

P01

iPhone

数码

手机

Apple

5999

502

P02

耳机

数码

配件

Apple

299

维度表:日期维度表

日期Key (PK)

完整日期

是否周末

是否节假日

20260301

2026-03-01

2026

Q1

3

1

20260302

2026-03-02

2026

Q1

3

2

优点:

  1. 查询极快:大部分查询只需要 Fact JOIN Dim 一次,甚至不需要 JOIN(如果指标都在事实表)。
  2. 业务易懂:业务人员看到 Dim_User 就能理解“广东深圳的黄金会员张三”,无需理解复杂的表关联逻辑。
  3. 支持切片/切块:非常适合按时间、地区、类别进行多维分析。

缺点:

  • 数据冗余大(例如“广东”在用户表中重复存储了多次)。
  • 数据更新复杂(如果“广东”改名为“粤”,需要更新大量行,通常使用缓慢变化维 SCD 技术处理)。

维度模型 vs 第三范式(3NF)对比

特性

第三范式 (3NF / Inmon)

维度模型 (Kimball)

核心目标

数据一致性、消除冗余、灵活适应未知查询

查询性能、业务易理解性、快速交付

数据结构

高度规范化,表多且细,关系复杂(雪花状或网状)

反规范化,表少且宽,结构简单(星型)

冗余度

极低(几乎无冗余)

高(故意保留冗余以减少 JOIN)

查询性能

。分析查询需要大量 JOIN,计算成本高

。JOIN 少,聚合速度快,适合 BI 工具直连

业务友好度

。业务人员难以理解复杂的表关联逻辑

。直观映射业务流程,业务术语清晰

数据更新

容易。修改一处即可同步全局

困难。需处理缓慢变化维(SCD),批量更新成本高


总结建议

存数据用 3NF(省空间、保一致),查数据用维度模型(跑得快、好理解)。

相关文章
|
4月前
|
SQL 数据采集 人工智能
别把数据中台做成“数据坟场”:聊聊企业数据中台架构的真实落地之路
别把数据中台做成“数据坟场”:聊聊企业数据中台架构的真实落地之路
388 4
|
5月前
|
存储 分布式计算 Java
PySpark入门教程(非常详细)从零基础入门到精通
本教程聚焦Spark Core核心原理,基于3.5.8版本,用Python详解RDD五大特性(分区、计算函数、依赖关系、分区器、首选位置)、容错机制、Shuffle、DAG调度及共享变量等,并通过WordCount实战演示。
665 4
PySpark入门教程(非常详细)从零基础入门到精通
|
分布式计算 Kubernetes Java
spark on k8s 镜像构建
spark on k8s 镜像构建
1105 0
|
存储 分布式计算 Hadoop
impala入门(一篇就够了)
impala入门(一篇就够了)
885 0
|
5月前
|
存储 分布式计算 OLAP
数仓-湖仓-湖流,人力家基于阿里云OpenLake架构演进与思考
人力家资深数据工程师石玉阳(Thorne),Flink-CDC Contributor,分享其公司湖仓一体实践:以Paimon为数据基座、StarRocks为OLAP引擎、Flink+Fluss实现湖流融合,打通离线/实时/增量计算,支持多模态与DATA+AI演进,构建开放、统一、可持续的大数据架构。(239字)
460 2
|
2月前
|
数据采集 运维 自然语言处理
2026年企业级BI系统建设方案落地实施,五大避坑指南与实施要点
本文为企业级BI系统建设提供完整指南,聚焦2026年数据驱动决策趋势,涵盖战略规划、数据治理、架构设计、安全权限四大顶层设计,并以瓴羊Quick BI为落地工具,详解数据集成、性能优化、自服务分析等实践路径;提炼五大避坑要点,助力企业将数据资产转化为真实竞争优势。(239字)
|
4月前
|
Ubuntu 机器人 API
【保姆级教程】OpenClaw多Agent部署路由实战指南:全平台部署+飞书群绑定+阿里云百炼API配置指南
2026年,OpenClaw的多Agent协同能力已成为核心竞争力——通过创建不同角色的Agent(如办公助理、技术支持、数据分析师),可实现“专人专事”的高效协作。但多数用户在落地时遭遇两大痛点:一是“身份错位”,Agent在飞书群等渠道回复时身份混淆,消息未路由到对应Agent;二是“配置失效”,手动添加字段导致Gateway报错,整个路由规则瘫痪。
2383 8
|
5月前
|
SQL 分布式计算 搜索推荐
Spark SQL练习2-电商用户行为分析
“**商城”电商平台需基于用户行为数据开展深度分析:一是计算用户活跃度趋势(含活跃天数、变化率及四类用户分层);二是构建RFM价值分层模型,量化R/F/M得分并划分高价值、潜力等四类用户;三是识别流失风险用户,分析其浏览时长变化与偏好品类。支撑精细化运营与精准营销。
253 1