# 维度建模
# 概述
维度建模是一种将数据结构化的逻辑设计方法,它将客观世界划分为度量和上下文。度量是常常是以数值形式出现, 事实周围有上下文包围着,这种上下文被直观地分成独立的逻辑块,称之为维度。它与实体-关系建模有很大的区别, 实体-关系建模是面向应用,遵循第三范式,以消除数据冗余为目标的设计技术。维度建模是面向分析,为了提高 查询性能可以增加数据冗余,反规范化的设计技术
# 维度建模
# 事实表
事实表存储了从业务活动或事件提炼出来的性能度量,它主要包含维度表的外键和连续变化的可加性数值或半可加事实。 事实表产生于业务过程中而不是业务过程的描述性信息。它一般是行多列少,占了数据仓库的 90%的空间。 在维度模型中也有表示多对多关系的事实,其他都是维度表。
事实表作为数据仓库维度建模的核心,紧紧围绕着业务过程来设计,通过获取描述业务过程的度量来表达业务过程, 包含了引用的维度和与业务过程有关的度量。
事实表中一条记录所表达的业务细节程度被称为粒度。通常粒度可以通过两种方式来表述:一种是维度属性组合所 表示的细节程度;一种是所表示的具体业务含义。
作为度量业务过程的事实,一般为整型或浮点型的十进制数值,有可加性、半可加性和不可加性三种类型。可加性事实 是指可以按照与事实表关联的任意维度进行汇总。半可加性事实只能按照特定维度汇总,不能对所有维度汇总,比如库 存可以按照地点和商品进行汇总,而按时间维度把一年中每个月的库存累加起来则毫无意义。 还有一种度量完全不具备可加性,比如比率型事实。对于不可加性事实可分解为可加的组件来实现聚集。
事实表通常只有很少的列和很多行,是一种“瘦高”型的表。事实表定义为以下三种类型之一:
事务事实表:记录有关特定事件的事实(例如,销售事件,保存在原子的粒度,也称为原子事实表) 周期快照事实表记录给定时间点的事实(例如,月末的帐户详细信息) 累积快照事实表记录了给定时间点的汇总事实(例如,某产品的当月迄今总销售额)
# 维表
维度是维度建模的基础和灵魂。在维度建模中,将度量称为事实,将环境描述为维度,维度是用于分析事实所需要的多样环境。 例如,在分析交易过程时,可以通过买家、卖家、商品和时间等维度描述交易发生的环境。维度所包含的表示维度的列,称为 维度属性。维度属性是查询约束条件、分组和报表标签生成的基本来源,是数据易用性的关键。
维度通常是限定事实的描述性信息。例如,产品维度中的每个记录代表一个特定的产品。与事实表相比,维表通常具有相对较少 的记录,但是每个记录可能具有大量的属性来描述事实数据。维度可以定义各种各样的特征,一些常见的维表:
- 时间维度表:以最低时间粒度级别描述时间
- 地理维度表:描述了位置数据,例如国家/地区/城市
- 产品维度表:表描述了产品的详细信息
- 成员维度表:描述了成员,例如销售人员
# 维度建模的优缺点
# 优点
每次需要从数据库中获取一些信息时,可以不用编写冗长的查询 针对读取进行了优化,可以写更少的 JOIN,更快地返回结果
# 缺点
对数据进行非规范化意味着一次性插入或更新会导致数据异常。在实践中,星型模型是通过批处理实来弥补这一问题 分析灵活性有限。星型模型通常是为特定目的而设计的。在分析需求方面,它不像规范化数据模型那样灵活
# 维度设计的主要流程
# 选择业务过程
业务过程是组织完成的操作性活动,例如:获得订单、处理保险索赔、学生课程注册或每个月每个账单的快照等。 业务过程事件建立或获取性能度量,并转换成事实表中的事实。过程定义了特定的设计目标以及对粒度、维度、事实的定义。
# 声明粒度
粒度用于确定某一个事实表中的行表示什么。粒度声明是设计必须履行的合同。在选择维度或事实前必须声明粒度, 某个候选维度或事实必须与定义的粒度保持一致。在所有维度设计中强制实行一致性是保证 BI 应用性能和易用性的关键。
原子粒度是最低级别的粒度。建议从关注原子级别粒度数据开始设计。同时,上卷汇总粒度对性能调整来说非常重要。 针对不同的事实表粒度,要建立不同的物理表,在同一事实表中不要混用多种不同的粒度。
# 确认维度
维度提供围绕某一业务过程事件所涉及的“谁、什么、何处、何时、为什么、如何”等背景。维度表包含 BI 应用所需要的 用于过滤及分类事实的描述性属性(这也是识别维度的重要依据)。当与跟定的事实表行关联时,任何情况下都应使维度保持单一值。
数据管理与维度表的开放是数据仓库建设的主要工作。
# 确认事实
事实涉及来自业务过程事件的度量,基本上都是以数量值表示。一个事实表行与按照事实表粒度描述的度量时间之间存在 一对一的关系,事实表对应的是一个物理可观察的事件。所有事实只允许与声明的粒度保持一致。
# 事实表技术基础
# 事实表结构
事实表中存储的是现实世界中所发生的操作性事件所产生的可度量数值。从最低级的原子粒度来看,事实表中一行记录对应 现实世界中的一个度量事件。
事实表的设计完全依赖于物理活动,不受可能产生的最终报表的影响。事实表总是包含外键,用于关联与之相关的维度, 也包含可选的退化维度建和日期/时间戳。查询请求的主要目标是基于事实表开展计算和聚集操作。
# 可加、半可加、不可加事实
事实表中的数字度量可划分为三类:
# 可加事实
最灵活、最有用的事实是完全可加,可加性度量可以按照与事实表关联的任意维度汇总。
# 半可加事实
半可加度量可以对某些维度汇总,但不能对所有维度汇总。差额是常见的半可加事实。
# 不可加事实
不可加事实对所有的维度不可加,例如比率。
# 事实表中的空值
事实表中的度量值可以存在空值,因为所有的聚集函数(SUM、COUNT、MIN、MAX、AVG)均可以对空值进行计算。
事实表的维度外键不能存在空值,否则会导致违反参照完整性的情况发生。关联的维度表必须用默认行(代理键)而不是空值外键表示未知的或无法应用的情况。
# 事实表的三种标准类型
事务事实表
事务事实表的一行对应空间或时间上某点的度量事件。原子事务粒度事实表是维度化及可表达的事实表,这类健壮的维度确保对事务数据的最大化分片和分块。
周期快照事实表
周期快照事实表中的每行汇总了发生在某一个标准周期,如某一天、某周、某月的多个度量事件。粒度是周期性的,而不是个体事务。即使周期内没有活动发生,也会在事实表中为每个事实插入包含 0 或空值的行。周期快照事实表的一个典型的应用场景是库存。
累积快照事实表
累积快照事实表的行汇总了发生在过程开始和结束之间可预测步骤内的度量事件。管道或工作流过程(例如,履行订单或索赔过程)具有定义的开始点,标准中间过程,定义的结束点,它们在此类事实表中都可以被建模。通常在事实表中针对过程中的关键步骤都包含时间外键。累积快照事实表中的一行,对应某一具体的订单,当订单产生时会插入一行。但管道过程发生时,累积事实表行被访问并修改(这是很特别的)。
# 维度表技术基础
# 维度表结构
每个维度表都包含单一的主键列。维度表的主键可以作为与之关联的任何事实表的外键,当然,维度表行的技术定义应与事实表行完全对应。
维度表通常比较宽,是扁平型非规范表,包含大量的低粒度的文本属性。操作代码与指示器可作为属性对待,最强有力的维度属性采用冗长的描述填充。
维度表属性是查询及 BI 应用的约束和分组定义的主要目标。报表的描述性标识通常是维度表属性领域值。
# 维度代理键
维度表中会包含一个列,表示唯一主键。该主键不是操作性系统的自然间。 维度主键通常是无意义的整型主键,是按顺序分配的简单整数,以值 1 开始,每次分配自动加 1。但日期维度不需要遵守代理键规则。
# 一致性维度
当不同的维度表属性具有相同的列名和领域内容时,称维度表具有一致性。
# 缓慢变化维度
类型:
原样保留
重写
增加新行
增加新属性
增加微型维度
增加微型维度及类型 1 支架
增加类型 1 属性到类型 2 维度
双类型 1 和类型 2 维度