...
Smartbi的数据模型基于成熟的建模理论和方法,总体而言主要体现在两方面:模型架构和模型表关系。
事实数据表
事实数据表用于存储累积的行,这些行表示观察结果或记录特定业务活动的事件。 例如,销售事实数据表中存储的事件可以是销售订单和订单行。 也可以使用事实数据表记录存货变动、存货结余或每日汇率。 事实数据表通常包含大量的行。 随着时间的推移,事实数据表行将累积。 在分析查询(将在此模块的后续部分对它进行定义)中,通过汇总事实数据表数据来生成值,如销售额和数量。
维度表
维度表描述业务实体,这些实体通常表示人员、地点、产品或概念。 日期维度表是常见的概念维度表示例,此表会针对每个日期包含一个行。 借助维度表中的列,可以对事实数据表数据进行筛选和分组。
每个维度表都必须具有一个唯一列,此列称为键列。 唯一列不包含重复的值,并且任何情况下都不会有缺失的值。 在产品维度表中,此列可能命名为“ProductKey”或“ProductID”。 其他列可能会存储描述性的值,如产品名称、子类别、类别、颜色等。 在分析查询中,这些列用于对数据进行筛选和分组。
比较事实数据表和维度表
下图比较了事实数据表和维度表的特征。
特征 | 维度表 | 事实数据表 |
---|---|---|
模型用途 | 存储业务实体 | 存储事件或观察结果 |
表结构 | 包含一个键列和用于进行筛选和分组的描述性列 | 包括维度键列和可以汇总的数值度量值列 |
数据卷 | 通常包含的行较少(相对于事实数据表) | 可以包含大量行 |
查询用途 | 用于筛选和分组 | 用于汇总 |
...
可以理解为一张大宽表,指标、维度、属性关联在一起的一张表,如下图:
3 模型相关概念
我们在Smartbi设计数据模型架构前,需要对模型设计紧密相关的概念有清晰的认识和理解:我们在Smartbi设计数据模型架构前,需要对模型设计紧密相关的概念有清晰的认识和理解;维度建模的概念,并不是Smartbi提出来的,早在很久之前,就有维度建模的概念,相关的名称也都是已存在的。
3.1 度量值
...
度量通常是指数据集合中可数的数值型属性,通常用于数据的统计分析、计算和比较,例如计算平均值、最大值、最小值、合计等;在构建模型时,需要理解业务需求、上下文和目标,帮助选择合适的维度和度量,确保分析结果与业务实际情况相符合。
Smartbi数据模型中的度量值表达式通常利用 聚合函数(如 SUM、MIN、MAX、AVERAGE 等)在查询时生成标量值结果(值永远不会存储在模型中)。
度量值表达式涵盖广泛,从简单的列聚合到更复杂的公式应有尽有,这为模型开发者提供了便利,因为在很多情况下都无需写MDX表达式创建度量值: 如“订单明细”表中的“销售量”列可以通过多种方式进行汇总(包括 SUM、COUNT、AVERAGE、MEDIAN、MIN、MAX 等)。
3.2 维度
维度通常指数据集合中的属性数量或维度数量,用于描述数据的不同方面和特征,并支持数据的分类、分组和汇总,以及数据的可视化和多维分析,维度是定性的、被描述的、不能被测量的。下面具体说明各种维度类型。
3.2.1 雪花维度
雪花维度是单个业务实体的一组规范化表 。例如:“产品”维度经过了规范化并存储在两个相关表中:产品类别维度和产品维度。这些规范化表位于事实数据表之外,形成雪花形状的设计。
...
在选择集成到一个模型表中时,还可以定义一个层次结构,其中包含维度的最高和最低粒度。 冗余非规范化数据的存储可能会增加模型存储大小,尤其是在维度表很大的情况下。
3.
...
角色扮演维度是能以不同方式筛选相关事实的维度 。 例如,在Northwind中,订单维度表与订单销售明细事实之间有三种关系:可以使用同一维度表中按订单日期、发货日期或交货日期筛选事实。
数据仓库中接受的设计方法是定义单个日期维度表。 在查询时,日期维度的“角色”是通过用于联接表的事实列建立的。 例如,在按订单日期分析销售情况时,表联接与订单日期列相关。
在Smartbi数据模型中,我们用一种常见的建模方法解决,就是为每个角色扮演实例创建维度类型表。 该模型可以包含日期表、发货日期表和交货日期表,每个表与其对应的销售表列之间都存在单一且活动的关系 。
3.4 杂项维度
如果有多个维度,特别是包含几个属性(可能只有一种)并且这些属性的值很少时,则杂项维度非常有用 。
合适的候选项包括订单状态列或客户人口统计列(性别、年龄分组等)。
杂项维度的设计目标是将多个“小”维度合并为一个维度,以减少模型的存储大小,还可以通过呈现更少的模型表来缓解“字段”窗格的混乱情况 。
杂项维度表通常是所有维度属性成员的笛卡尔积,具有唯一标识列。 可以在数据仓库中构建维度,也可以通过使用Smartbi数据模型中的私有查询创建,并此查询作为维度类型表加载到模型中。
...
2.2 退化维度
退化维度指的是筛选所需的事实数据表的属性 。 我们的northwind中就有一个例子,就是销售订单号。 在这种情况下,创建仅包含这一列的独立表对模型设计并没有什么积极作用,因为这会增加模型的存储大小,并导致“字段”窗格混乱 。
在Smartbi模型中,可以将销售订单号列添加到事实类型表,以允许按销售订单号进行筛选或分组。
3.
...
3 无事实事实数据表
无事实事实数据表不包含任何度量值列 。 它仅包含维度键。
...
无事实事实数据表的更有力的用途是存储维度之间的关系,例如,假设销售人员可以分配到一个或多个销售区域 , 则需要设计为包含两列的无事实事实数据表:销售人员键和区域键, 这两列中可以存储重复的值。
3.
...
4 模型表关系
模型设计过程中,模型表的关系也是很重要的一项内容,详细可查阅:设置查询关系。
关系的确立需要通过匹配键列中的数据(通常是两表中同名的列)。在大多数情况下,该关系会将一个表中的主键(它为每行提供了唯一标识)与另一个表的外部键中的某项相匹配。例如,通过创建 orderdetails表中的 orderid(主键)与orders 表中的 orderid 列(外部键)之间的关系,则销售量就与订单相关联了。
3.
...
4.1 一对多(多对一)关系
一对多和多对一是相对关系,如下列的课程表与老师表:
...
Course表中的T_id字段建立外键约束,指向Teacher表中的T_id。
3.
...
4.2 一对一关系
在一对一关系中,A 表中的一行最多只能匹配于 B 表中的一行,反之亦然。比如,一个人只能有一个身份证号,一个身份证号只能属于一个人。
...
- 分割具有多列的表。
- 由于安全原因而隔离表的一部分。
- 保存临时的数据,并且可以毫不费力地通过删除该表而删除这些数据。
- 保存只适用于主表的子集的信息。
3.
...
4.3 多对多关系
多对多的关系,可以看成是两个多对一的关系,如下的课程表和学生表:
...