数仓模型规范设计

模型架构设计

数仓架构一般从宏观上分为三层:操作数据层ODS、公共维度模型层CDM和数据应用层ADS。其中CDM又包含明细数据层DWD、汇总数据层DWS,维度层DIM、根据生产经验这里可在加入数据临时层TMP。架构图如下:
在这里插入图片描述

  1. ODS
    把操作系统的数据几乎无处理地存放在数据仓库系统中。
  • 支持历史数据回溯
  • 表结构、数据类型和数据源保持一致
  • 可以过滤敏感字段
  • 不同业务类型的表可采取不同分区策略
  1. DWD
    按业务概念组织细节数据,并进行名称、代码等标准化处理。
  • 完成数据标准化和清洗,包括命名规范、算法统一
  • 维表退化到事实表,减少事实表和维度表的关联
  • 构建明细宽表,提高明细表的易用性
  1. DWS
    根据应用的高层和产品指标要求,构造通用粒度汇总指标表。
  • 采用宽表化手段构建公共汇总层,提升指标复用性,减少重复计算
  1. DIM
    维度是对具体分析对象的分析角度,维度要具备丰富的属性,历史信息的可追溯性,对通用的维表要保持一致性。

  2. TMP
    用来降低加工过程计算难度,提高运行效率的临时表层。

  3. ADS
    这一层跟业务系统强相关(如各种BI、画像平台),可由业务方直接开发,也可由数仓团队开发,内容跟系统需求导向的。此层不作为数仓核心分层架构。

基本原则

  1. 高内聚和低耦合
    一个逻辑或者物理模型由哪些记录和字段组成,应该遵循最基本的软件设计方法论的高内聚和低耦合原则。主要从数据业务特性和访问特性两个角度来考虑:将业务相近或者相关、粒度相同的数据设计为一个逻辑或者物理模型:将高概率同时访问的数据放一起,将低概率同时访问的数据分开存储。
  2. 核心模型与扩展模型分离
    建立核心模型与扩展模型体系,核心模型包括的字段支持常用的核心业务,扩展模型包括的字段支持个性化或少量应用的需要,不能让扩展模型的字段过度侵入核心模型,以免破坏核心模型的架构简洁性与可维护性。
  3. 公共处理逻辑下沉及单一
    越是底层公用的处理逻辑越应该在数据调度依赖的底层进行封装与实现,不要让公用的处理逻辑暴露给应用层实现,不要让公共逻辑多处同时存在。
  4. 成本与性能平衡
    适当的数据冗余可换取查询和刷新性能,但不宜过度冗余与数据复制。
  5. 数据幂等性
    处理逻辑不变,在不同时间多次运行数据结果确定不变。
  6. 一致性
    具有相同含义的字段在不同表中的命名必须相同,必须使用字段命名规范中约定的词根。
  7. 命名清晰、可理解
    表命名需清晰、一致,表名需易于使用者理解和使用。

公共规范

  1. 层次调用约定
    应用数据层应优先调用聚合数据层及通用数据层数据,优先使用已产出的粗粒度汇总数据,不允许应用数据层跨过中间层从ODS层重复加工数据。
    一方面,数仓团队应该积极了解应用层数据的建设需求,将公用的数据沉淀到公共层,为其他团队提供数据服务;另一方面,应用数据层开发时也应积极配合数仓团队进行持续的数据公共建设的改造。必须避免出现过度的引用ODS层、不合理的数据复制以及子集合冗余。
  • DW层(基础数据层及通用数据层)任务的深度不宜过大。

  • 聚合数据层(DWS)应优先调用通用数据层(DWD)。在可累加类指标计算时,聚合数据层(DWS)尽量优先使用已经产出的同层粗粒度汇总数据,以避免大量汇总直接从海量的基础数据层计算。

  • 基础数据层累计快照事实表优先调用同层事务型事实表,以保持数据的一致性产出。

  • 避免应用层过度引用和依赖基础数据层明细数据,需要针对性地建设好DW公共汇总层。

  1. 数据冗余
    宽表冗余维度属性时,应该遵循以下建议原则:
  • 冗余字段与表中其它字段高频率同时访问。

  • 冗余字段的引入不应造成任务本身的完成时间产生过多后延。

  • DW层(基础明细层、数据汇总层)数据不允许字段重复率大于60%的相同粒度数据表冗余,可以选择在原表基础上拓宽或者在下游应用中通过JOIN方式实现。

  1. 数据拆分
    数据的水平和垂直拆分是按照访问热度分布和数据表非空数据值、零数据值在行列二维空间上分布情况进行划分的。
  • 在物理上划分核心模型和扩展模型,将其字段进行垂直划分。

  • 将访问相关度较高的列在一个表存储,将访问相关度较低的字段分开存储。

  • 将经常用到的where条件按记录行进行水平切分或者冗余。水平切分可以考虑二级分区手段,以避免多余的数据复制与冗余。

  • 将出现大量空值和零值的聚合数据层汇总表,依据其空值和零值分布状况可以做适当的水平和垂直切分,以减少存储和下游的扫描数据量。

  1. 空值处理原则
    【建议】
  • 事实表的空值:空值处理,填充为零。因为数据库中null值对常用数字型字段的SQL过滤条件都不生效,比如大于、小于、等于。
  • 维度属性值为空:在汇总到对应维度上时,对于无法对应的统计事实,记录行会填充为-99(未知),对应维表会出现一条-99(未知)的记录。

ODS规范设计

  1. 设计原则
    必须】一个源表只允许同步一次到数据仓库。

  2. 命名规范
    (1) 表命名规范
    [层级][源库][源表]{业务标识}[刷新周期标识][单分区增量全量标识]
    如:ods_netroam_misim_order_di
    •ods表示层级
    •netroam表示业务库名
    •misim_order表示业务表名
    •d表示刷新周期为按天更新(ODS层原则上只有按天分区数据)
    h:小时/d:天/w:周/m:月
    •i表示单分区数据为增量(f表示全量)

    必须】如来自不同业务系统表名产生冲突时,在[同步策略]之前增加{业务标识}来区分

    【建议】如接入分库分表数据时,ODS表中增加source_ip/source_db/source_tb字段以示区分,便于数据校验及问题定位

    (2)字段命名规范
    必须】字段默认与源系统字段名保持一致
    【建议】如与数仓关键字产生冲突,如etl_tm,start_day,end_day等时,字段增加后缀_dup(duplicate)区分

  3. 生命周期规范
    (1)对于业务库接入数据

数据表类型存储方式最长存储保留策略
全量按天分区ODS层数据默认保存30天,支持数据问题回溯
增量按天分区ODS层数据默认保存30天,支持数据问题回溯

(2)对于互联网日志数据

数据表类型存储方式最长存储保留策略
业务自打点且已落地工场ODS层不冗余存储,直接使用业务日志作为ODS表
onetrack日志按天分区ODS层不冗余存储,直接使用tracking库作为ODS层,互联网业务日志TTL默认180天
  1. 数据质量规范
    •【必须】业务数据ODS表必须配置主键唯一性监控(主键是后续拉链处理的关键)
    •【必须】ODS表必须进行分区空数据监控
    •【必须】ODS表所有字段均必须有注释
    •【建议】ODS表的记录数设置上周同比无变化监控,用于监控源系统是否下线或者已迁移

DWD层规范设计

  1. 命名规范
    (1)表命名规范
    [DWD/DWS][主题缩写][业务][业务流程缩写/表内容描述][模型设计方式]
    模型设计方式:流水表为{刷新周期标识}{单分区增量全量标识},,拉链表为chain
    如:dwd_event_ott_mitv_log_di/dwm_ot_device_active_chain
    •dwd表示层级
    •event表示主题
    •ott表示业务
    •mitv_log表示具体业务信息
    •chain表示模型设计方式为拉链
    (2) 字段命名规范
    这里可以维护一套词根表,让尽量让所有字段命名都统一。

  2. 生命周期规范
    互联网业务日志TTL默认180天。

DIM层规范设计

  1. 设计原则
    必须】维度表中相同维度属性在不同物理表中的字段名称、数据类型、数据内容必须保持一致;
    【建议】维度建模一般推荐将维度的属性层次合并至单个维度(反规范化),换取简明性和查询性能;
    维表的设计常见如下两种方式:
    •全量快照
    方式:每天保留一份全量快照数据;
    优点:开发维护成本低,使用方便,易于理解;
    缺点:存储冗余,未发生变化的记录需要每日冗余存储;
    注意:避免过度使用这种方法,且必须要有对应的TTL机制,清除无用历史数据;
    •历史拉链
    方式:通过新增开闭链日期,以天为粒度记录数据变更,支持快速还原任意天的历史快照;
    优点:极大地压缩了全量存储的成本
    弊端:提高了数据使用门槛与解释成本
    注意:对于频繁变化的属性,需要合理的进行水平或垂直拆分,保持核心维度的相对稳定;

  2. 命名规范
    (1)表命名规范
    DIM_{业务缩写}_{维度定义}
    如:dim_dept_user
    •dim表示层级
    dept_user表示维度定义,部门用户
    (2) 字段命名规范
    这里可以维护一套词根表,让尽量让所有字段命名都统一。

  3. 生命周期规范
    历史拉链方式设计的维表默认无TTL约束,视实际场景合理设置;
    全量快照方式设计的维表TTL建议为7天,视实际场景合理调整;

字段类型规范

数据仓库中的字段长度尽量满足相应源系统字段中最大长度的要求,当然也会考虑字段的业务含义,对于一些源系统定义过长,而从实际业务含义又不可能有那么长的字段,由仓库自行选择一个合适的长度定义;为了尽可能的保持仓库中数据类型的一致性以及规范性,数据仓库中的数据类型定义不宜过杂,建议只定义string、bigint、double类型,使得仓库中的字段类型保持整齐。

日期类型字段由于格式多样,造成在信息加工处理过程中的格式转换复杂且易出错,因此对日期类型字段统一制定如下规范。以"2020-01-01 12:57:45.233"为例说明日期字段类型规范内容:

在这里插入图片描述

分区定义规范

分区致力于解决支持大表和索引的关键问题,一旦分区被定义,SQL语句就可以访问的操作某一个分区而不是整个表,因而提高管理的效率。分区对于数据仓库应用程序非常有效,因为他们常常存储和分析巨量的历史数据,对于HIVE,分区实际就是对应HDFS文件系统上的的独立的文件夹,该文件夹下是该分区所有数据文件。在分区设计中通常需要从数据存储与数据访问角度考虑。以下为常用表设计的分区定义。

  • 流水表:流水表通常的加载或加工方式为增量,在使用时也经常按天的方式进行应用,通常设计date=数据日期作为分区。

  • 拉链表:拉链表设计目前采用单级分区设计,end_day=[数据日期,20991231]

  • 全量快照表:全量快照表通常设计一个date=数据日期分区,一个分区代表该天全量数据快照情况。

  • 增量快照表:全量快照表对于使用来说非常方便,但是针对于数据量巨大的表来说,这种设计通常存储巨大,访问非常慢,然而在使用时也并非需要全量的数据,这时可考虑设计为增量快照表,date=数据日期为当日修改的数据。由于一笔业务数据可能多次修改,也就是说会分布在多个dt分区,使用时需要结合业务日期使用或去重使用。

  • 归档表:对于数据量巨大表的另外一种设计方式则为归档表,归档表则将某个时间以前的数据放置到归档分区,归档日期依据业务进行定义。归档一般使用二级分区方式,例如全量快照和拉链表最新快照,配合规范可设计为[dp=ACTIVE/HISTORY, date=数据日期]或[dp=ACTIVE/HISTORY, end_day=20991231/数据日期]

<think>好的,我现在需要帮助用户了解库建模的选择方法和最佳实践。首先,用户提到了Inmon和Kimball两种理论,我需要先回顾一下这两种方法的区别和适用场景。根据引用[2],Inmon是自上而下,按主题构建库,强调集成和稳定性;而Kimball是自下而上,使用维度建模,通过事实表和维度表快速构建据集市。用户可能想知道在什么情况下选择哪种方法,以及如何结合使用。 接下来,用户需要选型指南和最佳实践。我应该结合引用中的内容,比如技术架构选型(引用[1])、分层设计(引用[3])、ETL/ELT(引用[4])等。可能需要分步骤说明,比如明确需求、选择建模方法、分层设计、技术工具选型、据治理等。 还要注意用户提到的阿里云产品,如MaxCompute和DataWorks,这些在技术选型部分可以作为例子,说明如何应用理论到实际工具中。另外,库的分层结构,如ODS、DWD、DWS等,需要详细解释,并结合引用[3]中的分层案例。 最后,生成相关问题时要覆盖用户可能关心的点,如方法对比、工具选择、分层优化、性能提升和据治理等。确保引用正确,比如Inmon和Kimball的不同点来自引用[2],分层参考引用[3],ETL部分来自引用[4]。 需要确保回答结构清晰,分点列出步骤和考虑因素,同时语言简洁,符合用户要求的中文回答。检查是否有遗漏的关键点,比如是否提到了混合方法,或者据治理的重要性。另外,确保所有学表达式或公式正确使用LaTeX格式,但根据用户当前的问题,可能学内容不多,但如果有的话要正确应用。</think>### 库建模选型指南与最佳实践 #### 一、库建模方法选型 1. **Inmon范式建模(自上而下)** - **适用场景**:企业级统一据视图、强调整合性和稳定性,适用于复杂业务体系和大规模据治理需求[^2]。 - **核心步骤**: 1. 定义企业级主题域(如客户、产品、供应商); 2. 构建标准化3NF模型; 3. 基于主题逐步扩展据集市。 - **优点**:据冗余低、一致性高,适合长期迭代。 2. **Kimball维度建模(自下而上)** - **适用场景**:快速响应业务需求,面向分析场景(如销售分析、用户行为分析)。 - **核心要素**: - **事实表**:记录业务过程度量值(如订单金额),设计需明确粒度; - **维度表**:描述业务上下文(如时间、地点),支持上卷下钻分析。 - **优点**:查询性能高,开发周期短。 3. **混合模式** - **方法**:在核心层采用Inmon范式建模保障一致性,在应用层使用Kimball维度建模支持灵活分析[^3]。 - **典型案例**:阿里云Dataphin支持混合分层设计,底层使用规范模型,上层构建宽表集市。 --- #### 二、数仓设计最佳实践步骤 1. **明确业务目标与技术需求** - 定义分析场景(如实时监控、历史趋势分析); - 评估据规模(如每日增量、历史据保留策略); - 确定技术架构(如阿里云MaxCompute + DataWorks的批处理体系)[^1]。 2. **分层架构设计** - **参考分层模型**: | 层级 | 作用 | 技术实现示例 | |---|---|---| | ODS | 原始据接入 | MaxCompute表存储原始日志 | | DWD | 清洗与标准化 | 使用DataWorks进行脏据过滤 | | DWS | 轻度汇总 | 构建跨主题的聚合宽表 | | ADS | 应用集市 | 按业务线输出分析结果 | 3. **建模工具与流程选择** - **ETL vs ELT**: - ETL(传统方式):在据加载前转换,适合结构化据处理[^4]; - ELT(现代方式):利用大据平台计算能力(如MaxCompute SQL),适合非结构化据。 4. **一致性维度管理** - 建立全局维度(如统一时间维度表); - 使用代理键替代业务主键,解决缓慢变化维问题。 --- #### 三、典型技术选型建议 | 需求类型 | 推荐方案 | 优势 | |---|---|---| | 企业级复杂建模 | Inmon + 混合分层 | 适应多业务线扩展 | | 敏捷分析场景 | Kimball + 星型模型 | 快速响应业务需求 | | 实时数仓 | Lambda架构 + 维度建模 | 平衡实时性与一致性 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值