数据分析之数据仓库 – 分层与建模
“我们公司的数据仓库,从下单到出报表,数仓团队要跑3天,业务部门天天催,技术团队天天改。更离谱的是,同一张订单表,不同部门取的销售额居然差了20%。”这是我去年为一家中型电商企业做数据架构咨询时,对方的CTO跟我说的第一句话。他花了两周时间,终于在三个不同的数据接口里发现了口径不统一的问题,一个用了含税价,一个用了不含税价,还有一个竟然把退单金额也加进去了。
这就是典型的“不分层、不建模”的后果。数据仓库的分层与建模,不是技术选修课,而是数据架构的必修课。如果你以为这两件事是“上线后再优化”的锦上添花,那你大概率会在一两年后,面对一个比Excel表格还混乱的数仓,然后被迫重做。
在我过去五年服务超过30家企业的数据架构项目中,我得出一个核心结论:分层和建模的本质,不是把数据堆得更整齐,而是把“数据生产”和“数据消费”之间的耦合度降到最低。
具体来说,分层解决的是数据流的“可维护性”和“可回溯性”,建模解决的是数据结构的“一致性”和“可复用性”。两者缺一不可。
可以这样理解:分层是数据仓库的骨架,决定了数据从哪里来、经过哪些环节、最终到哪里去;建模是数据仓库的肌肉,决定了数据以什么形态呈现、支持哪些分析动作、以及如何被高效检索。
基于我的实践经验,我提炼出以下三个核心判断:

很多企业一开始做数据仓库的时候,觉得“只要把数据导进来,能跑报表就行”。这种想法直接导致了数据仓库变成了“数据沼泽”,表面上看数据都在,但一旦你要从中提取出有价值的信息,就会陷入泥潭。
2021年,我曾帮助一家年销售额在20亿左右的零售企业做数据治理。他们的数据仓库已经运行了两年,建设了约200张表,团队规模12人。但实际情况是:
问题出在哪?他们用了典型的“烟囱式开发”模式:业务部门提什么需求,数据团队就写什么SQL,直接建一张表,然后丢给前端。这种模式短期内响应快,但长期来看,每一张表都是孤岛,数据之间没有关联,也没有统一的标准。
根据我的观察,数据仓库在建设过程中,会经历一个典型的“生命周期陷阱”:
这个陷阱的本质原因,就是没有在初期建立分层和建模的规范。很多企业以为“先跑起来,后面再优化”,但数据仓库不是代码,代码可以重构,数据仓库的重构成本极高,因为数据已经被多个下游系统消费了。

当我跟客户沟通时,我会直言:数据仓库不是“搬数据”的,它是“治数据”的。搬运只是手段,治理才是目的。分层和建模,就是数据治理最核心的两个工具。
分层解决的是“数据怎么流”的问题,建模解决的是“数据怎么存”的问题。两者相辅相成,缺一不可。如果只做分层不做建模,你会得到一个结构清晰但内容混乱的仓库;如果只做建模不做分层,你会得到一个内容规范但难以维护的仓库。
在多年的咨询和培训过程中,我总结了关于数据仓库分层与建模的7个常见误区。这些误区几乎每一个企业都踩过,有些甚至一个不落全部踩了。
我见过一个企业,数据仓库分了9层:ODS、DWD、DWS、DIM、MID、TMP、ADS、DM、APP。每一层都有严格的命名规范,但实际上,数据从ODS到APP,中间经过了7层转换,查询延迟增加了3倍,数据血统追溯变得极其复杂,一旦某一层出了问题,定位问题需要翻遍所有层。
正确做法:分层不是越多越好,而是越清晰越好。标准的4层架构(ODS、DWD、DWS、ADS)足以覆盖95%以上的业务场景。多出来的层,往往是“路径依赖”或“为了分层而分层”的产物。
很多数据开发人员在做建模时,第一反应是打开PowerDesigner画ER图,画完就丢给业务审核,业务看了半天说“看不懂,你们觉得行就行”。这种建模方式,本质上是在“自嗨”。
正确做法:建模的核心是“面向业务分析”,而不是“面向技术实现”。维度建模、事实建模、ER建模,每一种方法都有其适用的场景,但不管用哪种方法,都要回答三个问题:业务需要什么数据?数据怎么关联?怎么保证一致性?
我遇到的最常见的一句话是:“我们先跑起来,等数据多了再分层和建模。”这个想法极其危险。数据仓库跟盖楼一样,地基没打好,后面加层就是灾难。一旦数据量和表数量上去了,再回过头来做分层和建模,相当于要拆掉半个数仓重来,成本是指数级增长的。
有的团队认为,ODS层是“原样接入”的,根本不需要建模。这个观点对了一半:ODS层的结构确实应该尽量保持源系统结构,但“保持结构”不等于“不建模”。ODS层需要定义数据字典、数据格式、数据来源、数据频率等元数据,否则后续的DWD层会面临数据“脏乱差”的问题。
维度退化是维度建模中的一个重要概念,指的是把一些维度属性退化到事实表中,以减少关联表的数量。但很多团队把“维度退化”当成一个必须执行的规则,不管三七二十一,所有维度都退化到事实表,结果导致事实表变得极其宽,存储成本飙升,查询效率反而下降。
DWS层是轻度汇总层,被很多团队当成“万能药”,不管什么分析需求,都先汇总到DWS层。但问题是,有些分析需要明细数据,有些需要高度聚合的数据,还有些需要跨主题的关联数据。如果DWS层做得太“重”,反而会失去灵活性,变成“大而全但什么都不好用”的中间层。
受Kimball理论影响,很多团队默认数据仓库建模就是维度建模。但事实上,维度建模并不适用于所有场景。比如,在金融风控和实时数据湖场景中,Data Vault建模和Anchor建模可能更合适。盲目套用维度建模,可能会让模型变得极为复杂。

在多年的实战中,我形成了一套自己的决策逻辑。这套逻辑不是我凭空想出来的,而是在无数次踩坑、复盘、优化之后提炼出来的。下面我把这套逻辑分享出来,希望能帮助你少走弯路。
我推荐大多数企业采用“四层架构”,即:ODS、DWD、DWS、ADS。这四层是经过大量实践验证的最佳选择。但具体到每一层的设计,我需要根据企业的现状做判断。
ODS层(操作数据存储层): 这一层的关键不是“做不做”,而是“怎么做”。我的判断逻辑是:如果源系统数据质量高(比如来自ERP系统),ODS层可以保持原样接入;如果源系统数据质量低(比如来自Excel手动导入),ODS层需要做一次“轻量级清洗”,包括字段格式统一、空值处理、时间戳标准化等。
DWD层(明细数据层): 这一层是数据仓库的核心。我的判断逻辑是:DWD层要做到“最细粒度”,即保留业务过程最原始的数据明细。不要在这一层做任何汇总,也不要做过多的关联。DWD层的目标是“可追溯”,即分析师可以基于DWD层的数据,追溯到任何一笔业务记录。
DWS层(汇总数据层): 这一层是为了“提效”而存在的。我的判断逻辑是:只有那些被频繁查询的、相对稳定的指标,才需要汇总到DWS层。对于临时性的、一次性的分析需求,不建议在DWS层做汇总,因为会浪费存储和计算资源。
ADS层(应用数据层): 这一层直接面向报表、BI工具和API接口。我的判断逻辑是:ADS层的数据结构应该与下游消费系统一一对应,不要做“大而全”的表。ADS层的设计原则是“按需定制”,即有什么需求就建什么表,不要提前建一堆可能用不上的表。
建模的起点,不是技术,而是业务。我的判断逻辑是:先定义业务过程,再确定粒度,然后选择建模方法。
第一步:定义业务过程。 业务过程是指企业运营中的关键事件,比如“用户下单”“商品入库”“客户还款”等。每一个业务过程,对应一个或多个事实表。
第二步:确定粒度。 粒度是指事实表中每一行记录代表什么。比如“订单表”的粒度是“每一笔订单”,还是“每一笔订单中的每一个商品项”?这个决定直接影响到后续的分析灵活性。我的经验是:粒度越细,分析越灵活,但存储成本越高;粒度越粗,成本越低,但分析能力受限。我一般建议“细粒度”,因为存储成本在持续下降,但分析灵活性的价值是持续上升的。
第三步:选择建模方法。
我的判断逻辑是:对于80%的互联网和零售企业,维度建模是首选;对于金融、保险等传统行业,ER建模或Data Vault建模可能更合适。具体选择,需要结合企业现有的数据架构、团队能力、以及未来3-5年的规划。
很多团队在分层和建模上纠结,不知道先做哪个。我的判断逻辑是:先分层,后建模。
原因很简单:分层定义了数据流的“秩序”,建模定义了数据结构的“规范”。如果没有秩序,再好的规范也无法落地;如果没有规范,再好的秩序也会变成空架子。所以,正确的顺序是:先确定分层架构,再在每一层内做建模设计。
为了让理论落地,我分享一个我亲自参与的真实案例。2022年,我帮助一家年销售额50亿的电商企业重构了他们的数据仓库。这个案例完整地展示了分层与建模的实战过程。
该企业拥有自营电商平台、淘宝店、京东店、拼多多店等多个销售渠道。数据仓库已经运行了3年,建了约350张表,团队规模18人。面临的核心问题包括:
我主导的方案分为三步:
第一步:重新定义分层架构。 将原有的8层拆解为4层:ODS、DWD、DWS、ADS。
第二步:重新设计建模方法。 采用维度建模,以“订单”核心业务过程作为起点。
第三步:建立数据规范。 包括命名规范、字段规范、口径规范、以及数据生产规范。
经过6个月的重构,效果非常显著:

基于这个案例和对其他企业的观察,我总结出一个规律:分层与建模的投入,在前3个月是“成本”,在3-6个月是“持平”,在6个月之后是“收益”。
很多企业倒在了前3个月,因为他们看不到短期的回报,觉得“花了这么多时间做分层和建模,报表还是没跑出来”。但事实上,6个月后,当数据量增长、需求增多时,那些“当初花时间做了分层和建模”的企业,会越来越轻松,而“没有做”的企业,会越来越痛苦。

在了解了分层和建模的核心原理、常见误区、以及实战案例之后,你可能会问:我该怎么做?下面我根据不同情况,给出具体的行动建议和取舍策略。
建议: 采用“轻量级分层+快速建模”策略。
建议: 采用“标准四层架构+维度建模”策略。
建议: 采用“分层+建模+数据治理”三位一体策略。

数据仓库的分层与建模,不是“一次性工程”,而是“持续演进的过程”。它不会让你一夜之间解决问题,但它会让你在每一次数据变更、每一个新需求到来时,都显得从容不迫。
如果你现在正被数据仓库的混乱所困扰,我建议你从今天开始,做一件小事:梳理你的核心业务过程,确定最细粒度的事实表,然后开始建立你的数据字典。 这一小步,就是数据仓库从“混乱”走向“有序”的第一步。
下一步,你可以根据我上面给出的行动建议,针对你所在的企业阶段,选择适合的分层和建模策略。如果你有任何疑问,或者想深入探讨某个具体场景,欢迎随时交流。数据架构这条路,不是一个人走出来的,是一群人一起走出来的。
我在一家创业公司做数据分析,每天从业务系统拉数据做报表,但各个部门口径总对不上,IT 也抱怨每次取数都要重写 SQL。我听说要建数据仓库分层,但成本很高,真的有必要吗?不分层直接用原始表,好像也能跑出结果啊。
分层不是为了显得专业,而是为了解决三个核心痛点:数据一致性、开发复用性和查询性能。我先说一个真实案例:去年我帮一家电商公司做数据治理,他们之前不分层,直接从 MySQL 业务库拉数据做报表。结果财务部门算的 GMV 比运营部门少 12%,因为财务扣除了退款和未支付订单,运营却包含了所有下单记录。
口径不统一,导致管理层决策时互相扯皮。分层之后,我们在 DWD 层统一清洗并定义好字段(比如订单金额 = 商品金额 + 运费 – 优惠券分摊),所有下游报表都从这个标准层取数,口径问题彻底解决。
另外,不分层时每次新需求都要从原始表开始写几十行 SQL,分层的 DWS 层预聚合了日/周/月级指标,查询时间从 30 秒降到 1 秒以内。所以分层不是可选项,而是数据驱动决策的必经之路,尤其当公司有 3 个以上部门、数据量超过 100 万行时,不分层的维护成本会指数级增长。
我自学数据仓库时看到两种建模方法:Kimball 的维度建模和 Inmon 的 ER 建模。网上都说维度建模适合做分析,ER 建模适合做企业级数据仓库。但我的公司只有 50 人,业务也不复杂,到底该选哪个?有没有一个简单的判断标准?
我的建议很直接:对于 90% 的中小企业,直接选维度建模,尤其是星型模型。为什么?ER 建模追求的是消除数据冗余,但会设计出几十张关系表,查询时需要大量 JOIN,开发周期长、维护成本高。
我去年帮一家物流公司做数据仓库,初期采用了 ER 建模,结果分析师写一个简单的“各网点月包裹量”报表需要 JOIN 5 张表,性能差且易出错。后来重构为维度建模,事实表放“包裹运输记录”,维度表放“时间、网点、客户、车辆”,分析师只需要关联两三张表,效率提升 300%。
但有一种情况可以考虑 ER 建模:当企业需要构建全公司统一的数据模型,且数据源极其复杂(比如银行核心系统),并且有专业的数仓团队(5 人以上)时,ER 建模的稳定性和一致性优势才能体现。否则,维度建模的灵活性和快速迭代特性更适合业务变化快的互联网公司。
你还可以用“查询频率”判断:如果 80% 的查询都是按照几个固定维度汇总(如按时间、地区、产品),维度建模是唯一选择。
我看很多文章把数据仓库分成四五层,每层还有不同的名字,比如 ODS、DWD、DWS、ADS,甚至还有 DIM 和 MID。我们公司只有 20 人,数据量也不大,真的需要分这么多层吗?分少了怕不够用,分多了怕浪费。
分层不是越多越好,而是够用就好。我见过有人为了炫技,把数据仓库分了 7 层,结果数据从产生到进入报表要经过 5 个 ETL 任务,延迟 2 小时,而且每个任务都可能出错,运维成本极高。我的经验是:根据业务复杂度决定层数。
对于中小企业,3 层(ODS、DWD、ADS)或 4 层(加一个 DWS)就足够了。
我接手过一个餐饮连锁企业,只有 50 家门店,数据量每天不到 10 万行,我们只建了 3 层:ODS 直接接入收银系统原始数据(不做任何清洗),DWD 层做数据清洗、字段标准化(比如统一门店名称、菜品分类),ADS 层直接面向报表(如门店销售排行、菜品毛利分析)。
整个数仓只用了 2 周就搭建完成,分析师写 SQL 不超过 5 行。如果业务复杂,比如需要跨部门统一口径,可以增加 DWS 层做轻度汇总(比如按天汇总门店销售额),这样 ADS 层可以直接读取 DWS,避免重复计算。
记住一个原则:每增加一层,必须有明确的业务价值,要么减少重复计算,要么提升查询性能,要么口径统一。如果做不到,就不要加层。
我在做用户维度表时,发现用户的信息会变,比如手机号、地址、等级。如果直接覆盖,历史报表就对不上了;如果保留历史,关联查询又很复杂。我看了很多文章讲 SCD 的三种策略,但不知道在实际业务中怎么选。有没有一个简单的方法?
SCD 策略的选择核心看两个维度:业务是否需要回溯历史数据,以及数据变化频率。我直接给一个决策树: – 如果历史数据不需要回溯(比如用户手机号仅用于当前联系,报表只看当前状态),直接用 type 1(覆盖),简单高效。
我举一个真实踩坑案例:某电商公司做用户分析,用户等级变化频繁,他们用了 type 2,结果用户维度表从 100 万行膨胀到 500 万行,查询时关联要扫描大量历史行,性能下降 80%。
后来我们改为:对于等级这种高频变化字段,单独建一张“用户等级变化事实表”,记录每次变动的时间点和值,而用户维度表只保留当前等级。这样既保留了历史,又不会膨胀主维度表。另一个常见误区:不要对所有维度字段都使用 type 2,只有那些对业务分析有实际影响的字段(如用户等级、渠道来源)才需要。
对于姓名、手机号等,用 type 1 覆盖即可。


上一篇:数据分析之数据故事 – 叙事技巧
读者评论
作为一名数据仓库工程师,文章提到的‘分层越多越好’误区深有感触,我们之前分了7层,结果查询延迟翻倍,维护成本极高。现在简化到4层,效率反而提升了。
业务部门经常抱怨报表数据不一致,看了这篇文章才明白根本原因是没建模。我们公司就是典型的‘烟囱式开发’,同一指标不同部门口径不同,开会前对账半天。这篇文章点出了本质。
很认同作者关于‘先分层后建模’的论断。我们项目初期为了快速上线跳过建模,结果半年后表数量一多,数据质量急剧下降,重构成本巨大。现在准备按四层架构重做。
作为数据分析师,经常被DWS层‘万能药’坑到。有些分析需要明细数据,但团队为了省事全汇总到DWS,导致灵活性很差。这篇文章让我理解了分层和建模的取舍。
文章中的生命周期陷阱太真实了!我们公司正好处在阶段三,表数量150+,业务满意度下降,手动纠正每日20多次。看来必须强制推行分层和建模规范了。