当前位置: 首页 > news >正文

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

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

概念背景

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

核心原则

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

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

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

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

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

如果不遵循 3NF(存在冗余和传递依赖):
订单ID用户ID用户名用户所在省份商品ID商品名称商品类别数量金额
1001U01张三广东P01iPhone手机15999
1002U01张三广东P02耳机配件2299

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

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

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

用户ID (PK)用户名所在省份
U01张三广东

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

商品ID (PK)商品名称商品类别
P01iPhone手机
P02耳机配件

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

订单ID (PK)用户ID (FK)商品ID (FK)数量金额下单时间
1001U01P01159992026-03-01
1002U01P0222992026-03-02

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


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

概念背景

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

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

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

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

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

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

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

事实表:销售事实表

销售ID日期Key用户Key商品Key销售金额销售数量
12026030110150159991
2202603021015025982

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

用户Key (PK)用户ID用户名性别年龄段省份城市会员等级注册日期
101U01张三25-30广东深圳黄金2025-01-01

维度表:商品维度表

商品Key (PK)商品ID商品名称一级类目二级类目品牌单价
501P01iPhone数码手机Apple5999
502P02耳机数码配件Apple299

维度表:日期维度表

日期Key (PK)完整日期是否周末是否节假日
202603012026-03-012026Q131
202603022026-03-022026Q132

优点:

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

缺点:

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

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

特性第三范式 (3NF / Inmon)维度模型 (Kimball)
核心目标数据一致性、消除冗余、灵活适应未知查询查询性能、业务易理解性、快速交付
数据结构高度规范化,表多且细,关系复杂(雪花状或网状)反规范化,表少且宽,结构简单(星型)
冗余度极低(几乎无冗余)高(故意保留冗余以减少 JOIN)
查询性能低。分析查询需要大量 JOIN,计算成本高高。JOIN 少,聚合速度快,适合 BI 工具直连
业务友好度低。业务人员难以理解复杂的表关联逻辑高。直观映射业务流程,业务术语清晰
数据更新容易。修改一处即可同步全局困难。需处理缓慢变化维(SCD),批量更新成本高

总结建议

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

http://www.jsqmd.com/news/470333/

相关文章:

  • 从“表奴”到“表达”:我用Kula AI和Gemini 3.1 Pro搞定月报的那点事儿
  • 开发 PHP 扩展新途径 通过 FrankenPHP 用 Go 语言编写 PHP 扩展
  • 专业人士是如何看待OpenClaw(龙虾)的?
  • 解密prompt系列. Agent实战:从搭建Jupter数据分析智能体
  • Java安装与环境配置
  • 工作常用ai
  • 在鸡哥x上安装Linux:Fedora 上手体验
  • Day3 完整学习包(原型 原型链)——2026 0312
  • Maxwell变压器有限元建模仿真教学指南:涵盖单相、三相、高频、分离及差动变压器等多类型仿真...
  • pwn练习笔记19-20
  • 【图像去噪】量子物理薛定谔方程解的自适应去噪(含 SSIM PSNR MMSE)【含Matlab源码 15147期】
  • 【Azure Container App】Debug Console的调试工具试验(三)--openssl/traceroute/ca-certificates/bind-utils/tcpping
  • Python代码如何加密之后再执行?
  • Adobe Dreamweaver 完整操作步骤(全版本通用)
  • 【VSCode学习02】 Visual Studio Code简介
  • 计算机毕业设计源码:基于Python的商品数据分析与随机森林销量预测系统 Django 可视化 数据分析 机器学习 爬虫 深度学习 大模型 大数据(建议收藏)✅
  • salesforce零基础学习(一百四十四)External Client App浅谈
  • mac电脑查看安装的mysql版本以及启动
  • 算法设计中的抽象数据类型与泛型思维的技术6
  • 第三方应用程序漏洞
  • 免费用上AI翻译!简约翻译 + Cerebras大模型,网页翻译从此告别机器腔— 全程零费用,5分钟搞定 —
  • CTFshow web入门 web1-10
  • PTA 2025年天体模拟赛L3-1 City不City (C++ 含代码解释)
  • 有效的字母异位词 - 题目笔记
  • 中控IFace考勤机二开内存问题解决方案
  • 【IEEE出版、连续五届EI稳定检索、211高校主办】第六届信号图像处理与通信国际学术会议(ICSIPC 2026)
  • 使用 C++、YOLO 和 ONNX Runtime 实现实时目标检测的完整教程整理与代码实现指南。
  • Flutter 三方库 graph_kit 的鸿蒙化适配指南 - 让逻辑治理回归“拓扑之美”,打造鸿蒙应用专家级的图算法与依赖治理中台
  • 教你如何用GPT-来分析你的dump文件定位内存泄漏问题——避免无效加班必备神器
  • 高可用高并发微服务架构设计:Nginx 与 API Gateway 的协同实践