1. 数据仓库模型:不只是分层,更是数据价值的“流水线”
很多刚接触数据仓库的朋友,一听到BDM、FDM、DIM这些缩写,头就大了,感觉像在学一套复杂的新语言。我刚开始做项目的时候也这样,总觉得这些模型层是理论家们为了显得高深而发明的。但踩过几次坑、熬过几个通宵后,我才真正明白,这套分层架构根本不是摆设,而是一条精心设计的“数据价值流水线”。它决定了数据从“原材料”到“成品”的整个加工过程是否顺畅、高效,最终能不能端上业务的餐桌。
简单来说,你可以把数据仓库想象成一个现代化的中央厨房。基础数据模型(BDM) 就是刚从农场和渔港运来的、带着泥土和冰碴的原始食材。事实数据模型(FDM) 和 维度数据模型(DIM) 则是厨房的核心加工区,在这里,食材被清洗、切配、分类,变成可以烹饪的半成品。汇总数据模型(GDM) 相当于预制好的套餐或半成品菜,方便快速出餐。应用数据模型(ADM) 是针对不同餐厅(比如中餐厅、西餐厅)定制的特色菜谱。最后,应用层(APP) 就是呈现在顾客面前的那道色香味俱全的菜肴。
这条流水线的设计,核心目标就两个:一是降本,减少数据冗余和重复计算;二是增效,让业务人员能更快、更准地拿到他们需要的数据洞察。如果设计不好,你就会遇到数据不一致、报表跑一天、业务部门总抱怨“数不对”的经典困境。接下来,我们就一层层拆解,看看这条流水线到底是怎么运转的,以及在实际项目中,我们是怎么把它搭建起来的。
2. 基石与原料:深入理解基础数据模型(BDM)
2.1 BDM的核心任务:保持数据的“原汁原味”
BDM层,也就是基础数据模型,是整个数据仓库的基石。它的核心任务就一个:尽可能原封不动地、完整地保存从各个业务系统抽取上来的原始数据。这里的关键词是“原封不动”。我见过有些团队为了图省事,在数据接入时就想做清洗和转换,结果后来业务规则一变,或者发现原始数据有歧义,想回溯都找不到源头,那真是叫天天不应。
BDM层的数据特点就是“全、细、杂”。全是指全量,最好能保存历史拉链数据,方便回溯。细是指粒度最细,比如每一笔订单的创建、支付、修改记录。杂是指来源杂,可能来自MySQL的业务库、MongoDB的日志、Kafka的实时点击流,甚至第三方API。在BDM层,我们通常不会做过多的关联,而是按主题或数据源进行物理隔离,比如建立 ods_order(订单原始表)、ods_user_behavior_log(用户行为日志原始表)等。
一个常见的实践是采用“增量+全量”的混合策略。对于交易类核心表,每天做增量同步,并打上数据日期分区标签。对于一些缓慢变化的维度表,可能每周或每月做一次全量快照。在Hive或大数据平台里,你的BDM层表结构可能看起来很简单,但会包含所有原始字段和一个标志数据来源与时间的元数据字段。
-- 一个简化的BDM层订单表示例
CREATE TABLE ods_order (
order_id BIGINT COMMENT '订单ID',
user_id BIGINT COMMENT '用户ID',
amount DECIMAL(10,2) COMMENT '订单金额',
status INT COMMENT '订单状态(原始编码)',
create_time TIMESTAMP COMMENT '创建时间',
update_time TIMESTAMP COMMENT '更新时间',
-- 以下是ETL过程添加的元数据字段
`data_date` STRING COMMENT '数据日期分区,格式yyyyMMdd',
`src_system` STRING COMMENT '来源系统,如:CRM_DB',
`etl_time` TIMESTAMP COMMENT '数据加载入仓时间'
) PARTITIONED B


1万+

被折叠的 条评论
为什么被折叠?



