配置关系

已完成

当您的模型包含多个表时,您需要确保表之间存在适当的关系。 关系将应用于一个模型表的筛选器传播到另一个模型表。 只要有关系路径可遵循,它们就会继续传播,这可能涉及传播到多个表。

例如,当视觉对象筛选 Date 表的 Year 列时,与 Sales 表的关系会自动筛选该表,以便汇总表示该年度销售额的行。 对于报表作者,这是正常行为,也是预期行为。

以下动画示例展示了关系如何将筛选器传播到其他表。

关系筛选器传播的动画图表。

配置数据加载选项

在应用 Power Query 查询以将数据加载到模型之前,您应首先检查 Power BI Desktop 数据加载 选项,并在必要时对其进行调整。

具体而言,您可能希望启用或禁用关系设置。 启用后,这些设置可以导入源数据中检测到的关系,在刷新数据时更新或删除关系,以及自动检测新关系。

显示上一段中描述的关系选项的屏幕截图。

如果未自动创建关系,您可以在管理关系窗口中创建或通过切换到“模型”视图来创建。

有时,表不需要与另一个模型表(称为断开连接的表)建立关系。 当您想要支持 What-if 应用情景或字段参数时,断开连接的表很有用。 本模块后面将介绍这两个应用场景。

注意

有关模型关系的完整说明以及指向相关指导文章的链接,请参阅 Power BI Desktop 中的模型关系

每个关系都包含一个“源”列和一个“目标”列。 重要的是,这些列的数据类型相同(或等效),并且它们包含匹配的值。

在 Power Query 中定义表结构时,您应考虑模型所需的关系。 若要支持关系的一侧(接下来将进行介绍),您必须确保该列包含唯一值。 此外,如果数据源具有多列键,则需要转换数据以为相关表生成单列键。 如果相关列数据类型不匹配,您可以使用 Power Query 调整数据类型。

了解基数

每个关系都有一个基数类型,该类型包括:

  • 一对多 (1:*)
  • 多对一 (*:1)
  • 一对一 (1:1)
  • 多对多 (*:*)

当 Power BI Desktop 自动创建关系时,它会根据已加载到列中的值确定基数。 有时,它可能无法正确设置(因为表尚未加载数据行),因此您需要更新设置。

一对多多对一 关系基本相同,只是方向不同。 它们是最常设置的基数类型,通常支持星形架构设计中的维度表(“一”端)和事实表(“多”端)之间的关系。

例如,Product 表中的 ProductKey 列与 Sales 表中的 ProductKey 列具有一对多关系。

注意

本单元中的模型图的屏幕截图仅显示在关系中使用的列。

屏幕截图显示“Product”表与“Sales”表具有一对多关系。

一对一 基数允许您关联两个表,每个表都有唯一列。 这种类型的关系并不常见,因为人们认为使用 Power Query 合并查询以生成单个模型表是一种更好的做法。 这样可以减少模型表的数量,并为报表作者提供更直观的体验,使他们能够在单个表中查找相关字段。

考虑以下应用场景:有一个包含 Cost Price 列的 Product Cost 表,该表源自补充数据存储。 其 SKU 列包含产品库存单位 (SKU)。 当与包含 ProductKey 列的 Product 表创建关系时,将建立一对一关系,因为这两列都包含唯一值。

在第二个应用场景中,建模人员采用不同的方法。 他们将 Power Query 查询合并在一起,并将 Cost Price 列添加到 Product 查询。 然后,他们禁用 Cost Price 查询的加载。 只会生成一个“product”表。

屏幕截图显示了所描述应用场景的结果,从而生成一个现在包含“Cost Price”的“Product”表。

多对多 基数允许您配置模型表之间的复杂关系。 当不存在唯一值列时,这很有用。 例如,Target 表在产品类别级别存储事实,但 Product 表在产品 SKU 级别存储产品。 ProductKey 列存储 SKU,而 Category 列存储类别名称,其中包括许多重复项。 将 Product 表的 Category 列与 Target 表的 Category 列关联时,基数必须设置为多对多。 在这种情况下,它允许在更高级别或粒度上将维度表与事实表相关联。

了解交叉筛选器方向

模型关系是使用交叉筛选器方向定义的。 方向可决定筛选器的传播方式。 如果存在“一端”,则筛选器始终传播到另一端。 如果存在“多”端,也可以允许传播到另一端。

可能的交叉筛选器选项取决于关系基数类型:

  • 一对多(或多对一):单个或两者
  • 一对一:两者
  • 多对多:单个到任一表,或两者

一般来说,避免或尽量减少两个方向的交叉筛选器是一种很好的做法。 这是因为它会带来更好的查询性能,并且通常为报表使用者提供直观的体验。

允许在两个方向上对一对多关系进行交叉筛选的一个有效原因是在两个维度表之间启用多对多分析。 考虑以下示例:销售人员分配到多个区域,而反过来,各个区域也可以分配多个销售人员。 若要实现本设计,您的模型需要一个关联销售人员和区域的桥接表。

以下屏幕截图显示将 Salesperson 表与 Sales 表相关联的模型图。 SalespersonRegion 表是一个桥接表,其中包含 EmployeeKeySalesTerritoryKey 列,这两列都不包含唯一值。 请注意筛选器传播的工作原理:

  1. 应用于 Salesperson 表的筛选器将传播到 SalespersonRegion 表。
  2. 应用于 SalespersonRegion 表的筛选器将传播到 Region 表,因为两个方向都支持交叉筛选
  3. 应用于 Region 表的筛选器将传播到 Sales 表。

屏幕截图显示了上一个已排序列表中描述的筛选器传播。

活动与非活动关系

两个模型表之间只能有一个处于活动状态的筛选器传播路径。 但是,可以引入其他关系路径,但必须将这些关系设置为非活动。 只有在对模型计算求值期间使用 USERELATIONSHIP DAX 函数,非活动关系才能变为活动状态。

与维度表存在多个关系很常见,这称为角色扮演维度。 例如,假设 Sales 表包含两个日期列:OrderDateShipDate。 但是,如果将这两列关联到 Date 表,则只有一个关系处于活动状态。

若要允许按订单日期、装运日期或同时按这两个日期进行筛选,需要两个日期表。 通过创建 Order DateShip Date 表,每个表都可以与 Sales 表建立活动关系。

以下屏幕截图比较了两个模型设计应用场景。 第一个应用场显示具有活动和非活动关系的单个日期表。 第二个应用场显示两个日期表,每个表都具有活动关系。 (活动关系用实线表示;非活动关系用虚线表示。)

屏幕截图显示上述应用场景的结果,从而生成“Order Date”和“Ship Date”表,而不是具有两种关系的单个日期表。

使用模型图

在模型图中,关系由连接表的线表示。

创建关系的一种简单方法是在模型表中在表之间拖放列。 编辑关系的一种简单方法是双击它。

您可以通过在模型图中查看关系来解释关系的属性:

  • 关系的基数由位于关系线末端的“一”(1) 或“多”(*) 图标描述。
  • 关系的交叉筛选器方向由位于关系线中间的箭头描述。
  • 活动关系是一条实线;非活动关系是一条虚线。

若要确定哪些列相关,可以将光标悬停在关系上以突出显示相关列。