2. 6 处理维度层次关系
维度层次,多维度数据库是按照多维数据库模型的思想来建立的。而一个多维数据模型是由多个维度和事实组成。维度是多维数据模型中非常重要的概念,要进行多维分析、编写高效准确的MDX查询,首先要对维以及维度的概念分层有比较深刻的印象。
维是描述事实的角度,也即观察数据的角度。****一个多维数据模型通常都包含多个维度。比如:描述企业的销售信息这样一个事实,我们可能要用到客户维度、时间维度、产品维度、仓库维度等****。
在多维数据库中,维度表的来源通常都是关系型数据库中的基础数据表,如上面提到的客户维度就来自关系数据库中的客户表,产品维度就来自关系数据库中的产品表等等。而这些维度除了与事实表相关联的键属性以外还有很多其他的数据表属性。
在基于关系数据的查询中,我们可能更多的关注表之间的关系。而在多维数据库中,应该把思维改进一下,应该理解和注意维度属性之间的关系,分析维度中每个属性之间的关系。而维度属性之间的关系就引出了维度层次。维度往往存在层次关系。维度中的一些描述属性以层次方式或多对一的方式相互关联,可以理解为包含连续主从关系的属性层次。层次的最底层代表维度中描述最低级别的详细信息,最高层代表最高级别的概要信息。,维度中常常有这样的嵌入式层次结构。
递归层次指的是某维度的实例值的层次关系。按照层级是否固定分为均衡层次结构和非均衡层次结构。其中具有固定数量级别的递归层次,称为均衡层次结构;数量级别不固定的递归层次称为非均衡层次结构,比如公司之间的关系,每个公司可能存在一个母公司,但是可能没有固定的一级、二级等层级关系。
下面我们从最基本维度层次的开始讲起。
1 固定深度位置的层次
固定深度层次是一系列的多对一关系,如产品→品牌→类别→部门,对于商品而言,每个部门会有多个类别,每个类别又会有多个品牌,每个品牌下又会有多个产品。当固定层次定义完成后,层次类别就有了商定的名称,层级级别应作为不同的位置属性存在维表中,如产品→品牌→类别→部门,应有4个字段来分别对应层次的每一级别,而不是将该层次存储成一个字段。
与其他技术相比,固定层次关系是最好理解和导航(navigate)的层次关系,同时它也能提供快速且可预测的查询性能。如果层次关系不是多对一的关系,或者层次级别各不相同以致没有固定的商定名称,那么需要使用一下的不定层次技术。
2 轻微参差不齐 / 可变深度层次
轻微参差不齐的层次虽然没有固定的层级级别,但深度的变化范围很小,如地理层次深度通常都在3~6层。对于这种情况而言,与其使用复杂的处理不可预测的可变层次的技术,不妨将其转换为固定深度的设计,同时用维度属性来确定最大的级别数,然后基于规则填充属性值。回填是填充属性的一种常用方式,他将属性向下虚拟,如二级、三级为空,则用一级属性值对二三级进行填充。阿里巴巴大数据之路(p181)对此进行了详细的案例介绍。
3 具有层次桥接表的参差不齐 / 可变深度层次
在数仓建模中,对于有层次关系的维度表,一种建模方式是建立父子表,该方式建表在层次深度可变时尤其有用,是一种紧凑而有效的建模方式。但是该方法也有缺点:在关系型数据库中,不定深度的层次很难建模和查询,用标准SQL很难对递归结构进行操作。尽管SQL扩展和OLAP访问语言对递归的父/子关系提供了一些支持,但是这种方式也很有局限性。
采用SQL扩展,在查询时,不能替换不同的参差不齐层次,不支持对自身层次结构的共享,同时也不支持随时间变化的参差不齐层次。
With SQL extensions, alternative ragged hierarchies cannot be substituted at query time, shared ownership structures are not supported, and time varying ragged hierarchies are not supported
以上这些问题在关系型数据库中都可以通过对可变层次建立桥接表来解决。桥接表对可变层次中每一种可能的路径都保留一行,使得采用标准SQL就能完成对所有层次的遍历,而不需要其他语言扩展。
4 具有路径字符属性的可变深度层次
可以在维度中采用路径字符属性,以避免使用桥接表示可变深度层次。对维度中的每行,路径字符属性包含特定的嵌入文本字符,包含从层次最高点道特定唯独行所描述节点的完整路径描述。
多层标准层次分析需求可以通过标准SQL处理,不必采用SQL语言扩展。然而,路径字符方法不能确保其他层次的快速替换,也无法保证共享自身层次。路径字符方法也难于构建可变路径层次的变化,