关系概述
本主题介绍可以在 PowerPivot for Excel 中的表之间定义的关系。 本主题包含以下各节:
什么是关系?
关系的要求
关系的自动检测和推理
阅读本主题后,您可以了解什么是关系、定义关系有什么要求以及 PowerPivot for Excel 如何才能自动检测关系。 在此过程中,您将学习一些数据库专业人员用于描述关系的术语。
什么是关系?
关系是两个数据表之间的连接,它基于每个表中的一列或多列(对于 PowerPivot 来说,是每个表中的一列)。 要理解关系为何有用,可以想像一下在业务中跟踪客户订单数据。 可以在具有以下结构的一个表中跟踪所有数据:
CustomerID |
Name |
DiscountRate |
OrderID |
OrderDate |
Product |
Quantity |
|
---|---|---|---|---|---|---|---|
1 |
Ashton |
chris.ashton@contoso.com |
.05 |
256 |
2010-01-07 |
Compact Digital |
11 |
1 |
Ashton |
chris.ashton@contoso.com |
.05 |
255 |
2010-01-03 |
SLR Camera |
15 |
2 |
Jaworski |
michal.jaworski@contoso.com |
.10 |
254 |
2010-01-03 |
Budget Movie-Maker |
27 |
这种方法可以用,但会存储大量冗余数据,如每个订单的客户电子邮件地址。 存储成本低廉,但如果电子邮件地址发生更改,就必须确保更新该客户的每一行数据。 针对这一问题,一种解决方法是将数据拆分到多个表中,然后在这些表之间定义关系。 这就是关系数据库(如 SQL Server)中使用的方法。 例如,导入 PowerPivot for Excel 的某个数据库可以使用三个相关表表示订单数据:
Customers
[CustomerID] |
Name |
电子邮件 |
---|---|---|
1 |
Ashton |
chris.ashton@contoso.com |
2 |
Jaworski |
michal.jaworski@contoso.com |
CustomerDiscounts
[CustomerID] |
DiscountRate |
---|---|
1 |
.05 |
2 |
.10 |
Orders
[CustomerID] |
OrderID |
OrderDate |
Product |
Quantity |
---|---|---|---|---|
1 |
256 |
2010-01-07 |
Compact Digital |
11 |
1 |
255 |
2010-01-03 |
SLR Camera |
15 |
2 |
254 |
2010-01-03 |
Budget Movie-Maker |
27 |
如果从同一数据库导入这些表,则 PowerPivot 可以根据 [方括号] 中的列来检测这些表之间的关系,并可以在 PowerPivot 窗口中再现这些关系。 有关详细信息,请参阅本主题中的关系的自动检测和推理。 如果从多个源导入表,则可以手动创建关系,如创建两个表之间的关系所述。
列和键
关系基于每个表中包含相同数据的列。 例如,Customers 和 Orders 表可以彼此相关,因为它们都包含存储客户 ID 的列。 在本示例中,列名称相同,但这不是必需的。 只要 Orders 表的所有行都包含也存储在 Customers 表中的 ID,一列可以是 CustomerID,另一列可以是 CustomerNumber。
在关系数据库中,有几种类型的键,键通常是具有指定属性的列。 以下四种类型的键最适合我们使用:
主键:唯一标识表中的一行,如 Customers 表中的 CustomerID。
备用键(或候选键):主键之外的唯一列。 例如,Employees 表可能存储雇员 ID 和社会保障号,这两者都是唯一的。
外键:引用另一表中的唯一列的列,如 Orders 表中的 CustomerID,它引用 Customers 表中的 CustomerID。
组合键:由多列组成的键。 PowerPivot for Excel 不支持组合键。 有关详细信息,请参阅本主题中的“组合键和查找列”。
在 PowerPivot for Excel 中,主键或备用键称为“相关查找列”或“查找列”。 如果表既有主键又有备用键,则主键和备用键都可用作查找列。外键称为“源列”或只称为“列”。在我们的示例中,将在 Orders 表的 CustomerID(列)和 Customers 表的 CustomerID(查找列)之间定义关系。 如果从关系数据库导入数据,则 PowerPivot for Excel 默认情况下会从一个表中选择外键,从另一个表中选择相应的主键。但是,您可以使用对于查找列具有唯一值的任何列。
关系类型
Customers 与 Orders 之间的关系是“一对多关系”。 每个客户都可以有多个订单,但一个订单不能有多个客户。 其他关系类型为“一对一”和“多对多”。 为每个客户定义一个折扣率的 CustomerDiscounts 表与 Customers 表具有一对一关系。 Products 和 Customers 之间的直接关系就是多对多关系的一个示例,在这种关系中,一个客户可以购买多种产品,同一种产品可由很多客户购买。 PowerPivot for Excel 在用户界面中不支持多对多关系。有关详细信息,请参阅本主题中的“多对多关系”。
下表显示了三个表之间的关系:
关系 |
类型 |
查找列 |
列 |
---|---|---|---|
Customers-CustomerDiscounts |
一对一 |
Customers.CustomerID |
CustomerDiscounts.CustomerID |
Customers-Orders |
一对多 |
Customers.CustomerID |
Orders.CustomerID |
关系和性能
在创建任何关系之后,对于任何公式,如果它们使用新创建的关系中所涉及的各表中的列,PowerPivot for Excel 通常必须对其进行重新计算。 处理可能需要一些时间,这取决于数据量和关系的复杂度。 有关详细信息,请参阅重新计算公式。
关系的要求
创建关系时,PowerPivot for Excel 必须遵守几项要求:
表之间的单个关系
多个关系会导致表之间存在不明确的依赖关系。 若要创建准确的计算,需要从一个表到下一个表的单一路径。 因此,每对表之间只能存在一个关系。 例如,在 AdventureWorksDW2012 中,表 DimDate 包含一个列 DateKey,该列与表 FactInternetSales 中的以下三个不同列相关:OrderDate、DueDate 和 ShipDate。 如果您试图导入这些表,则会成功创建第一个关系,但是在创建涉及相同列的后续关系时会接收到下面的错误:
* 关系: 表[列 1]-> 表[列 2] - 状态: 错误 - 原因: 在表 <表 1> 和 <表 2> 之间无法创建关系。 在两个表之间只能存在一个直接或间接关系。
如果您有两个表并且这两个表之间存在多个关系,则需要导入包含查找列的表的多个副本,并在每对表之间创建一个关系。
每个源列具有一个关系
源列无法具有多个关系。 如果您已在一个关系中将某列用作源列,但希望使用该列连接到其他表中的另一个相关的查找列,则可以创建该列的副本并使用该列创建新的关系。
可使用计算列中的 DAX 公式轻松创建具有完全相同值的列的副本。 有关详细信息,请参阅计算列。
每个表的唯一标识符
每个表都必须具有一个单独的列,用于唯一标识该表中的每一行。 该列通常称为主键。
唯一查找列
查找列中的数据值必须是唯一的。 也就是说,该列不能包含重复值。 在 PowerPivot for Excel 中,Null 和空字符串等效于空白,而空白是一种独特的数据值。 这意味着查找列中不能包含多个 Null 值。
兼容的数据类型
源列和查找列中的数据类型必须兼容。 有关数据类型的详细信息,请参阅 PowerPivot 工作簿中支持的数据类型。
组合键和查找列
不能在 PowerPivot 工作簿中使用组合键;必须始终有恰好一个列来唯一标识表中的每一行。 如果您试图导入的表中包含基于组合键的现有关系,表导入向导会忽略该关系,因为在 PowerPivot 中无法创建该关系。
如果要在 PowerPivot 中创建两个表之间的关系,并且存在多个定义主键和外键的列,必须先组合这些值创建一个键列,然后才能创建关系。 您可以在导入数据之前执行此操作,也可以在 PowerPivot 中通过创建计算列来执行此操作。
多对多关系
PowerPivot for Excel 不支持多对多关系,您不能在 PowerPivot 中简单添加“联接表”。 但可以使用 DAX 函数为多对多关系建模。
自联接和循环
PowerPivot 表中不允许使用自联接。 自联接是一个表与其自身之间的递归关系。 自联接通常用于定义父子层次结构。 例如,可以将 Employees 表联接到其自身,从而生成显示业务管理链的层次结构。
PowerPivot for Excel 不允许在工作簿中的关系之间创建循环。 换言之,禁止使用下面这组关系。
表 1、列 a 到表 2、列 f
表 2、列 f 到表 3、列 n
表 3、列 n 到表 1、列 a
如果您试图创建的关系会导致创建循环,则会生成错误。
关系的自动检测和推理
在将数据导入 PowerPivot 窗口时,表导入向导将自动检测表之间的任何现有关系。 另外,创建数据透视表时,PowerPivot for Excel 将分析表中的数据。 它检测尚未定义的可能关系并建议这些关系中应包含的相应列。
检测算法使用有关列的值和元数据的统计数据,对关系的概率进行推断。
所有相关列中的数据类型都应兼容。 对于自动检测,只支持整数和文本数据类型。 有关数据类型的详细信息,请参阅 PowerPivot 工作簿中支持的数据类型。
要成功地检测到关系,查找列中唯一键的数目必须大于表中多方的值数。 换句话说,关系中多方的键列不得包含查找表的键列中没有的任何值。 例如,假设一个表列出了产品及其 ID(查找表),而销售表列出了每个产品的销售额(关系中的多方)。 如果您的销售记录包含的一个产品的 ID 在 Products 表中没有对应的 ID,则不能自动创建关系,但您可以手动创建它。 若要让 PowerPivot for Excel 检测此关系,您需要首先更新产品查找表以及缺失产品的 ID。
请确保多方的键列的名称类似于查找表中键列的名称。 名称不必完全相同。 例如,在业务设置中,实质上包含相同数据的列的名称通常具有多个变体:Emp ID、EmployeeID、Employee ID、EMP_ID 等。 此算法检测相似的名称,并向具有类似名称或完全匹配名称的列分配较高的概率。 因此,为了提高创建关系的概率,可以尝试重命名导入的数据中的列,以便与现有表中的列相似。 如果 PowerPivot for Excel 找到多个可能的关系,则它不会创建关系。
此信息可以帮助您了解为何检测不到所有关系,或更改元数据(如字段名称和数据类型)如何可以改善自动关系检测的结果。 有关详细信息,请参阅 有关关系的疑难解答和PowerPivot 的自动关系检测的幕后故事。
自动检测命名集
系统不会自动检测数据透视表中命名集和相关字段之间的关系。 您可以手动创建这些关系。 如果要使用自动关系检测功能,则可以删除每个命名集并将命名集中的各个字段直接添加到数据透视表中。
关系的推理
在某些情况下,表之间的关系会自动链接。 例如,如果在以下前两组表之间创建关系,则会推断出其他两个表之间存在一个关系,进而自动建立一个关系。
Products 和 Category -- 手动创建
Category 和 SubCategory -- 手动创建
Products 和 SubCategory -- 推断出关系
为使关系自动链接,关系方向必须相同,如上所示。 例如,如果初始关系是在 Sales 和 Products 以及 Sales 和 Customers 之间,则不会推断出关系。 这是因为 Products 和 Customers 之间的关系是多对多关系。