数据仓库建模三大方法:维度建模、范式建模、Data Vault一次讲清

做数据仓库,绕不开三个词:

维度建模、范式建模、Data Vault。

很多人第一次接触,会把它们理解成三种“建表方式”。

事实表怎么建、维度表怎么拆、Hub和Satellite怎么设计……

但真正做到企业项目里会发现:

建模最重要的不是表长什么样,而是这套模型准备解决什么问题。

  • 业务部门希望数据更容易分析;
  • 数据团队希望业务关系表达准确;
  • 集团型企业还希望上游系统不断变化以后,历史数据依然能够完整保留下来。

目标不同,模型自然不同。

如果最近正在系统梳理数仓建设,我整理了一套《数据仓库建设解决方案》,里面涉及数据同步、ETL、实时链路、数仓建设等内容。建模并不是孤立存在的,模型设计完以后,数据怎么从业务系统进入数仓、怎样完成加工和分层,同样决定了这套架构最后能不能真正跑起来。

需要自取:数据仓库建设解决方案 - 帆软数字化资料中心

 

下面就从真实的数据仓库建设过程,看看维度建模、范式建模和Data Vault到底分别解决什么问题。


一、维度建模:先想业务以后要怎么分析

假设老板问:

为什么华东区这个月利润下降了?

真正开始分析时,我们通常会先看几个结果:

销售额、销量、成本、利润、毛利率。

然后继续往下拆:

时间、地区、渠道、客户、产品、门店。

这实际上就是维度建模最核心的逻辑:

把“发生了什么”和“从什么角度观察”分开。

前者叫事实,后者叫维度。

一张销售事实表里,可能保存:

订单ID、客户ID、商品ID、日期ID、门店ID、销售数量、销售金额、成本、利润。

客户、商品、日期、区域、门店,则分别形成维度表。

最终形成经典的:

事实表 + 维度表。

 

如果所有维度直接围绕事实表展开,就是星型模型;

如果产品继续拆成品类、品牌,地区继续拆成省、市、区,则可能进一步形成雪花模型。

为什么经营分析普遍喜欢这种方式?

因为它天然按照“业务问题”组织数据。

业务人员不会问:

“订单表和客户表应该怎么Join?”

他们真正关心的是:

哪个产品增长最快?哪些客户利润最低?哪个区域库存周转变慢?

维度模型实际上提前把这些分析路径整理好了。

但真正落地时,最容易被低估的反而是建模之前的数据准备。

订单在ERP,客户在CRM,商品在电商系统,组织信息又在OA。即使事实表和维度表已经设计得很完整,只要客户编码对不上、字段类型不一致、订单状态定义不同,最终模型依然建不稳。

因此落表之前,通常还要先完成:

数据接入 → 字段统一 → 清洗 → 关联 → 转换。

数据库、接口、文件等不同来源可以先汇入 FineDataLink 5.0,再沿着数据开发任务继续完成字段映射、多表关联和规则加工。等到数据真正写入事实表和维度表时,每个字段从哪里来、中间经过什么处理,会比后期依赖大量临时SQL重新拼接更容易管理。

 

这也是维度建模经常被忽略的一点:

模型只是最后看到的结构,前面的数据准备决定了这个结构能不能长期使用。

不过,维度建模也有边界。

它很适合分析,却不一定适合作为企业最底层的数据模型。

因为当业务关系越来越复杂、源系统越来越多时,事实表和维度表本身也可能不断变化。

所以维度建模主要解决的是:

怎样把数据组织成业务更容易理解和分析的样子。

 


二、范式建模:先把业务关系表达准确

如果目标从经营分析变成企业级数据底座,问题就不一样了。

假设一个订单业务涉及:

客户、订单、订单明细、商品、供应商、合同、组织、地址。

如果为了查询方便,把所有信息全部塞进一张宽表,很快就会出现大量重复。

一个客户产生1000笔订单,客户名称、地址、联系方式就可能重复1000次。

更麻烦的是:

客户地址发生修改以后,究竟应该修改哪一条记录?

这就是范式建模希望解决的问题。

它的核心原则是:

把不同业务实体拆开,减少数据冗余,再通过关系把它们连接起来。

最常见的是第三范式,也就是3NF。

 

简单理解:

  • 客户信息进入客户表;
  • 订单进入订单表;
  • 商品进入商品表;
  • 订单与商品的对应关系进入订单明细。

每张表尽量只描述一个明确的业务实体。

这样做的好处是:

结构严谨、重复更少、业务关系更加清晰。

所以范式建模经常出现在企业数据仓库核心层、主数据以及复杂业务关系沉淀场景。

但问题也随之而来。

结构越规范,分析可能越复杂。

一张销售经营报表,可能需要同时关联:

订单表、订单明细表、客户表、产品表、产品分类表、组织表、区域表……

底层关系很清楚,上层分析却可能面对大量Join。

所以范式建模和维度建模从来不是“谁取代谁”。

更常见的思路反而是:

底层把关系理清,上层再按照分析需要重新组织。

这也是很多企业会出现:

规范数据层 + 主题分析层

这种组合的原因。

 


三、Data Vault:为不断变化的系统留出空间

前两种模型还有一个很现实的问题:

如果源系统一直变化怎么办?

大型企业的数据环境很少长期保持不动。

  • 今年ERP升级;
  • 明年并购一家公司,多了一套CRM;
  • 后年客户编码规则调整;
  • 再过一年,商品、供应商甚至组织结构又发生变化。

如果核心数仓模型与某套源系统绑定得太紧,上游结构一变,下面几十张表可能都要重新调整。

Data Vault就是为了降低这种耦合。

它主要由三类结构组成:

Hub、Link、Satellite。

 

可以简单理解为:

Hub:记录“是谁”

保存稳定的业务对象及业务主键。

例如:

客户、订单、商品、员工。

Link:记录“谁和谁发生关系”

例如:

客户—订单;

订单—商品;

商品—供应商。

Satellite:记录“它在某个时间是什么状态”

客户名称、等级、地址、状态发生变化以后,不直接覆盖旧值,而是继续保存新的版本。

所以Data Vault特别强调:

历史可追踪。

普通模型可能只回答:

“这个客户现在是什么等级?”

Data Vault还希望继续回答:

什么时候发生变化?之前是什么状态?这条信息来自哪套系统?

这也是它常见于多系统整合、集团型企业、审计要求高以及长期历史留存场景的原因。

但模型设计了历史,并不意味着历史一定真的能够留下来。

假设客户上午还是普通客户,下午升级VIP,晚上又被调整成重点客户。如果同步任务每天只覆盖一次,最后可能只留下晚上的状态,中间发生的变化已经消失。

因此,低频基础数据可以周期更新,高频变化的订单、库存、客户状态则需要持续捕获增删改。FineDataLink 5.0 提供的全量、增量以及实时同步能力,在这里对应的是不同的数据变化方式:变化慢的按周期进入,变化快的持续捕获,再把这些记录送进后面的Hub、Link和Satellite。

 

否则就会出现一个很尴尬的问题:

Data Vault结构上保存历史,数据链路却根本没有把历史送进来。

所以Data Vault真正难的,从来不只是多建几张表。

而是数据团队必须从关注:

“现在是什么?”

进一步转向:

“它是怎样一步一步变成现在这样的?”

当然,Data Vault也有明显代价:

表数量多、结构复杂、直接查询困难。

所以它通常不会直接面向最终业务分析。

上层依然会继续加工成维度模型、宽表或者指标数据集。

Data Vault追求的不是让今天查数最简单,而是:

几年以后业务系统发生巨大变化,核心数据层仍然能够继续扩展。

 


四、三种模型到底差在哪里?

把三种方法放在一起看,会清楚很多。

对比项

维度建模

范式建模

Data Vault

核心目标

分析效率

业务关系严谨

历史与扩展性

典型结构

事实表+维度表

实体表+关系表

Hub+Link+Satellite

查询难度

较低

较高

高

数据冗余

相对较高

较低

中等

历史追踪

需要额外设计

需要额外设计

强

应对源系统变化

一般

一般

较强

常见位置

数据集市、分析层

核心数据层

企业历史数据层

换一种更简单的理解:

  • 维度建模关注:以后怎么查?
  • 范式建模关注:业务对象之间是什么关系?
  • Data Vault关注:这些关系和来源以后发生变化怎么办?

而真实项目里,数据也不会永远停留在某一种模型中。

底层可能按照范式或者Data Vault沉淀,到了销售主题,又需要把客户、订单、商品重新组织成事实表和维度表。

这里实际上发生了一次:

模型转换。

例如订单表、订单明细表、商品表,要重新加工成销售事实表;

散落在多个来源里的客户属性,也要整理成统一客户维度。

这一步如果只存在于架构图里,数仓依然跑不起来。多张表怎么关联、字段如何派生、哪些口径通过SQL计算、最终写到哪里,都需要转成真正的数据加工任务。

用 FineDataLink 5.0 把这些关联、转换、SQL处理和结果输出串起来之后,从核心模型到主题模型的加工过程就不再只是几根箭头,而是能够实际执行的数据链路。

 

所以数仓建模真正进入工程阶段以后,需要同时回答两个问题:

表应该怎么设计?

以及:

上一层的数据怎样稳定地变成下一层模型?

这两件事缺一不可。

 


五、企业到底应该怎么选?

真正成熟的数据仓库,很少从头到尾只使用一种建模方法。

更多时候是组合。

ODS:先尽量保留源系统数据

ERP是什么结构、CRM是什么结构,先把原始数据完整接进来。

这一层主要解决:

数据有没有进入平台。

核心数据层:统一业务关系

如果业务相对稳定,可以通过规范化方式整理客户、订单、商品等核心实体。

如果数据来源很多、变化频繁,又要求长期保留历史,可以进一步考虑Data Vault。

这一层解决的是:

企业数据到底是什么,彼此之间是什么关系。

主题数据层:转向业务分析

到了销售、财务、供应链、库存等主题,就可以重新构建事实表和维度表。

这一层开始回答:

业务以后准备怎么使用这些数据。

 

应用层:服务具体需求

继续加工:

宽表、指标表、标签表、算法特征、报表数据集。

数据到了这里,才真正直接面向应用。

所以很多企业常见的:

ODS → DWD → DWS → ADS

和维度建模、范式建模、Data Vault并不是一个概念。

分层解决“数据加工过程怎么组织”;

建模解决“某一层的数据关系怎么表达”。

但数仓真正运行半年、一年以后,还会出现第三个问题:

这些层之间还能不能看得懂。

一张订单源表增加字段,可能先影响ODS,继续影响DWD加工逻辑,再影响DWS主题表,最后甚至让ADS里的指标发生变化。

如果几十层加工全部散落在独立SQL、存储过程和临时脚本里,一旦数字异常,排查过程往往就是从最后一张表开始,一层一层人工往前翻。

因此数据从业务系统进入以后,经由 FineDataLink 5.0 完成同步、加工、转换再落入不同数仓层时,任务本身也在串联这些上下游关系。

到了模型调整或者指标异常时,排查的不再只是某张结果表,而是可以继续往前看数据经过了哪些处理、从哪张表流转而来。

 

这也是数据仓库从“第一版建设完成”进入长期运营以后,非常重要的一项能力。

因为真正困难的从来不是第一次把模型画出来。

而是半年、一年以后:

源系统变了、业务口径变了、模型也变了,这套数仓还能不能继续看懂、继续维护。

 


结语

最后,如果只记住一个判断逻辑,可以记住下面三句话。

业务更关心:

数据以后怎么分析?

重点理解维度建模。

数据团队更关心:

企业真实的业务关系是什么?

重点理解范式建模。

企业系统很多,而且还会持续变化:

历史怎么保留?新的数据源怎么继续接进来?

再考虑Data Vault。

真正成熟的数据仓库,也不是找一种“最先进”的建模方法套到底。

而是根据不同层次解决不同问题:

底层接住数据和变化,中间表达清楚业务关系,上层服务具体分析。

模型只是形式。

最终决定数仓质量的,是能不能把:

来源、关系、历史、加工和应用

真正串成一套长期可维护的数据体系。

posted @ 2026-10-03 00:09  智慧园区-老朱  阅读(2)  评论(0)    收藏  举报