活动
3月31日 23时 - 4月2日 23时
最终的 Power BI、Fabric、SQL 和 AI 社区主导活动。 3月31日至4月2日。 将代码 MSCUST 用于 150 美元的折扣。 价格上涨2月11日。
立即注册本文专为使用 Power BI Desktop 的数据建模人员而撰写。 它指导你何时创建双向模型关系。 双向关系是一种双向筛选的关系。
备注
本文不涵盖对模型关系的介绍。 如果你对模型关系、其属性或配置方法并非完全熟悉,建议先阅读 Power BI Desktop 中的模型关系一文。
此外,还应了解星型架构设计,这一点也很重要。 有关详细信息,请参阅了解星型架构和 Power BI 的重要性。
通常,建议尽量减少使用双向关系。 这是因为它们可以对模型查询性能产生负面影响,并可能为报表用户带来令人困惑的体验。
但是,双向筛选可以解决特定要求时,有三种情况:
在创建以下两种特殊模型关系类型时,双向关系起着重要作用:
双向关系可提供将选项限制在数据所在位置的切片器。 (如果你熟悉 Excel 数据透视表和切片器,则从 Power BI 语义模型或 Analysis Services 模型采购数据时,这是默认行为。为了帮助解释含义,请先考虑以下模型关系图。
第一个表名为 Customer
.,其中包含三列:Country-Region
、Customer
和 CustomerCode
。 第二个表命名为 Product
,它包含三列:Color
、Product
和 SKU
。 第三个表命名为 Sales
,其中包含四列:CustomerCode
、OrderDate
、Quantity
和 SKU
。 Customer
和 Product
表是维度表,每个表都与 Sales
表有一对多关系。 每个关系都是单向筛选。
为了帮助介绍双向筛选的工作原理,模型图已修改为显示表行。 本文中的所有示例都以此数据为依据。
下面的项目符号列表介绍了三个表的行详细信息:
Customer
表包含两行:CustomerCode
CUST-01、Customer
Customer-1、Country-Region
美国CustomerCode
CUST-02、Customer
Customer-2、Country-Region
澳大利亚Product
表有三行:SKU
CL-01、 Product
T 恤、Color
绿色SKU
CL-02,Product
牛仔裤,Color
蓝色SKU
AC-01、Product
帽子、Color
蓝色Sales
表有三行:OrderDate
2019 年 1 月 1 日,CustomerCode
CUST-01,SKU
CL-01,Quantity
10OrderDate
2019 年 2 月 2 日,CustomerCode
CUST-01,SKU
CL-02,Quantity
20OrderDate
2019 年 3 月 3 日,CustomerCode
CUST-02,SKU
CL-01,Quantity
30现在来看看下面的报表页。
报表页包含两个切片器和一个卡视觉对象。 第一个切片器基于 Country-Region
字段,它有两个选项:澳大利亚和美国。 此切片器当前按“澳大利亚”切片。 第二个切片器以 Product
字段为基础,它有三个选项:帽子、牛仔裤和 T 恤。 未选中任何项(即未按任何产品筛选)。 卡视觉对象显示数量 30。
当报表用户按“澳大利亚”进行切片时,你可能希望将“产品”切片器限制为显示与澳大利亚销售额相关的数据的选项。 这就是显示“使用数据”的切片器选项的含义。 可将 Product
与 Sales
表之间的关系设置为双向筛选来实现此行为。
“产品”切片器现列出一个选项:T 恤。 此选项表示向澳大利亚客户销售的唯一产品。
首先,建议仔细考虑此设计是否适用于报表用户。 一些报表用户发现这种体验令人困惑,因为他们不理解为什么切片器选项在与其他切片器交互时会动态出现或消失。
如果你确实决定显示“使用数据”的切片器选项,则建议不要设置双向关系。 双向关系需要更多的处理,因此它们可以对查询性能产生负面影响,尤其是在模型中双向关系的数量增加时。
有一种更好的方法来实现相同的结果:而不是使用双向筛选器,可以将视觉级筛选器应用于产品切片器本身。
现在来看看,Product
与 Sales
表之间的关系不再双向筛选。 并且,以下度量值定义已添加到 Sales
表中。
Total Quantity = SUM(Sales[Quantity])
若要显示“使用数据”的“产品”切片器选项,只需按使用“非空白”条件的 Total Quantity
度量值筛选即可。
另一种涉及双向关系的场景将事实表视为桥接表。 通过这种方式,支持在不同维度表的筛选器上下文中分析维度表数据。
使用本文中的示例模型,考虑如何回答下列问题:
这两个问题都可得到回答,无需汇总桥接事实表中的数据。 但是,它们确实要求筛选器从一个维度表传播到另一个维度表。 当筛选器通过事实数据表传播时,可以使用 DISTINCTCOUNT DAX 函数实现维度表列的汇总,也可能会用到 MIN 和 MAX DAX 函数。
事实数据表的行为与桥接表类似,可以应用多对多关系指南来关联两个维度表。 它将要求设置至少一个关系,以实现双向过滤。 有关详细信息,请参阅 多对多关系指南。
不过,正如本文中所述,这种设计可能会对性能产生负面影响,并对用户体验产生与“使用数据”的切片器选项相关的影响。 因此,建议改用 CROSSFILTER DAX 函数在度量值定义中激活双向筛选。 可使用 CROSSFILTER 函数在表达式求值期间修改筛选器方向,甚至还可用于禁用关系。
现在来看看添加到 Sales
表的以下度量值定义。 在此示例中,Customer
与 Sales
表之间的模型关系已设置为单向筛选。
Different Countries Sold =
CALCULATE(
DISTINCTCOUNT(Customer[Country-Region]),
CROSSFILTER(
Customer[CustomerCode],
Sales[CustomerCode],
BOTH
)
)
在计算 Different Countries Sold
度量值期间,Customer
表与 Sales
表之间的关系双向筛选。
下面的表视觉对象显示了每种售出产品的统计信息。 Quantity
列只是数量值的总和。 Different Countries Sold
列显示所有已购买产品的客户的国家/地区值的非重复计数。
有关本文的详细信息,请参阅以下资源:
活动
3月31日 23时 - 4月2日 23时
最终的 Power BI、Fabric、SQL 和 AI 社区主导活动。 3月31日至4月2日。 将代码 MSCUST 用于 150 美元的折扣。 价格上涨2月11日。
立即注册培训
认证
Microsoft Certified: Power BI Data Analyst Associate - Certifications
展示与使用 Microsoft Power BI 进行建模、可视化和分析数据的业务和技术要求相一致的方法和最佳实践。
文档
开发多对多模型关系的指南。
使用活动或非活动模型关系的指南。
有关如何理解、开发和使用 Power BI 中的一对一模型关系的指南。