Smartbi的数据模型基于成熟的建模理论和方法,总体的而言主要体现在两方面:模型架构和模型表关系。

模型架构

数据模型是围绕事实表和维度表的关系而进行模型的构建:

Smartbi支持星型模型和雪花模型:

星型模型强调的是对维度进行预处理,将多个维度集合到一个事实表,形成一个宽表。

雪花模型是对星型模型的扩展,它对星型模型的维表进一步层次化,原有的各维表可能被扩展为小的事实表,形成一些局部的 "层次 " 区域,这些被分解的表都连接到主维度表而不是事实表。如将产品维表分解为产品类别维表。

相关概念

我们在Smartbi设计数据模型架构前,需要对模型设计紧密相关的概念有清晰的认识和理解:

度量值

度量值是存储要汇总的值的事实数据表列。

Smartbi数据模型中的度量值表达式通常利用 DAX 聚合函数(如 SUM、MIN、MAX、AVERAGE 等)在查询时生成标量值结果(值永远不会存储在模型中)。 度量值表达式涵盖广泛,从简单的列聚合到更复杂的公式应有尽有,这为模型开发者提供了便利,因为在很多情况下都无需创建度量值: 如“订单明细”表中的“销售量”列可以通过多种方式进行汇总(包括 SUM、COUNT、AVERAGE、MEDIAN、MIN、MAX 等),无需为每种可能存在的聚合类型创建度量值 。

雪花维度

雪花维度是单个业务实体的一组规范化表 。例如:“产品”维度经过了规范化并存储在两个相关表中:产品类别维度和产品维度。这些规范化表位于事实数据表之外,形成雪花形状的设计。

在 Smartbi数据模型 中,可以选择模仿雪花维度设计,也可以将源表(非规范化)通过私有查询的方式集成到单个模型表中。如下图所示:

一般而言,单个模型表的优点比多个模型表的优点更多,最理想的决策取决于数据量和模型的可用性要求。

在选择集成到一个模型表中时,还可以定义一个层次结构,其中包含维度的最高和最低粒度。 冗余非规范化数据的存储可能会增加模型存储大小,尤其是在维度表很大的情况下。

渐变维度


角色扮演维度


模型表关系

模型设计过程中,模型表的关系也是很重要的一项内容。

关系的确立需要通过匹配列中的数据(通常是两表中同名的列)。在大多数情况下,该关系会将一个表中的主键(它为每提供了唯一标识)与另一个表的外部键中的某项相匹配。例如,通过创建 orderdetails表中的 orderid(主键)与orders 表中的 orderid 列(外部键)之间的关系,则销售量就与订单相关联了。

一对多(多对一)关系

一对多关系是最普通的一种关系。在这种关系中,A 表中的一行可以匹配 B 表中的多行,但是 B 表中的一行只能匹配 A 表中的一行。例如,publishers 和 titles 表之间具有一对多关系:每个出版社出版很多书,但是每本书名只能出自一个出版社。

只有当一个相关列是一个主键或具有唯一约束时,才能创建一对多关系。

一对一关系

在一对一关系中,A 表中的一行最多只能匹配于 B 表中的一行,反之亦然。如果相关列都是主键或都具有唯一约束,则可以创建一对一关系。

这种关系并不常见,因为一般来说,按照这种方式相关的信息都在一个表中。可以利用一对一关系来:

多对多关系

多对多关系中,A 表中的一行可以匹配 B 表中的多行,反之亦然。要创建这种关系,需要定义第三个表,称为结合表,它的主键由 A 表和 B 表的外部键组成。例如,authors 和 titles 表具有多对多关系,这是由于这些表都与 titleauthors 表具有一对多关系。titleauthors 表的主键是 au_id 列(authors 表的主键)和 title_id 列(titles 表的主键)的组合。

目前Smarbi数据模型构建仅支持一对多(多对一)和一对一关系。

模型选型

星型模型和雪花模型在架构体系中各有优劣,其对比如下:

区别项

星型模型

雪花模型

维度表

一级维度表

多级维度表(子维度表)

存储空间

数据冗余度

表宽度

扩展性

Join复杂度

查询逻辑

简单

查询速度

可读性

简单

OLAP建模工具优化度

数据总量
可读性容易
表个数

在实际业务场景中,往往是两种模型的综合应用。