使用关系和基数
与其他数据库管理系统不同的是,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 中的多对多关系。