一、背景
随着大数据时代到来,数据呈现爆炸式的增长,从海量的数据中提取出有用的信息难度越来越大;这些难点包括;
- 难以确保数据的质量
- 数据存储杂乱无章,计算数据逻辑复杂并且复杂度高;
- 数据的使用效率较低,无法区分有价值的数据-无价值数据 数据建模主要针对以上三个问题:提升数据质量,减少数据存储,提高数据计算性能,提高数据使用效率
二、数据建模
数据建模主要分为一下四步:
- 业务建模:按照主题划分(这些主题都是面向分析方向的,比如想要分析交易相关的数据,可以划分交易主题)
- 领域建模:从业务抽象出实体、事件模型
- 逻辑建模:细化领域模型中的属性
- 物理建模:实际物理engine物化模型
维度模型是从分析决策的需求出发构建模型,为分析需求服务,重点关注如何快速响应用户需求,同时具有良好的大规模复杂查询性能。典型的维度模型包括星形模型、雪花模型、星座模型
三、一般的数据管理体系
3.1 规范定义
3.1.1 名词术语
- 数据域:业务过程或者维度进行抽象的集合
- 业务过程:指企业的业务活动事件,如下单、支付、退款。(不可拆分的事件)
- 时间周期:数据的时间
- 原子指标/度量
- 维度:用来反映业务的一类属性
- 维值
- 衍生指标 名词术语最重要的目标是为了维持一套通用的命名标准,让每一个人都能够通过名字快速的知晓指标的含义; 比如:
3.2 模型设计的基本概念和原则
模型的层次
- ADL 应用层数据(个性化指标加工, 基于应用的数据组装)
- CDL 公共维度模型层(其中CDL层一般又分为明细数据层,以及宽表模型层)
- ODS 贴源数据层 维度建模的步骤
- 确定业务过程:提单过程
- 确立粒度:订单/商品粒度
- 确定维度:下单时间、用户、门店、配送区域等
- 确定事实:原价交易额,订单优惠金额,配送费,打包费 数据建模的基本原则
- 高内聚、低耦合(高相关,经常访问的数据放在一个模型,提高性能和访问效率)
- 核心模型与扩展模型分开(防止扩展模型的修改,影响核心模型的稳定性)
- 为更好的实现数据一致性,不至于同样的逻辑存在多个以地方,需要公共的逻辑下沉且单一
- 数据可回滚(业务需求)
3.3 维度的设计
维度设计基础
- 维度设计的基本方法是,确定主维表, 确定相关维度表,确定维度属性;确定维度属性时需要丰富维度属性,一般维度属性包括ID和Name两种字段;
- 维度的层次结构,表示如级联维度等
- 通常在数仓中为了利于查询数据,都会范规范话数据,通过空间换取时间
- 一致性维度,表示从下到上的过程中,维度都是一致的;
维度的高级处理
- 维度整合:将面向多个业务过程的数据转换成面向分析主题建立的数据仓库便是整合;
- 维度水平拆分:不同业务线的维度,虽然可能大部分的维度属性相同,但是由于业务线的原因,统计时候不会交叉探查,所以设置基本维度,然后在基本维度上扩展两个子维度,子维度在继承父维度的属性基础上,增加自己独有维度;
- 维度垂直拆分: 根据产出时间,冷热层度,将原本是一个维度维度表拆分成两个维度表;
维度的缓慢变化处理(基于代理键,需要业务上保证每一个维度的稳定且唯一)
- 重写维度值,只保留最新的值,不保留历史; 这种情况当插入新的维度行(无法将新旧归集到一类)
- 插入信息维度行:(这方方式不能将变化前后的维度统一为一个事实)1000 和 1001是同一个类目的不同属性;
- 插入维度列(这种方式回会导致列比较多,如果经常变化的话)
快照维度表
基于同步周期,每天同步出一份快照维度表,每天的数据都可以在这章全量的维度表上面关联,优点是:简单高效,使用方便,只需要限定日期,便可以将事实和维度通过维度自然键进行关联。缺点是:存储空间占用比较大
极限存储
增加start_dt,end_dt标识本条维度的有效时间,若是没有变化,则不会新增维度表数据。《大数据之路》一书中提到一般都是通过start_dt,end_dt 作为数据的分区字段,主要原因应该是为了查询的时候加速,但这样会带来另外一个问题:分区数量急剧增加;
特殊维度
特殊维度需要特殊处理,特殊维度包括 递归层次的维度、行为维度、多值维度、多值的维度属性、杂项维度;
1.递归层次维度
在递归维度上 下钻和上卷是很常见的,但大多数库不支持递归的下钻,一般解决这个问题的方法是:扁平化和层次交接表,扁平化;
- 扁平化后想要查看某一个下级维度,必须要知道这个维度属于的上级维度;
层次桥接表加工和使用起来都比较复杂,而且涉及到很多join,所以使用得较少;
2.行为维度
行为维度,即事实衍生维度,需要从事实表中计算导出的维度表;行为维度的加工分为一下几种方式:
- 另外一个维度过去 ;比如买家维度最近访问淘宝的时间
- 快照事实表 维度:比如卖家截止当前的消费额度
- 指标分段 维度:会员级别
- 其他复杂的事实 维度:比如机器学习产出的维度表 行为维度需要可以冗余到当前维度表,也可以新建维度表(拆分出去),主要是看拆分后代价和合并的代价那个大;
3.多值维度/多值属性(冗余记录,或这个一个字段中,存放多个属性)
事实表的一条record对应某维度表中的多条记录;处理方式:
- 降低事实维度粒度,比如将订单事实表,拆分成子订单事实表
- 多字段,比如房屋买卖的合同,无法降低成子合同
- 桥接表(需要多一次join,通常不是我们想要看到的)
4.杂项维度
具有相同特性的维度打包成一个实体,只能通过一个代理键对外关联;(冗余到事实表会造成事实表过大,生成普通维度造成维度属性爆炸)
附录
本随笔参考阿里巴巴《大数据之路》,是个人学习笔记,仅供参考