使用关系和基数

已完成

与其他数据库管理系统不同,Power BI 具有关系的方向性的概念。 此方向性在筛选多个表之间的数据方面扮演重要角色。 加载数据时,Power BI 通过匹配列名自动查找数据中存在的关系。 也可以使用“管理关系”来手动编辑这些选项。

例如,你已从 Sales 数据库中检索了许多表,且下图是语义模型的示例。 Power BI 已自动检测到多个关系,但你无法识别它们的含义。 你想要确保这些关系能够准确反映数据中存在的关系。

示例语义模型的屏幕截图

关系

以下是在 Power BI 中可以找到的不同类型的关系。

多对一 (*:1) 或一对多 (1: *) 关系

  • 描述一种关系,在这种关系中,一列中某个值的许多实例仅与另一列中的一个唯一对应实例相关。

  • 描述事实数据表和维度表之间的方向性。

  • 是最常见的方向性类型,并且是自动创建关系时的 Power BI 默认设置。

一对多关系的一个示例是“CountryName”表和“Territory”表之间的关系,其中可以有多个与一个唯一国家/地区相关联的区域。

多对一关系的屏幕截图。

一对一 (1:1) 关系:

  • 描述一种关系,在这种关系中,两个表之间只共有某个值的一个实例。

  • 两个表中都需要唯一值。

  • 不建议使用,因为此关系会存储冗余信息,并表明模型设计不正确。 更好的做法是合并表。

一对一关系的一个示例是在两个不同的表中存储产品和产品 ID 的情况。 创建一对一关系是不必要的做法,应该将这两个表合并。

一对一关系的屏幕截图。

多对多 (.) 关系:

  • 描述两个表之间共有许多值的关系。

  • 关系中的任一表中都不需要唯一值。

  • 不建议使用,缺少唯一值会引入多义性,用户可能不知道哪一列值指代哪些对象。

例如,下图显示“Sales”表和“Order”表之间的“OrderDate”列上的多对多关系,因为多笔销售可以有多个订单与其关联。 由于两个表的订单日期可以相同,因此引入了多义性。

多对多关系的屏幕截图。

交叉筛选方向

可以在关系的一侧或两侧筛选数据。

使用单个交叉筛选方向:

  • 关系中只有一个表可用于筛选数据。 例如,表 1 可以按表 2 进行筛选,但表 2 不能按表 1 进行筛选。

    提示

    按照表之间的关系上的箭头方向确定筛选器的流动方向。 通常情况下,你会希望这些箭头指向事实数据表。

  • 对于一对多或多对一关系,交叉筛选方向将来自“一”侧,这意味着筛选将在具有多个值的表中进行。

使用两个交叉筛选方向或双向交叉筛选:

  • 关系中的一个表可用于筛选另一个表。 例如,可以通过事实数据表筛选维度表,也可以通过维度表筛选事实数据表。

  • 将双向交叉筛选用于多对多关系时,性能可能会降低。

关于双向交叉筛选的警告:除非完全了解启用双向交叉筛选关系导致的后果,否则不应启用双向交叉筛选关系。 启用它可能导致多义性、过度采样、意外结果以及可能的性能降低。

基数和交叉筛选方向

对于一对一关系,唯一可用的选项是双向交叉筛选。 可以在此关系的任一侧对数据进行筛选,并生成一个含义明确的非重复值。 例如,可以对一个产品 ID 进行筛选并返回一个产品,也可以对一个产品进行筛选并返回一个产品 ID。

对于多对多关系,可以通过使用双向交叉筛选选择在单个方向或两个方向上进行筛选。 多对多关系会放大与双向交叉筛选相关联的多义性,因为不同表之间将存在多个路径。 如果创建度量值、计算或筛选器,​​则在筛选数据的位置可能出现意外后果,并且根据 Power BI 引擎在应用筛选器时选择的关系,最终结果可能会有所不同。 双向关系也是如此,这正是为什么在使用它们时要格外小心的原因。

出于此原因,多对多关系和/或双向关系很复杂。 除非确定数据在聚合后会发生的变化,否则具有多个筛选方向的这类开放式关系可在数据中引入多个路径。

创建多对多关系

考虑负责生成视觉对象来检查客户和帐户预算的方案。 你可以在同一个帐户上拥有多个客户,也可以在同一个客户中拥有多个帐户,因此需要创建多对多关系。

多对多关系的屏幕截图。

若要创建此关系,请转到“管理关系”>“新建”。 在显示的窗口中,在“CustomerTable”和“AccountTable”的“Customer ID”列之间创建关系。 关系设置为多对多,且筛选类型设置为两个方向。 你将立即收到警告,指出仅在预期这两个列都不具有唯一值的情况下才应使用这种类型的关系,因为可能会获得非预期值。 由于想要在两个方向进行筛选,请选择“双向交叉筛选”。

选择“确定”。 现在,你已成功创建多对多关系。

“管理关系”中的多对多关系的屏幕截图。

有关详细信息,请参阅 Power BI 中的多对多关系