跳至主要内容

Power BI 数据建模教程

了解什么是 Power BI 中的数据建模,以及良好的数据建模实践如何将您的 Power BI 报告提升到新的水平。
· 11分钟 阅读

使用 AI 探索

良好的数据建模实践对于构建 Power BI 报告至关重要,它能优化性能并按需扩展。

本教程使用了微软提供的示例数据集,但根据本文将讨论的数据建模最佳实践进行了调整。您可以在此处下载数据集。

什么是数据建模?

数据建模是创建数据结构之间连接的可视化表示的过程,并包含这些数据结构内各个属性的信息。

谈到数据建模,最常听到的术语是星型架构。这是一种被广泛采用的数据仓库与关系数据库设计方法,同样也是在Power BI 中推荐采用的方法。

使用星型架构有两个主要好处:

  • 可用性:星型架构让您的数据模型更简洁有序,报表也更易使用。
  • 性能:星型架构便于将报表扩展到海量数据。DAX 度量计算更快,Power BI 报表整体刷新更迅速。

星型架构如何工作?

星型架构由一个中心事实表与多个从该事实表分支出去的维度表组成,外观类似一颗星。理想情况下,一个数据模型最好只包含一个事实表。不过,在 Power BI 中包含多个事实表也是可行的。

Power BI Star Schema Screenshot 1Power BI 星型架构。作者供图

事实表由可汇总和聚合的数值以及一个或多个用于连接维度表的键组成。键的作用是建立表与表之间的连接。若数据模型复杂或数据量大,建议将键设置为数值而非文本字符串,以提升模型性能。

事实表应尽可能“窄”,包含的列越少越好。任何用于描述数据集特征的列,如产品名称或产品类别,都应从事实表中分离出来(如果数据仓库中尚未分离),放入相应的维度表。这一过程称为数据规范化,其目标是避免重复。

维度表用于描述数据集的特征,并将特征按逻辑分组到不同的表中,避免单表臃肿或导致难以创建关系。维度表应包含其所描述特征的唯一值,其列将在 Power BI 报告中用于筛选或分组数据。

星型架构的扩展是雪花架构。在这种方法中,如果某个特征还有进一步的类别或子类别,则会对维度表进行进一步拆分。在我们的示例中,Products 表包含产品 ID、产品名称和产品类别。在雪花架构中,Products 表仅包含产品 ID 和产品名称,而产品类别会被拆分到其独立的表中,包含产品类别 ID 和产品类别。

Power BI Star Schema Screenshot 2Power BI 雪花架构。作者供图

然而,使用雪花架构可能会不必要地增加数据模型的复杂性;引入这些额外的表可能降低性能,并让关系的创建变得困难且容易混淆。

如何在 Power BI 中创建关系

在 Power BI 中创建关系有两种方式:

  1. 从一个表中选择字段,将其拖动到第二个表中您希望建立关系的字段上。
  2. 在功能区中选择“管理关系”,然后选择“新建”,通过我们接下来要讨论的同一窗口来添加关系(只是该窗口将以空白开始)。

默认情况下,Power BI 会尝试推断表之间的关系;它并非总能判断正确,因此您可能希望在设置中关闭此功能,或删除任何自动创建的关系。要编辑关系,请右键单击它们之间的连接线并选择“属性”。

在定义关系时,此窗口有两个值得关注的选项:基数和交叉筛选方向。每个选项的选择都会对最终报表产生较大影响,请谨慎决定。我们逐一拆解这些选项。

Edit relationship in Power BI screenshot在 Power BI 中创建关系。作者供图

基数(Cardinality)

有 4 种基数可选:多对一、一对一、一对多、或多对多。

在创建关系时,建议连接字段在至少一张表中包含唯一值。这样就能在数据模型中使用一对多或多对一选项。

在我们的数据中,Financials 表与 Products 表通过 Product ID 字段建立关系。Products 表在产品字段上具有唯一值(每个产品在表中只出现一次)。而 Financials 表则可能按日期、国家、细分等多次出现同一产品。

多对多选项最具挑战性。尽管它在复杂模型中非常有用,但只有在您完全理解这种关系的影响时才应选择它。

为说明多对多关系可能引发的问题,我们在数据模型中按产品类别创建了年度销售目标表。我们需要能够在同一可视化中并列展示销售数据与这些目标。这可以通过在销售目标表与产品表之间创建多对多关系来实现。

Many-to-many relationship in Power BI ScreenshotPower BI 中的多对多关系。作者供图

在下面的表格可视化中,我们可以看到每个产品类别的销售额与目标并列显示。

Cardinality in Power BI Table Screenshot 1

产品类别、销售额与目标。作者供图

然而,如果我们尝试在产品层级查看这张表,目标值将完全不正确。这是由于数据粒度不同所致;既然只有产品类别层级的销售目标,Power BI 无法合理地在产品层级显示这些目标,于是目标就被简单地在该类别下的每个产品上重复。如果您不了解多对多关系可能带来的这一后果,在业务报告中就会造成严重问题。

Cardinality in Power BI Table Screenshot 2产品类别、销售额与目标。作者供图


方向性(Directionality)

交叉筛选方向选项可在“单向”或“双向”之间选择。关系从具有唯一值的表流向具有多值的表。在我们的示例中,关系从 Products 表流向 Financials 表。这意味着如果交叉筛选方向设置为单向,那么可以使用 Products 表中的产品与产品类别字段来筛选 Financials 表;但无法通过 Financials 表中的产品 ID 字段,或通过其他维度表中的任一特征来筛选 Products 表。

大多数情况下建议使用单向。这是因为双向关系(“双向”选项)不仅会降低模型性能,还可能在筛选数据时引入歧义。

在我们的示例中,考虑 Product、Countries 与 Financials 三张表之间的关系。它们都是单向的一对多关系。这意味着按国家筛选报表并不会反过来筛选 Products 表。如下方切片器所示,选择某个国家(例如 USA),不会让产品切片器仅显示与该国家相关的产品。

Directionality in Power BI Screenshot 1

Power BI 中的切片器。作者供图

不过,将 Products 表与 Financials 表之间的关系更改为双向后,我们就可以让筛选流入 Products 表。在此情况下,我们会看到产品 Carretera 未显示在产品切片器中,因为在美国(United States of America)没有该产品的销售。

Directionality in Power BI Screenshot 2Power BI 中的切片器。作者供图

或者,为避免使用双向关系,您可以在切片器可视化中添加筛选器以排除空值项。需要注意的是,凡是跨维度表使用字段的可视化,您都需要分别进行此设置。

Power BI Data Modeling Filter ScreenshotPower BI 中的筛选器与切片器。作者供图

如何优化您的 Power BI 模型

优化 Power BI 模型的最重要因素是采用本教程所述的良好数据建模实践。往往仅凭优秀的数据模型,就能让 Power BI 报告在保持良好性能的同时扩展到数百万、甚至数十亿条数据。

此外,在遵循良好数据建模实践的基础上,您还可以通过以下方式优化 Power BI 模型:

  • 关闭时间智能——Power BI 中的此功能会在将日期字段添加到可视化时自动创建日期/时间层级。每创建一个这样的层级,本质上就相当于在数据模型中增加一张表。可想而知,这会显著增加 Power BI 报告的体量,拖慢可视化渲染并延长刷新时间。建议关闭此功能,改用专用的日期表来管理所有日期/时间层级。
  • 仅加载确实需要的列——使用 Power Query 编辑器,建议删除报表中不需要或未使用的列。最常被“以防万一”而保留的字段之一是行 ID。此字段对您的数据集是唯一的,例如订单表中每笔交易的订单 ID。该 ID 字段往往还以文本形式存储,从而进一步增大模型体量。若该 ID 字段未在关系中被明确使用,通常无需将其加载进模型。
  • 仅加载需要的行——不要陷入“必须把所有业务数据都导入 Power BI 报告”的误区。尤其当企业经营时间较长时,这可能意味着报表包含大量没人真正关注的数据。关键在于与报表的业务用户沟通,明确他们究竟需要查看多少历史数据。若确实需要查看更早的数据,您可以考虑仅导入该表的汇总版本,而非每一笔明细交易。

结语

采用稳健的数据建模实践对于构建高效且可扩展的 Power BI 报告至关重要。本教程强调了星型架构的重要性,它既提升可用性,又改善性能。理解并掌握创建关系、基数与方向性等关键概念,能确保您的数据模型既易用又优化。

此外,采纳关闭不必要功能、限制数据导入等最佳实践,能够进一步提升性能。遵循这些准则,您可以显著提高 Power BI 报告的效率和可扩展性,使其成为更有效的业务分析工具。继续在 DataCamp 上通过课程精进您的技能。浏览完整的DataCamp Power BI 资源,包括课程与技能路径、博客与教程。

主题