上篇文章我们讲到了数仓建模中几种常见模型优劣势对比以及数仓完整性建设方案,相信大家对此已经有了初步的了解,本篇文章我们将继续对维度建模中一些通用规范展开讨论。
一、维度模型基本设计规则
1.高内聚,低耦合
所谓的"高内聚低耦合"是指同一个主题内部高内聚,不同主题之间低耦合。
2.模型分离
建立核心模型和扩展模型体系。在业务建设过程中,我们通常会对一些核心业务建设核心模型,在核心模型中的字段主要用来支撑一些通用的主流的核心业务,同时也会针对一些特殊和定制化的少量需求建设扩展模型,在这种情况下,我们应当避免将扩展模型中的字段侵入到核心模型中,以免破坏核心模型架构的可维护性和通用性。
3.公共处理逻辑下沉
越是底层公用的处理逻辑越应该在数据调度依赖的底层进行封装与实现,不要让公用的处理逻辑暴露给应用实现,不要让公共逻辑多处同时存在。
4.成本与性能平衡
适当的数据冗余可换取查询和刷新性能,不宜过度冗余与数据复制。
5.数据可回滚
处理逻辑不变,在不同时间可多次运行,多次运行如果结果不一致要明确原因。
6.一致性
具有相同含义的字段在不同表中的命名必须相同,必须使用规范定义中的名称。
7.命名清晰、可理解
表命名需清晰、一致,表名易于理解和使用。
二、表基本设计原则
1.ODS层设计规范:
- 所有ODS层的数据表中都必须包含数据入仓时间和逻辑删除标识字段,业务库删除数据后,在数仓ODS层中,统一做逻辑删除即可;
- ODS层的数据,通常需要保留至少3副本,避免因物理因素或者其他因素导致数据丢失的情况;
- 在ODS创建表时,根据具体业务需求,可以将ODS层建设成唯一主键(UNIQUE),明细(DUPLICATE)或聚合(AGGREGATE)中的一种模型,从而达到快速整合数据的需求;
- 业务数据中,如果数据量不大,可以按照较粗粒度分区,比如年月;如果数据量大且查询频繁,可以按照天或者周较细粒度分区;
- 业务数据中,如果需要长期保留历史数据,可以采用冷热分离存储的方式,将最近半年或者最近三个月的数据存储在SSD上,将历史数据存储在HDD或者通过备份的方式存储在分布式文件存储系统中(比如HDFS等);
- 类似于日志数据或者埋点数据这种价值周期没有那么高的数据,可以根据业务需求保留近半年或者近3个月数据即可;
2.维表层设计规范:
维表设计时,需要遵循以下几点基本原则:
- 一致性:
同一个维度属性,在不同的物理表中的字段命名,字段类型,基本单位和数据内容必须保持一致,如果存在历史版本导致不一致的情况,需要维护好版本与字段之间的关系;
- 丰富性:
维度常采用一张主维表+多张次维表的形式展开。在建设维表时,应尽可能多的生成不同维度的属性,并尽可能沉淀出一些通用的维度属性,形成共享维度;
- 组合和拆分:
将两个有强关联的维度属性进行组合,一起查询和展示;无相关性的低频维度,可以构建成一个特殊的维度属性集合;
对于数据记录较大的维度,可以适当冗余一些关联维度,降低关联操作复杂度;对于异常重要的,高频使用的可以单独拆分为核心维表;
3.事实表设计规范:
事实表作为数仓维度建模的核心, 紧紧围绕着业务过程来设计,通过获取描述业务过程的度量来表达业务过程,包含了引用的维度和与业务过程有关的度量。事实表设计需要遵循以下几点基本规则:
- 完整性:
尽可能多的包含整个事件的业务事实,但同一个事实表中,不能包含多种不同粒度的事实,对于需要部分复合事实进行分解操作;
- 规范性:
采用事件发生的时间或日期作为分区字段,便于对事实表分区裁剪和扫描;
- 易用性:
处理事实中的空值或NULL值;保持事实单位一致;明细层的事实可以采用维度退化的手段,冗余一些维度,降低关联查询JOIN成本;
以上就是数仓维表建模的一些基本规范,接下来我们将简单介绍一些常见的建表规范细节。
三、基本建表规范:
1.常规表:
层级 | 命名规范 | eg |
---|---|---|
ODS | ods_{业务库名}_{业务库原始表名}_{delta} | ods_sdb_sale_order_item_delta |
DWD | dwd_{主题缩写}_{业务过程缩写}_{自定义标签}_{更新频率} | dwd_saas_order_item_info_di |
DWS | dws_{数据域缩写}_{自定义标签缩写}_{刷新周期标识} | dws_sale_order_income_td |
ADS | dws_{数据域缩写}_{自定义标签缩写}_{刷新周期标识} | ads_sale_month_income_1d |
DIM | dim_{维度定义} | dim_company_area |
通用的更新频率标识符:
描述符 | 词根 |
---|---|
每天分区中保留历史至今全量数据 | df |
每天分区保留当日新增数据 | di |
每周分区中保留历史至今全量数据 | wf |
每周分区中保留历史当前周全量数据 | wi |
历史至今 | md |
不定期更新的全量表 | nd |
刷新周期通用标识符:
描述符 | 词根 |
---|---|
一天 | 1d |
一小时 | 1h |
一个周 | 1w |
一个月 | 1m |
截至当天 | td |
未来1周 | f1w |
2.其他表:
-
备份表:不同分层的备份表,只需要在原始表名后缀加上 :
_bak_0829
这种标记即可; -
删除表:当需要删除一张表时,可以将该表重命名为删除表,等过了删除周期之后再删除,这样能降低删除表 的风险性,标记一张删除表时,可以在原始表后缀加上:
_rm_0829
这种标记即可; -
临时表:不同分层下的临死表,可以在原始表名后缀加上:
_tmp_0829
即可; -
外表(映射表):如果某些数仓表属于外表,则表名后缀可以统一如下格式:
_mapping
;
3.其他规范:
- 表名中不要包含特殊字符或者中文字符,长度不要超过尽量不要超过64位;
- 优先使用已经维护过的词根描述符;
- 需要简写表名时,须保持见名知意的基本要求;
4.字段设计规范:
所有字段必须全为小写,同时单词与单词之间统一以下划线
格式分割,禁止使用驼峰和SQL
中的关键字命名;其次,常见的一些度量和维度需要统一字段前缀或后缀:
说明 | 规范 | eg |
---|---|---|
数量 | _cnt/_count结尾 | user_cnt |
金额 | _amt/_amount结尾 | order_amt |
比率 | _rate结尾 | mod_rate |
平均 | avg结尾 | mod_avg |
周累计 | wtd | order_wtd |
天 | daily结尾 | sid_daily |
周 | weekly结尾 | sid_weekly |
布尔类型 | is_开头 | is_delete |
四、总结:
以上就是数仓维度建模过程中的一些基本规范。当然,这些规范仅仅只是很少的一部分,更多更细节的规范和原则需要企业中数仓建设同学根据具体细节讨论制定和完善。接下来,我们将介绍目前企业级主流数仓架构建设方案及对其的思考。
最后,如果有问题的同学,欢迎后台私信一起讨论交流。