在模型设计过程中,一般会用到以下维度种类,不同的维度种类需要采用不同的设计方法:
- 缓慢变化维(Slowly Changing Dimension)
- 快速变化维(Rapidly Changing Dimension)
- 大维(Huge Dimension)
- 杂项维(Junk Dimension)
- 退化维(Degenearate Dimension)
- 多值维(Multivalue Dimension)
下面将分别介绍以上各类维的处理方式。
缓慢变化维
缓慢变化维的处理方式主要包括以下几种:
- 将旧的维度信息覆盖。直接将维度表中的旧值覆盖掉。不保留维度的变化历史;
- 增加一行新的维度数据,并将旧数据行标记为“过期”或使用拉链表设计;
- 添加一个新字段来存储旧的维度数据。
快速变化维
快速变化维的处理方式分别有以下几种:
- 维度表字段并不多,表的数据量也不大的情况。这种情形应用缓慢变化维中的第二种处理方式即可;
- 即维度表字段较多,表的数据量较大的情况。这种情形缓慢变化维中的第二种处理方式会增加过多的行并导致效率降低,因此通常采用第三种处理方式;
- 即维度表字段较多(表拆分),表的数据量很大,且维度表中的一部分字段频繁变化的情况。此时应将相对稳定的字段和频繁变化的字段分割开,频繁变化的字段独立出来形成新的维度表与事实表相连或形成新的雪花关系;
- 新增一个专门用于存储历史数据的历史表。维度表本身还是仅仅保存当前信息。
大维
大维通常指一个包含大量记录和维度信息的表格。在设计大维表时,应该遵循数据仓库设计的一些基本原则,如遵循维度建模,使用正确的数据类型和数据结构(Int, Long, Varchar),设计合适的索引,进行性能优化等。此外,技术层面的处理方式主要包括:关联字段建立索引,建分区,表压缩,列存储等,以优化大维表的存储和查询性能。
杂项维
事务型商业过程通常会产生一系列混杂的,低粒度的标识和指示器。与其为每个标识或属性定义不同的维度,不如建立单独的将不同维度合并到一起的杂项维度。这些维度通常在一个模式中标记为事务型概要维度,不需要所有属性可能值的笛卡尔积。但应该只包含实际发生在源数据中的合并值。每个主题保持一个杂项维。
退化维
看起来像是事实表的一个维度关键字,但实际上并没有对应的维度表。一般来说事实表中的外键都对应一个维表,维的信息主要存放在维表中;但是退化维仅仅是事实表中的一列,这个维的相关信息都在这一列中,没有维表与之相关联。比如:订单编号、发票编号等等。将维度退化到事实表中,有助于减少关联表造成的性能影响。
多值维度
多值维度的处理方式主要有以下两种:
- 创建桥接表,将多值合并为一个组;
- 在事实表中添加列,每个新增的列存放一个值。
桥接表的方式适用于多值能够在逻辑(或事实)上隶属于一个组(值)的场景,新增列的方式则适用于值数固定的场景,各有优劣,设计时按需选用。
层级维
父子式维表形成的层级维,应通过保留字段维护上下级之间的关联关系。使用频次最高的层级以上的各层级主要属性,应尽量冗余到该层级(也就是尽量拉平重要的层级维),以下的各层级正常设计。
枚举维
事实表中,有的属性的值是可枚举的,此时可在主题域下生成枚举维,以便规范统一枚举的维度值。