维度的基本概念
维度是维度建模的基础和灵魂。在维度建模中,将度量称为”事实“,将环境描述为”维度“。维度是用来分析事实所需要的多样环境
维度使用主键标示其唯一性,主键有两种,代理键和自然键。代理键是不具有业务含义的键。自然键是具有业务含义的键。
维度的层次结构
连续主从关系的层次。当属性层次被实例化为1一系列维度,而不是单一的维度时,被称为雪花模式。将维度的属性层次合并到单个维度中的操作称为反规范化。
维度整合
命名规范的统一,表名,字段名等统一。
字段类型的统一
公共代码及代码值的统一。
业务含义相同的表的统一。主要依据高内聚、低耦合的理念,在物理实现中,将业务关系大,源系统影响差异小的表进行整合;将业务关系小、源系统影响差异大的表进行分而治之。通常有如下几种集成方式:
(1)、采用主从表的设计方式。将主要信息放在主表中。将从属信息放在各自的从表中。
(2)、直接合并,将共有信息和个性信息都放在同一个表中。
(3)、不合并,因为源表的表结构及主键等差异很大,无法合并,使用数据仓库里的多个表
水平拆分
不同类型或类别的维度。需要考虑的地方:
扩展性:当源系统或业务发生变化时,通过较少的成本快速扩展模型,保持核心模型的相对稳定性。
效能:在性能和成本方面取得平衡。通过牺牲一定的存储成本、达到性能和逻辑的优化
易用性:模型的可理解性高,访问复杂度低。
维度进行水平拆分时,主要考虑以下依据:
(1)、当维度属性随类型变化较大时,采用方案一,定义一个主维度表用于存放公共属性,同时定义多个子维度,其中包含公共属性外,还包含各自的特殊属性,
(2)、第二个依据是业务的关联程度,两个关联性较低的业务,耦合在一起弊大于利。对模型的稳定性和易用性影响较大。
垂直拆分
在进行维度设计时,依据维度设计的原则,尽可能的丰富维度属性,同时进行反规范化处理。
一是在“水平拆分”中提到的,由于维度分类不同而存在的特殊维度属性,可以通过水平拆分的方式解决该问题,
二是,某些维度属性的来源表产出时间较早。而某些维度属性的来源表产出时间晚。或者某些维度属性热度高,使用频繁,而某些维度使用低,热度低。通过存储的冗余和计算成本的增加,实现了商品主模型的稳定和产出时间的提前。
缓慢变化维
第一种处理方式:重写维度值
第二种处理方式:插入新的维度行。保留历史数据,记录变化前后的维度数据。不能将变化前后的事实归一为变化前或变化后的维度。
第三种处理方式:添加维度列。
快照维表
使用代理键难度大。对ETL的开发和维护成本高
对于缓慢变化维,采用快照的方式。优点是:
(1)、简单而有效,开发和维护成本低
(2)、使用方便,易理解。
缺点是存储的浪费。牺牲存储获取ETL效率的优化和逻辑上的简化。
极限存储
历史拉链存储是指利用维度模型中缓慢变化维的第二种处理方式。通过新增两个时间戳的字段。将天粒度的变更数据记录下来。但是理解有障碍。且随着时间推移,分区数量会极度膨胀。
为解决上述问题,采用极限存储方法。
(1)、透明化,底层拉链存储。上层做一个视图操作。
(2)、分月做历史拉链表,降低分区数
特殊维度
递归层次
按照层次是否固定分为均衡层次结构和非均衡层次结构。例如省市区等属于均衡层次结构。
层次结构扁平化
降低递归层次使用复杂度的方法是:层次结构扁平化。通过建立维度的固定数量级别的属性来实现。对于均衡层次结构,采用扁平化最有效。
行为维度
- 另一个维度的过去行为,如买家最后一次访问淘宝时间
- 按照事实行为维度,如买家从年初截止当前的淘宝交易金额。
- 分组事实行为维度
- 复杂逻辑事实行为维度
处理方法:
(1)、冗余到现有的维表中
(2)、加工成单独的行为维表
无论哪种方法主要参考以下两个原则:
第一、避免维度过快增长。比如对商品表进行极限存储,如果将商品热度加入现有的商品维表中,则使每日商品变更占比过高
第二、避免耦合度过高,比如卖家主营类目,加工逻辑异常复杂,如果融合进入现有卖家维表中,过多的业务耦合会导致卖家维表刷新逻辑复杂,维度性差,产出延迟等。
多值属性
维表中某个属性字段同时有多个值
处理方法:
(1)、保持维度主键不变,将多值属性放在维度的一个属性字段中,此种方法扩展性好,但是数据使用麻烦。
(2)、保持维度主键保持不变,将多值属性放在维度的多个属性字段中。多值属性字段的具体数量不固定,可以采用预留字段的方式,但是扩展性较差
(3)、维度主键发生变化,一个维度值存放多条记录。延展性好,使用方便,数据量级急剧膨胀
杂项维度
杂项维度是由操作型系统中的指示符或标志字段组合而成,一般不再一致性维度之中。比如淘宝交易的订单交易类型字段
处理方法:
将这些字段建立到一个维表中,而事实表只需要保存一个外键。多个字段的不同取值组成一条记录,生成代理键,存入维表中。并将该代理键保存到相应的事实表字段下。
