递归层次
1)维度的递归层级即在维度分层的一种表现形式,如下:
① 类目维度,细分为叶子类目、三级类目、二级类目、一级类目
② 地址类目,细分为区县、城市、省份、国家
2)对递归层次的探查过程分为上钻和下钻。假设一个场景,统计类目id为001的所有商品最近一天的销售额,步骤如下:
① 获取父类目为001的所有类目,得到一个类目集合
② 便利集合每一个元素,如果类目为叶子类目则终止;如果非叶子类目则此id作为父类目重复第一步,知道找出所有的叶子类目
③ 将所有叶子类目与事实表关联统计
以上场景是一个下钻的过程,钻取过程常常伴随递归sql。
3)为了降低递归sql的使用成本,对递归层次进行相应处理:
① 层次扁平化:
当按照三级类目进行统计时,由于001,002的三级类目为null,所以会遗漏这部分数据,我们使用的方法时回填,将上级类目向下虚拟
扁平化的使用前提是钻取前知道类目级别和类目递归级别是固定的
② 层次桥接表:不需要预先知道类目级别、不去要数据回填、不需要固定类目递归级别,但是使用复杂,成本高,实践中并不推荐
对类目003上钻场景:
+ 类目表限制003
+ 通过类目id与桥接表的子类目id关联
+ 事实表中类目id与桥接表父类目id关联
对类目001下钻场景:
+ 类目标限制001
+ 通过类目id与桥接表的父类目id关联
+ 事实表中类目id与桥接表子类目id关联
多值维度
事实表一条记录根据业务场景有时会关联多条维度表数据,如一个订单包含多个子订单,会关联到多个商品信息;购房信息中的夫妻联合买入,会关联到多个买房人。常用处理办法如下:
1)降低事实表的粒度:如订单粒度降到子订单,就能实现一条事实表数据对应一个商品维表数据,但有时粒度并不能降低
2)采用多字段:对于关联维度数据不多的情况可以采用多个字段的方式,考虑到扩展性可以采用预留字段的方式
3)采用桥接表:表现灵活但是逻辑复杂,加工成本高
杂项维度
在事实表中可能存在多个类似的字段,如交易订单事实表的交易类型、交易状态、物流状态、交易流言等字段。保存在事实表中会造成事实表占用空间过大,保存在单独维表中会造成维度过多,所以建立一个杂项维度,统一存放这些字段