符合业务目标的数据战略建设

数仓DWD建模是该“自上而下”还是“自下而上”

数仓建设通常是数字化投入成本最高的地方。一套数据中台只是提供了数据的存储和计算能力。数字化成功的关键也在于数仓建设的扎实程度。

数仓建设过程中DWD明细层是数仓的底座,DWD的ER模型设计是重中之重,DWD建模怎么设计? 是否需要分析源系统的实际情况比如:供应商信息,在A系统用三张表存储B系统用五张表存储C系统用十五张表存储。那么该如何设计DWD的供应商信息的数据模型? 有没有通用的原则? 

处理这个问题的核心思想是:面向业务实体建模,而非面向源系统集成。目标是创建一个统一的、干净的、集成的、反映业务本质的供应商维度表,同时能够追溯回源系统。

640.png

以下是设计DWD层供应商数据模型的通用原则和具体步骤。

一、通用设计原则

1.业务实体驱动原则:

  • 核心问题:我们建模的对象是“供应商”这个业务实体,而不是A系统的3张表、B系统的5张表或C系统的15张表。

  • 做法:忘记源系统的表结构,首先与业务方沟通,明确“在咱们公司,一个完整的供应商应该包含哪些信息?”(如基础信息、财务信息、合规信息、联系人信息等)。基于此设计一个理想化的、完整的供应商维度模型

2.一致性原则:

  • 目标:确保整个数据仓库中对“供应商”的定义和编码是唯一的、一致的。无论数据来自A、B还是C系统,最终在DWD层,同一个供应商必须有同一个唯一标识(supplier_id)。

3.集成与拉通原则:

  • 目标:将多个源系统的数据整合到统一的模型中。这意味着需要处理:

  • 命名和编码不一致:例如,A系统用“M”表示主要供应商,B系统用“PRIMARY”。

  • 数据差异:同一供应商在不同系统中有不同的信息,需要制定合并策略。

4.历史数据追踪原则(缓慢变化维,SCD):

  • 目标:供应商的信息(如地址、评级)会变化,需要能够记录这种变化历史。最常用的是类型2缓慢变化维,即通过增加有效开始日期、有效结束日期和是否当前标志字段来保存历史快照。

二、具体设计步骤

假设我们通过与业务沟通,设计出的理想供应商维度表结构如下:

640 (1).png

现在,关键是如何将A、B、C系统的数据灌入这张表:

步骤1:数据探查与业务规则制定

这是最重要的一步,决定了数据整合的质量。

  • 识别核心业务主键:如何判断A系统的SUP1001和B系统的VEN-202205是同一个供应商?

  • 理想情况:存在全局统一的供应商编码(如SAP号)。

  • 常见情况:没有统一编码。需要通过模糊匹配(供应商名称+税号+电话号码等)来确定。

  • 字段落标和码表映射:

  • supplier_type: A系统叫type,有‘1’,‘2’;B系统叫category,有‘MAJOR’, ‘MINOR’;C系统有5张表才拼出类型。你需要制定一个映射规则:‘1’ -> ‘战略供应商’, ‘MAJOR’ -> ‘战略供应商’。

  • 数据优先级与冲突解决:

  • 如果一个供应商在A和B系统都存在,但名称拼写有细微差别,以哪个为准?通常制定规则,如“以SAP(A系统)数据为准”或“以最新更新的数据为准”。

步骤2:ETL开发——数据清洗与整合

为每个源系统开发独立的ETL作业,其输出是符合上述统一模型的中间数据集。这个过程可以形象地理解为“搓麻绳”。

  • A系统(3张表):编写SQL,将3张表JOIN起来,映射到目标字段。

  • B系统(5张表):编写更复杂的SQL,将5张表JOIN起来,同样映射到目标字段。

  • C系统(15张表):这可能是最复杂的,需要将15张表的业务逻辑理清,进行多次JOIN和UNION,最终整合成一个结果集。

此时,你得到了三个(或更多)结构完全一致的数据集,但它们的数据可能重叠(同一个供应商在多系统存在)。

步骤3:ETL开发——数据合并与历史追踪

这是DWD层ETL的核心逻辑。

  1. 全量拉取三个系统的中间数据集。

  2. 按业务主键(或匹配规则)进行关联,识别出哪些是新增的供应商,哪些是现有的供应商发生了信息变更。

  3. 应用缓慢变化维(SCD Type 2)策略:

  • 新增供应商:直接插入新记录,start_date为当前日期,end_date为9999-12-31,is_current=1。

  • 信息变更的供应商:

  • 找到该供应商当前有效的记录(is_current=1)。

  • 比较该记录的所有字段与新数据是否有变化(需要定义哪些字段变化才算历史版本,如名称、类型变化要记历史,但联系人电话可能不需要)。

  • 如果有重要变化,则:

  1. 关闭旧记录:将当前有效记录的end_date更新为昨天,is_current设为0。

  2. 插入新记录:插入变更后的新数据,start_date为今天,end_date为9999-12-31,is_current=1,并生成一个新的supplier_sk。

总结

面对你描述的场景,没有“一招鲜”的SQL脚本,而是一个系统的工程方法。其通用原则可总结为:

  • 一个核心:为业务实体(供应商)建模,而不是复制源表结构。

  • 两个关键:

  • 集成(Integration):制定清晰的映射和转换规则,将多源数据“拉通”。

  • 历史(History):使用SCD技术,特别是Type 2,有效跟踪数据变化。

  • 三个步骤:

  • 探查与设计:深入理解业务和源系统,制定规则。这是成功的基石。

  • 分解与清洗:为每个源系统独立开发ETL,产出统一结构的中间数据。

  • 合并与加载:将中间数据按主键合并,并处理新增和变更,最终加载到DWD一致性维度表中。

通过这种方式,无论源系统有多么复杂和异构,最终在DWD层呈现给用户的都是一个统一、清晰、可靠、可追溯的供应商视图,为后续的DWM和ADS层建设打下坚实的基础。

共 1 页 1 条数据