很多人第一次接触数据建模,首先想到的是: 事实表、维度表、主键、外键、星型模型、宽表、ODS、DWD、DWS…… 名词很多,看起来也很技术。 但真正做过企业数据项目之后就会发现: 数据建模最难的,从来不是怎么建表,而是怎么把现实中的业务,翻译成一套稳定、统一、可计算的数据结构。 换句话说: 数据建模,本质上是在给现实业务建立一套数字表达规则。 这套规则设计得好不好,会直接影响后面的指标口径、BI报表、经营分析,甚至智能问数和AI应用到底准不准。 所以理解数据建模,不能只从"表"开始。 要先从业务开始。
一、数据建模,建的不是表,而是业务世界 假设一家制造企业每天都在发生各种业务: 客户下单、销售签合同、仓库发货、采购入库、生产领料、财务回款…… 这些事情在现实世界里很清楚。 但进入系统以后,它们会变成一堆数据: 订单号、客户编码、物料编码、数量、金额、部门、业务员、日期、状态…… 真正的问题是: 这些数据应该怎么组织? 比如: 销售额到底按订单算,还是按发货算? 一个订单包含10个产品,一行数据应该代表一个订单,还是一个订单明细? 客户名称修改以后,历史数据要不要跟着变化? 销售负责人调整以后,去年的业绩应该归给谁? 这些问题,本质上都不是数据库问题。
而是: 业务应该如何被数据描述。 所以真正的数据建模,通常是在回答五个问题: 企业里有哪些业务对象? 这些对象之间是什么关系? 企业每天发生了哪些业务事件? 一行数据到底代表什么? 最终要从哪些角度分析这些数据? 整个过程可以理解为: 现实业务 → 业务对象 → 业务事件 → 数据粒度 → 维度与指标 → 数据模型 这才是数据建模真正的底层逻辑。
二、第一步:先找到"业务对象" 建模的第一步,不是建表。 而是找对象。 企业经营过程中存在大量相对稳定的对象,比如: 客户、供应商、商品、物料、员工、部门、工厂、仓库、设备、项目。 这些对象本身并不是一笔业务,而是长期存在的实体。 比如: "客户A"是一个业务对象。 "客户A在8月购买了100万元产品",才是一件业务事件。 这两类信息在模型中的角色完全不同。 前者通常会变成: 维度。 后者通常会变成: 事实。 所以数据建模最基础的一层逻辑,就是: 先搞清楚"谁",再搞清楚"发生了什么"。
三、第二步:找到真正的"业务事件" 企业真正需要分析的,其实都是一件件业务事件。 比如: 客户下单 商品出库 采购入库 生产领料 客户回款 产品退货 设备停机 每一类事件背后,都对应一个业务过程。 例如销售业务就可能包含: 商机 → 合同 → 订单 → 发货 → 开票 → 回款 建模时,必须先把这些过程拆开。 因为订单、发货、开票、回款,看起来都属于销售,但它们实际上是不同的业务事实。
如果全部混在一起,很快就会遇到一个问题: "销售额"到底指哪个销售额? 是订单金额? 发货金额? 开票金额? 还是财务确认收入? 所以成熟的数据模型,一定要先明确: 这一张事实表,描述的到底是哪一个业务过程。 很多企业的问题不是没有数据,而是数据搬过来以后,没有重新按照业务过程组织。 比如通过 FineDataLink 把ERP、CRM、MES等系统的数据统一同步到数仓,这解决的是数据进得来的问题。 但数据进来以后,仍然需要建模。 否则只是把业务系统里的复杂表结构,从原系统搬到了数据仓库。
四、第三步:数据建模最重要的是"粒度" 如果只记住数据建模中的一个概念,我建议记住: 粒度 所谓粒度,就是: 一行数据到底代表什么。 比如一张销售表。 可以是: 一个订单一行。 也可以是: 一个订单明细一行。 甚至可以是: 一个订单明细批次一行。 这几种设计看起来只是多几行少几行,但分析能力完全不同。 假设一个订单金额100万元,其中: 产品A 60万元 产品B 40万元 如果按照订单粒度记录:
你可以分析客户销售额。 但没办法准确分析不同产品的销售金额。 如果按照订单明细粒度记录:
就可以继续按照产品分析。 所以: 粒度决定了数据模型能够回答什么问题。 粒度太粗,分析能力不够。 粒度太细,数据量和模型复杂度又会增加。 因此数据建模,本质上也是在寻找: 最适合业务分析的记录颗粒度。
五、为什么星型模型这么常见? 理解了事实和维度,星型模型就很好理解了。 中心是一张: 事实表。 周围是一圈: 维度表。 例如销售模型可以是: 时间维度 | 客户维度 —— 销售事实表 —— 产品维度 | 区域维度 | 组织维度 事实表负责记录: 订单、数量、金额、成本等业务事件。 维度表负责记录: 客户是谁、产品属于什么类别、组织属于哪个区域、业务发生在哪一天。 所以星型模型并不是为了画得像一颗星。 而是因为企业分析天然就是: 一个业务事实 + 多个观察视角。
六、数据建模其实还在做一件更重要的事:统一业务语言 很多企业的数据问题,看起来是技术问题。 实际上是: 业务口径不统一。 比如经营会上: 销售部门说本月销售额1.2亿元。 财务部门说只有9600万元。 运营部门又说系统里是1.08亿元。 三套数据可能都没有算错。 只是因为: 销售按订单统计。 运营按发货统计。 财务按收入确认统计。 真正的问题不是系统算错了,而是: "销售额"到底是什么,没有定义清楚。 所以成熟的数据建模,不能只定义表结构。 还必须同步定义: 业务口径。 比如: 订单金额 发货金额 开票金额 含税收入 不含税收入 确认收入 必须区分开。 这也是为什么企业做到一定阶段以后,会开始建设: 指标体系、数据标准、主数据、数据字典。 因为企业最终需要解决的,不只是: 数据在哪里。 更重要的是: 同一个业务概念,在整个企业里是不是只有一种解释。
七、为什么不能直接拿业务系统的表来分析? ERP里已经有订单表。 CRM里已经有客户表。 MES里已经有生产表。 为什么还要建模? 原因很简单: 业务系统和分析系统的设计目标不同。 业务系统是为了完成交易。 比如ERP关注的是: 订单怎么保存、审批怎么流转、库存怎么扣减、凭证怎么生成。 而数据分析关注的是: 哪个区域增长最快? 哪个客户贡献最高? 哪个产品毛利下降? 库存为什么增加? 所以: 交易系统围绕"业务处理"设计,分析系统围绕"业务理解"设计。
这也是为什么企业做数据建设时,通常会经历两步。 第一步: 数据集成。 通过 FineDataLink 等工具,把ERP、CRM、MES、数据库等不同来源的数据统一接入数仓。 第二步: 数据建模。 把原本面向交易设计的数据,重新整理成: 事实、维度、主题和指标。 前者解决数据孤岛。 后者解决数据难用。 只有数据集成,没有建模,最后往往就是: 数据都进仓了,但没人知道该怎么用。
八、ODS、DWD、DWS到底是在干什么? 理解数据建模以后,再看数仓分层就不复杂了。 常见的数据仓库会分成: ODS → DWD → DWS → ADS 其实每一层都在解决不同的问题。 ODS:数据先过来 ERP是什么结构,先按照原始结构同步。 CRM是什么结构,也先接入。 这一层解决: 数据有没有。
DWD:把业务事实整理清楚 例如: 销售订单明细事实表 出库事实表 采购入库事实表 回款事实表 这一层解决: 到底发生了什么。
DWS:围绕主题组织数据 比如: 客户销售主题 商品销售主题 库存主题 供应链主题 这一层解决: 这些数据怎么分析。
ADS:服务具体应用 例如: 经营驾驶舱 销售日报 库存预警 财务分析 这一层解决: 最终怎么使用。 所以整个过程其实就是: 原始系统 → 数据集成 → 业务事实 → 分析主题 → 数据应用 FineDataLink这类数据集成工具,更多负责前面的数据接入和流转; 数据建模,则负责后面的业务组织和语义统一。
九、为什么很多数据模型越做越乱? 通常逃不开几个原因。 第一,从字段开始,而不是从业务开始。 一上来就研究ERP有哪些表、有哪些字段,却没有先梳理业务过程。 第二,粒度没有定义清楚。 订单级、订单明细级、产品级数据混在一起,最后一汇总金额就翻倍。 第三,指标逻辑散落在报表里。 报表A定义一个销售额,报表B再定义一个,一年以后就出现十几个"销售额"。 第四,为了报表建模型。 老板要一张表,就建一张宽表。 销售再要一张,再建一张。 最后数据仓库变成了"报表仓库"。 真正成熟的数据模型应该围绕: 业务过程和业务实体。 而不是围绕每一张报表页面。
十、真正的数据建模,可以记住这套顺序 如果实际落地,可以按照这条链路来做: 第一步:划分业务域 销售、采购、生产、库存、财务…… 第二步:梳理业务过程 比如销售: 商机 → 合同 → 订单 → 发货 → 开票 → 回款 第三步:确定数据来源 ERP、CRM、MES、WMS、数据库等。 必要时通过 FineDataLink 建立统一的数据同步链路。 第四步:确定业务事实 订单、发货、回款分别是什么事实。 第五步:明确粒度 比如: 一行 = 一个销售订单明细。 第六步:确定维度 客户、产品、时间、区域、组织、渠道。 第七步:定义指标 销售额、订单量、客户数、毛利率,并明确计算公式和统计口径。 最后才是: BI报表、经营驾驶舱、智能问数、AI Agent。 顺序不要反。
最后总结:数据建模到底在建什么? 如果一定要用一句话概括: 数据建模,是把现实中的业务世界,抽象成一个可以被计算、分析和理解的数字世界。 它建的从来不只是表。 而是: 业务对象。 企业里有哪些客户、产品、组织、人员。 业务事件。 企业每天到底发生了什么。 数据关系。 客户、产品、组织和业务事件如何关联。 业务规则。 什么叫销售额、收入、库存、客户数。 分析视角。 最终应该从时间、区域、客户、产品还是组织观察业务。 所以真正优秀的数据模型应该做到: 业务过程清楚。 数据粒度明确。 核心指标统一。 模型可以复用。