所谓模型的关系,是模型中的两个表,通过两个列建立的连接。关系的用途,是把过滤器从一个表传递到其他表。过滤器传递的方向,是关系的方向;过滤器传递的路径,是由两个表之间相关联的两列组成的。表,表之间的关联,以及关联的方向,也构成了数据模型。因此,对于一个数据模型来说,关系传播的路径是确定的,这意味着,过滤器(Filter)始终以相同的方式传播,并且不会随机变化。但是关系可以被DAX函数禁用,或者通过DAX函数来激活不活跃的关系,以动态改变过滤器上下文。
一,星型数据模型
所谓星型数据模型,就是指多个维度表指向一个Fact表,维度表和Fact表之间的关系是1对多。星型模型的优点是:模型的关系可以有效低传播到Fact表。
二,关系的属性
创建关系是指把表的一列和其他表的一列关联起来,这两列的数据类型必须相同,且关系具有方向,关系的方向就是过滤器的走向。
1,关系的基数(cardinality)类型
基数有四种,分别代表from列和to列的数据特征:
- One-to-many (1:*):from列的值是唯一的,且from列的一个值对应to列的多个值,其他基数类型,读者自己推演。
- Many-to-one (*:1)
- One-to-one (1:1)
- Many-to-many (*:*)
需要注意的是:基数类型的one端,必须是包含唯一值的列。
2,关系的方向,
关系的方向也称作交叉过滤方向(Cross filter direction),这个设置决定了过滤器传播的方向,交叉过滤的方向取决于基数类型,如下表所示:
顾名思义,
- Single:表示单向
- Both:表示双向
三,跟关系有关的DAX函数
- RELATED: 从关系的one端获取一个值,用于在Row Context中从其他表获取一个数据
- RELATEDTABLE: 从关系的many端获取一个表
- USERELATIONSHIP: 在CALCULATE函数中使用一个不活跃的关系
- CROSSFILTER:把关系的方向(cross filter direct)修改为single或both,或者把关系的传播禁掉。
- TREATAS:把一个表表达式的结果作为模型关系中的一个表,该函数作用的结果是:这个表表达式等价于关系中的一个表,因此,该表达式可以作为一个过滤器,并传播过滤器上下文,用于对数据集进行过滤。
四,关系评估(Relationship evaluation)
从评估的角度来看,模型关系分为常规关系和有限关系。实际上,它是根据两个关联表的基数类型和数据源推断出来的。了解评估类型非常重要,因为如果数据完整性受损,可能会对性能或其他方面产生影响。本主题将介绍这些影响和完整性后果。
首先,需要一些建模理论才能完全理解关系评估。
导入模型或 DirectQuery 模型的所有数据都来自 Vertipaq 缓存或源数据库。在这两种情况下,Power BI 都能确定关系的“一”侧存在。
然而,复合模型可以包含使用不同存储模式(导入、DirectQuery 或双重)的表,或多个 DirectQuery 源。每个源(包括导入数据的 Vertipaq 缓存)都被视为一个源组。然后,模型关系可以分为源组内或源组间/跨源组。源组内关系关联源组内的两个表,而源组间/跨源组关系关联两个源组之间的表。请注意,导入或 DirectQuery 模型中的关系始终是源组内的关系。
1,常规关系
当查询引擎能够确定关系的“一”侧时,模型关系即为常规关系。它确认“一”侧列包含唯一值。所有一对多源组内关系均为常规关系。
对于导入模型,所有数据都存储在 Vertipaq 缓存中,Power BI 会在数据刷新时为每个常规关系创建一个数据结构。这些数据结构由所有列到列值的索引映射组成,其目的是在查询时加速表的连接。
在查询时,常规关系允许进行表扩展。表扩展会创建一个虚拟表,方法是包含基表的原生列,然后扩展为相关表。对于导入表,表扩展在查询引擎中完成;对于 DirectQuery 表,表扩展在发送到源数据库的原生查询中完成(只要未启用“假定引用完整性”属性)。然后,查询引擎会对扩展后的表进行操作,应用筛选器并根据扩展表列中的值进行分组。
空白虚拟行:
- 对于一对多关系,表扩展通过使用 LEFT OUTER JOIN 语义从“多”侧向“一”侧进行。当“多”侧到“一”侧不存在匹配值时,会向“一”侧表添加一个空白虚拟行。此行为仅适用于常规关系,不适用于有限关系。
- 一对一源组内关系也会进行表扩展,但使用 FULL OUTER JOIN 语义。此连接类型可确保在必要时在任意一侧添加空白虚拟行。
- 空白虚拟行实际上是未知成员。未知成员表示违反了引用完整性,即“多”侧值没有对应的“一”侧值。理想情况下,这些空白不应该存在。可以通过清理或修复源数据来消除它们。
2,有限关系(Limited relationships)
当模型关系无法保证“一”侧时,该关系即为有限关系。有限关系可能由以下两个原因造成:
- 该关系使用多对多基数类型(即使一列或两列包含唯一值)。
- 该关系为跨源组关系(这种情况只适用于复合模型)。
对于导入模型,永远不会为有限关系创建数据结构。在这种情况下,Power BI 会在查询时解析表连接。
有限关系永远不会发生表扩展。表连接是通过使用 INNER JOIN 语义实现的,因此,不会添加空白虚拟行来补偿引用完整性违规。
还有其他与有限关系相关的限制:
- RELATED DAX 函数不能用于检索“一”侧列的值。
- 强制执行 RLS 存在拓扑限制。