层次结构
钻取
向下钻取:对某些代表事实的报表中添加维度细节
向上钻取:从某些代表事实的报表中去除维度细节
属性层次
提供了一种自然方法,用于顺序地在不断深入的层次上组织事实。许多维度可以被理解为包含连续主从关系的属性层次。此类层级的最底层代表维度中描述最低级别的详细信息,最高层代表*别的概要信息。每一个级别都可能有一个属性的集合,该集合与下一级别存在主从关系。
在属性层次中钻取:一些软件工具将钻取的概念与属性层次的概念关联起来。这些工具将层次作为预先定义的钻取路径。查询事实时,通过在层级的下一个级别中添加一个维度属性来完成向下钻取,上钻即通过去除当前层次结构级别的属性而开展的。
维度的多重层次结构
通常在维度中确定多重层次结构,每一个层次结构包含维度的所有属性,但将属性组织起来的方式不同。用户看到并认为是相同信息,在这些层次中是完全不同的表现方式。这些层次结构都是有效的,每一种方法都是分解维度中信息的有效方法。
维度交叉
某些情况下,期望的钻取路径可能会从一个维度表到达其他维度表。
回避层次结构
可以完全不用借助层次结构来添加维度细节信息的两个特性使之成为可能,首先,属性的基数或者给定的实例值的数量,不要确定它属于那个层次结构,其次在多个双亲中能找到一些实例值。
实例层次结构
层次的结构的另外一种形式可能存在于维度的实例中,实例层次结构也可以用来分析事实,将通过下钻多级拥有者的方法来探索数据
文档化属性层次结构
- 配置基于属性的钻取特征
- 信息收集
文档化属性层次结构的好处
- 确认维度一致性
- 多维数据集设计与管理
- 聚集设计与管理
雪花结构
通常,星型连接只包含一张事实表,但是在数据库设计中要创建一种雪花结构的复合结构需要多张事实表结合。
雪花结构中,不同的事实表通过共享一个或多个公共维表连接起来。或者将事实表和维表结合起来形成一个类似雪花的结构。
维度规范化的方法
- 对一些维度表进行部分规范化,对其他维度不做修改
- 对一些维度表进行完全规范化,对其他维度不做修改
- 对每个维度表部分规范化
- 对全部维度表完全规范化
优势与劣势
优势 - 减少相对原维度表很少的空间
- 规范化的结构更利于更新和维护
劣势 - 模式比较复杂,用户不容易解释
- 浏览内容困难
- 额外的连接将使查询性能下降
什么时候使用雪花模式
雪花化的背后原则是,将维度表中基数小的属性移出,构建新的表
- 大维度表,可节约空间
- 用户浏览子维度的几率相对于其他维度来说更大
- 如果结构和工具在雪花模式中可以工作得更好,这将是使用雪花模式的理由
雪花结构与建模问题
- 多值属性,维度表和事实表之间存在的标准的一对多关系被破坏了,维度属性包含多个值。
- 迭代的实例层次结构,一些层次结构不能定义为属性之间的关系
- 重复组,当一组属性在维度表中不止出现一次
支架表
重复的属性被放置到一个单独的支架表中,该表有自己的代理键,在原始的维度中,迁移属性被替换为引用支架表的一个或多个外键。
支架表可以用于合理化ETL并减少行长度,但是代理了复杂性为题,并且可能会对查询的性能造成影响,如果要使用支架表,那么应该评估它对数据库优化程序性能的影响。
支架表中的类型二变化会导致连锁反应,要求对所有相关的维度表中的所有关联行执行类型二变化
多值维度
- 多值维度,当事实表的行涉及维度表中多行时,将产生多值维度。
处理多值维度的方案
简化关系
事实表与维度表之间的多值关系可以通过将多值关系分解为多个一对多关系来解决,然而该方法使报表更加复杂并且仅仅支持数量有限的关系。
为多值维度构建桥接表
无须直接引用维度表,每个事实表将引用一组表,该组表被称为桥接表。因为它将事实表和维度表连接起来。
- 这组表包含引用需要的维度表的组键和外键列
- 每个组成员将增加一行,每一行都具有相同的组键
- 事实表和桥接表可以使用组键来做连接操作。然后将维度表与桥接表做连接操作
- 与简化多对对关系相比,桥接表的使用提供了更好的灵活性,并简化了生成报表的难度
- 桥接表可能造成双重计算问题。即描述事实可能出现被多次计算的情况。
避免双重计算的方案
- 对维度中分组具有唯一列进行分组
- 增加分配因子,分配因子指明了每个组中成员对相关事实贡献的百分比
- 使用主成员补充桥接表,对没有经验的用户隐藏桥接表的存在
桥接表的其他影响
- 缓慢变化,如果被桥接的维度行包含类型1变化,它将与所有存在的组关联,如果桥接的维度行包含类型2变化,当成员合作再发生变化时需要建立一个新组。无论何时,在组是可辨认实体的情况下,采用将组定义为维度表的方式,成员作为多值属性,都会获得更好的建模效果。
- 分解多对多关系,维度表桥接事实具有多对多关系,如果使用的软件产品不允许使用多对多关系,可以通过建立交叉表的方式将其分解。
多值属性
多值属性,当一个维度行需要获取当以属性的多个值时,将产生多值属性。
简化多值属性
针对多值属性,考虑将其简化为固定数量的单值属性,如果重复的属性不被用于过滤或分组查询结果,这种方法就是最简单的选择
简化多值属性存在的问题
- 受限于不同值的数量
- 按照指定行业进行过滤的查询需要定义多个条件
- 按照行业进行分类时,将会出现问题,因为可能出现在任何一列中
使用属性桥接表
桥接表放置在维度表与支架表之间
- 维度表中不存储多值属性,他们将按照各自的代理键,存储在不同表中,该表被称为支架表
- 桥接表包含两列,一列表示组键,另一列设计支架表
- 当维度行涉及支架表中的特定组合时,将在桥接表中为这些值建立组
- 维度表和支架表之间可以通过组键连接。桥接表与支架表也通过组连接
使用属性桥接表发生变化的影响
- 支架表发生变化,需要所有相关维度行都需要做出相应处理
- 组成员发生变化的影响,针对组的任何表化都需要在维度表中增加一行以反应组的变化
- 维度表发生变化的影响,维度表需要对数据源变化做出相应,新的版本需要新的代理键。如果多值属性没有发生变化,新行仍能够重用相同的组键
- 将支架表包含到桥接表汇总,如果仅仅包含一个到连个多值属性,可以不使用支架表,将属性放置到桥接表中以简化配置
- 如果软件产品不允许使用多对多关系,可以建立一个交叉表将其分解。
- 作为事实表的桥接,由于桥接表主要包含外键,它与事实表非常相似。尽管桥接表并不包含事实,但是可以用作同样的意图。
递归层次与桥接表
递归层次
当维度表中特定的行之间而不是属性之间存在关系时,实例层次存在,这样的层次关系称为递归关系,因为每个实例可能引用其他实例,若不希望影响分析能力,那么递归层次在单一表中很难表达
递归层次影响的问题
- 涉及其他行的行
- 报表上钻下钻的难度
递归层次的扁平化
对递归层次进行扁平化后,就不需要在查询时遍历关系。层次的扁平化是通过建立新的用于表示固定数量级别的属性来实现的,但是它没有解决上钻和下钻问题。如果级别具有一致的、可分辨的含义。采用扁平化层次最为有效。
在维度表中增加列,用于表示固定数目的层次级别。在ETL的过程期间,对于表中的每行,分配到汇总列中的值都通过提前遍历层次来进行计算,这些新的属性将鞥次扁平化,以便在查询过程中无须遍历递归层次。
扁平化带来的问题
- 需要回填,并不是表中所有的行都表示层次的最下层,需要确定底层级别使用什么值。对那些未处于层次底部的成员,一般采用回填自己的标识到底层列中的方法。
- 上钻和下钻依然存在问题,实例层次可以方便地回答需求问题,但是通常不是我们期望获得的。级别毕竟是通过扁平化获得的人造结构,大多数与实例层次有关的问题将安排使用层次来汇总包含某个成员之上或者之下的事实。
- 仅包含固定数量的级别,扁平化方案采用固定的级别数量的方法限制了层次的深度。如果出现需要另外的级别这种情况,维度表就不能解决这样的问题了。实例层次的扁平化可以简化报表的难度,但不能消除这些问题,解决方案受制于固定数量的级别并且需要回填,通过上钻和下钻对事实的分析依然存在问题,虽然对固定数量固定的级别来说,该防范可以比较容易地建立报表。
- 变量深度不是问题的所在,扁平化仍然需要回填层次上更高级别的成员,当用户上钻或者下钻时报表问题依然存在,除非永远不会出现新的级别。
适合扁平化的情况
当级别是一致的,并且很容易区分含义时,扁平化实例层次是最有效的。
层次桥接表的设计
层次桥接表可以作为标准维度的补充,因此层次桥接表可以添加到已有的设计中,没有桥接的维度也可以使用。
层次桥接表的结构和内容
- 层次桥接表的结构,层次桥接表每行表示维度表中的两行的关系。为此,桥接表中包含两个外键用于引用维度。一个表示层次中的高层实体,另一个表示底层实体。层次桥接表包含两个引用维度表中相关行的外键,它可能包含另外一个用于表示两个维度行之间在层次中距离的列。
- 层次桥接表的内容,桥接表的每行表示维度中行之间的关系,这些关系是在ETL过程中,通过遍历数据源中的递归关系来标识并处理的。对于维度表中的每行,在层次桥接表中包含一行或者多行。
- 一行用于描述存在的直接从属关系,包含在层次上距离为一个级别的成员
- 一行用于表示存在的间接从属关系,如果存在的话,包含在层次上距离为两个或者两个以上级别的成员
- 一行用于表示自身,即层次距离为0
使用桥接表
- 下钻,当事实表被用于层次执行下钻时,需要选择层次上的一个成员并在该成员所处的层次和所处层次一下的层次上聚集所有的事务。
- 上钻,采用类似的过程,对连接稍作改动就可以用于研究发生在层次中特定成员上的事实。采用这样的方式上钻时,事实表与桥接表中的upper_或者superior_级别的键连接,而维度表连接到lower_或者subordinate_级别的键。
双重计算
采用双重计算时,无论是上钻或者下钻,都存在双重计算的可能。
- 避免双重计算,在下钻层次时,选择一个顶层成员以避免双重计算,在上钻层次时,需要选择一个底层成员,也可以通过按照顶层或者底层成员分组的方法避免双重计算。查询时,对成员的确定应该使用自然键。
- 对初级用户隐藏桥接表,只将桥接表暴露给有经验和训练有素的开发人员,终端用户随意地构建报表不可避免地会带来双重计算的风险。
解决多对多关系
- 为建模工具和关系数据库管理系统声明层次桥接表,层次桥接表可以针对建模关系和关系数据库声明与事实表关联的两类关系,采用该方法避免了队车讯将会利用多对多关系的声明。
- 为商业智能工具声明层次桥接表
- 没有多对多关系的下钻,在对查询工具配置下钻时,事实表与桥接表之间存在的多对多关系可用通过为维度表使用别名分解
- 没有多对多关系的上钻,商业智能工具在上钻配置环境中分解多对多关系时采用类似的方法,在查询中需要利用维度表的两个别名。
变化与层次桥接表
维度或桥接表的类型1变化
- 维度的类型1变化:更新发生变化的维度行就可以了,新的状态反应到星型模型中,其他没有什么改变
- 层次的类型1变化:删除桥接表中所有与变化想关的行,用新行替换,也可以对受影响的行尽心更新。
维度的类型2变化
- 具有层次桥接表时类型2响应机制,为发生变化的成员在维度表上建立新行,为发生变化的成员在层次上的所有成员在维度表上建立新行,在层次桥接表中建立与所有维度中新行关联的行。
- 不要抵制连锁反应
层次的类型2变化
- 对于在层次上发生变化的所有成员,在维度表中建立新行
- 在桥接表中建立新的用于反应层次新状态的行
层次桥接表其他
- 装饰桥接表,可以采用在层次桥接表中增加额外列的方法提高分析能力,例如有效日期和截止日期戳。或者增加标志,进一步增强对层次的探索和描述能力。
- 多父节点,有时肯呢个出现多个层次应用到维度成员上,最佳方案是建立多个桥接表,每层次一个。多层次也会给ETL过程带来更多的困难