按照业务实际,数仓区分为ODS、DW、SCD、RPT层,DIM维度层会贯穿所有层使用,为方便后台查询会放到RPT层。
ODS层(表存放在ODS库):
ODS层存放的是从业务源系统同步过来的数据,表名增加【ODS_业务简写_】前缀,表结构和数据结构保持与源系统一致。ODS表的分区策略是表数据量小于2万以下的常用表建成维度表,表数据量大于2万、或者非常用的表建成分区表。
DW层(表存放在DW库):
DW存放的是经过初步加工的,标准的,带有时间特征的明细数据,表名为范围【DW_业务简写_业务名称_(RT/NRT)】,以后缀RT(实时)和NRT(非实时)作为实时数据和非实时数据(刷新频率以日计)的区分。
DW表的字段必须是规范的,命名和类型都要参照下面的命名规范,不能无脑照搬源表字段。
DW数据的处理原则是去空(对空值补NULL_ID或0值)、标准化(转换非标数据类型和非标准的表示方法)、预关联(关联出明细粒度上有用的维度和其他逻辑信息)。
DW表的扩展原则是支持字段(column)上的扩展而不是行(row)上的扩展。意味着设计DW模型的时候就要确定业务的数据范围,在列的设计上尽量采取最小可用的原则,保持模型的简洁。
DW表的更新策略常用的有两种:时间增量更新和主键更新。时间增量在非实时数仓使用得比较多,一般采用的是DELETE-->INSERT-->EXCEPTION(ROLLBACK)的方式运行,保持数据执行的幂等性。数据批量产生批量插入更新,逻辑简单,但缺点是可能会涉及到大量未更新数据的处理。主键更新是检测到某行数据发生变化之后,才执行的更新行为,涉及到的更新数据量会比较小。优点是数据更新迅速,处理量小,缺点是必须保持数据有唯一性主键,而且在有多源更新、数据物理删除时处理逻辑会变得复杂。
DW表不能直接作为最终报表的查询表。DW表的建设目的不是直接为了业务主题,奔着业务主体的目标去开发DW表,结果是只会开发出一张自己能用的中间表。
如无必要,勿增实体(奥卡姆剃刀原则)。DW表尽量通用,不要为了某些特殊的剔除逻辑又衍生出新的同质DW表,正确的做法是常用逻辑可以增加剔除标识字段,不常用逻辑则直接写在下游业务逻辑中剔除。要考虑在横向列上扩展,而不是新增模型粗暴解决。
SCD层(表存放在SCD库):
SCD表命名规范为【SCD_业务简写_业务名称】
SCD缓慢变化维的概念旨在记录数据的变化情况,我们采取的是拉链表的方式存储。原则上可以针对数据的时刻变化进行记录,但一般只是针对统计周期的最小粒度做记录。
SCD常用的用途其实是针对维表的特定字段发生变化进行记录,只是我们为了达到减少变化数据的存储量,在一些事实数据上也使用了这一技术。
SCD表的字段最好不要出现NULL值,否则对比的时候可能会出错。
RPT层(表存放在bi库):
RPT是面向报表层的,包括报表查询用到的汇总表(某些查询维度较少时可以用)、明细表。RPT表的命名规范是(RPT_业务简写_业务名称_(DAY/MON/WEEK/QTR/YEAR),其后缀表示表中数据的最小主时间粒度。