关系(SSAS 表格)

在表格模型中,关系是两个数据表之间的连接。 该关系确定两个表中的数据应如何关联。 例如,“客户”表和“订单”表可以相关,以显示与每个订单关联的客户名称。

使用表导入向导从同一数据源导入时,选择导入的表(数据源)中已存在的关系将在模型中重新创建。 可以使用关系图视图中的模型设计器或使用“管理关系”对话框来查看检测到和重新创建的关系。 还可以通过使用关系图视图中的模型设计器或使用“创建关系”或“管理关系”对话框手动在表之间创建新关系。

定义表之间的关系后,无论是在导入期间自动还是手动创建,都可以使用相关列筛选数据,并在相关表中查找值。

小窍门

如果模型包含许多关系,则关系图视图可以更好地帮助你更好地可视化和创建新表之间的关系。

本主题中的部分:

优点

关系是两个数据表之间的连接,基于每个表中的一个或多个列。 若要查看关系为何有用,假设你跟踪业务中客户订单的数据。 可以跟踪具有如下结构的单个表中的所有数据:

客户ID 名称 电子邮件 折扣率 订单编号 订单日期 产品 数量
1 阿什顿 chris.ashton@contoso.com .05 256 2010-01-07 Compact Digital 11
1 阿什顿 chris.ashton@contoso.com .05 255 2010-01-03 SLR 相机 15
2 Jaworski michal.jaworski@contoso.com .10 254 2010-01-03 预算 Movie-Maker 二十七

此方法可以正常工作,但涉及到存储大量冗余数据,例如每个订单的客户电子邮件地址。 存储很便宜,但如果电子邮件地址发生更改,则必须确保为该客户更新每一行。 此问题的一个解决方案是将数据拆分为多个表,并定义这些表之间的关系。 这是在 关系数据库 (如 SQL Server)中使用的方法。 例如,导入模型的数据库可能使用三个相关表来表示订单数据:

客户

[CustomerID] 名称 电子邮件
1 阿什顿 chris.ashton@contoso.com
2 Jaworski michal.jaworski@contoso.com

客户折扣

[CustomerID] 折扣率
1 .05
2 0.10

订单

[CustomerID] 订单编号 订单日期 产品 数量
1 256 2010-01-07 Compact Digital 11
1 255 2010-01-03 SLR 相机 15
2 254 2010-01-03 预算 Movie-Maker 二十七

如果从同一数据库导入这些表,则表导入向导可以根据 [方括号]中的列检测表之间的关系,并且可以在模型设计器中重现这些关系。 有关详细信息,请参阅本主题中 关系的自动检测和推理 。 如果从多个源导入表,则可以按照“ 创建两个表之间的关系”(SSAS 表格)中所述手动创建关系。

列和键

关系基于每个表中包含相同数据的列。 例如,“客户”和“订单”表可以相互关联,因为它们都包含存储客户 ID 的列。 在此示例中,列名称相同,但这不是一项要求。 一个可以是 CustomerID,另一个可以是 CustomerNumber,只要 Orders 表中的所有行都包含一个也存储在 Customers 表中的 ID。

在关系数据库中,有几个类型的键,这些 通常只是具有特殊属性的列。 在关系数据库中可以使用以下四种类型的密钥:

  • 主键:唯一标识表中的行,例如 Customers 表中的 CustomerID。

  • 备用键(或候选键):一种非主键但具有唯一性的列。 例如,Employees 表可能会存储员工 ID 和社会保障号,这两者都是唯一的。

  • 外键:另一个表中引用唯一列的列,例如 Orders 表中的 CustomerID,该列引用 Customers 表中的 CustomerID。

  • 组合键:由多个列组成的键。 表格模型中不支持复合键。 有关详细信息,请参阅本主题中的“复合键和查找列”。

在表格模型中,主键或备用键称为 相关查找列或仅 查找列。 如果表同时具有主键和备用键,则可以将任一项用作查阅列。 外键称为 源列 或仅 。 在我们的示例中,将在“订单”表中的 CustomerID 列与“客户”表中的 CustomerID(查阅列)之间定义关系。 如果从关系数据库导入数据,则模型设计器默认从一个表中选择外键,并从另一个表中选择相应的主键。 但是,可以使用任何具有查找列唯一值的列。

关系类型

客户与订单之间的关系是 一对多关系。 每个客户可以有多个订单,但订单不能有多个客户。 其他类型的关系是 一对一多对多。 CustomerDiscounts 表定义每个客户的单个折扣率,与 Customers 表处于一对一关系中。 多对多关系的一个示例是产品与客户之间的直接关系,其中客户可以购买许多产品,同一产品可由许多客户购买。 模型设计器不支持用户界面中的多对多关系。 有关详细信息,请参阅本主题中的“多对多关系”。

下表显示了这三个表之间的关系:

关系 类型 查找列
Customers-CustomerDiscounts 一对一 Customers.CustomerID CustomerDiscounts.CustomerID(客户折扣.客户ID)
Customers-Orders 一对多 客户.CustomerID 订单.客户ID

关系和表现

创建任何关系后,模型设计器通常必须重新计算使用新创建关系中表中的列的任何公式。 处理可能需要一些时间,具体取决于数据量和关系的复杂性。

关系准则

模型设计器在创建关系时必须遵循以下几个要求:

表之间的唯一有效关系

多个关系可能会导致表之间的不明确依赖关系。 若要创建准确的计算,需要从一个表到下一个表的单个路径。 因此,每个表对之间只能有一个有效关系。 例如,在 AdventureWorks DW 2012 中,表 DimDate 包含一列 DateKey,该列与表中的三个不同的列相关:FactInternetSales:OrderDate、DueDate 和 ShipDate。 如果尝试导入这些表,则会成功创建第一个关系,但后续关系上会出现以下错误,这些关系涉及同一列:

* 关系:表[列 1]-> 表[列 2] - 状态:错误 - 原因:表 1> 和<表 2> 之间<无法创建关系。 两个表之间只能存在一个直接或间接关系。

如果两个表之间有多个关系,则需要导入包含查阅列的表的多个副本,并在每对表之间创建一个关系。

表之间可能存在许多不活跃关系。 表间使用的路径由报告客户端在查询时指定。

为每个源列建立一个关系

源列不能参与多个关系。 如果已将列用作一个关系中的源列,但想要使用该列连接到其他表中的另一个相关查找列,则可以创建该列的副本,并将该列用于新关系。

通过使用计算列中的 DAX 公式,可以轻松创建具有相同值的列的副本。 有关详细信息,请参阅“创建计算列”(SSAS 表格)。

每个表的唯一标识符

每个表必须有一个唯一的列来标识该表中每一行。 此列通常称为主键。

特有查找列

查阅列中的数据值必须是唯一的。 换句话说,该列不能包含重复项。 在表格模型中,null 和空字符串等效于空白,这是一个不同的数据值。 这意味着在查找列中不能有多个 null。

兼容的数据类型

源列和查找列中的数据类型必须兼容。 有关数据类型的详细信息,请参阅支持的数据类型(SSAS 表格)。

复合键和查找列

不能在表格模型中使用复合键;必须始终有一列唯一标识表中的每一行。 如果尝试导入基于复合键的现有关系的表,则表导入向导将忽略该关系,因为它无法在表格模型中创建。

如果要在模型设计器中的两个表之间创建关系,并且有多个列定义主键和外键,则必须在创建关系之前合并这些值来创建单个键列。 可以在导入数据之前执行此作,也可以通过创建计算列在模型设计器中执行此作。

多对多关系

表格模型不支持多对多关系,并且不能在模型设计器中添加 交接表 。 但是,可以使用 DAX 函数对多对多关系建模。

Self-Joins 和循环

表格模型表中不允许自联接。 自联接是表与自身之间的递归关系。 自联接通常用于定义父子层次结构。 例如,可以将 Employees 表联接到自身,以生成显示企业管理链的层次结构。

模型设计器不允许在模型中的关系之间创建循环。 换句话说,禁止以下一组关系。

表 1,列 a 到表 2,列 f

表 2,列 f 到表 3,列 n

表 3,列 n 到表 1,列 a

如果尝试创建会导致循环创建的关系,则会生成错误。

关系推理

在某些情况下,表之间的关系会自动链式连接。 例如,如果在下面的前两组表之间创建关系,则会推断其他两个表之间存在关系,并且会自动建立关系。

产品和类别 - 手动创建

类别和子类别 - 手动创建

产品和子类别之间的关系被推断出

为了自动链接关系,关系必须按一个方向排列,如上所示。 如果初始关系介于“销售”和“产品”和“销售”和“客户”之间,则不会推断关系。 这是因为产品和客户之间的关系是多对多关系。

导入数据时的关系检测

从关系数据源表导入时,表导入向导会基于源架构数据检测这些源表中的现有关系。 如果导入相关表,这些关系将在模型中重复。

手动创建关系

在一个关系型数据源中,虽然大多数表之间的关系会被自动检测并在表格模型中创建,但在很多情况下,还需要手动在模型表之间创建关系。

如果模型包含来自多个源的数据,则可能需要手动创建关系。 例如,可以从关系数据源导入 Customers、CustomerDiscounts 和 Orders 表。 源中这些表之间的关系会自动在模型中创建。 然后,可以从其他源添加另一个表,例如,从 Microsoft Excel 工作簿中的 Geography 表导入区域数据。 然后,可以在 Customers 表中的列与 Geography 表中的列之间手动创建关系。

若要在表格模型中手动创建关系,可以在关系图视图中或使用“管理关系”对话框使用模型设计器。 关系图视图以图形格式显示表及其之间的关系。 可以单击一个表中的列,并将光标拖动到另一个表,以正确的顺序在表之间轻松创建关系。 “管理关系”对话框以简单的表格式显示表之间的关系。 若要了解如何手动创建关系,请参阅 创建两个表(SSAS 表格)之间的关系

重复值和其他错误

如果选择在关系中无法使用的字段,字段旁会出现一个红色 X。 悬停光标在错误图标上即可查看提供问题详细信息的消息。 导致无法在所选列之间创建关系的问题包括:

问题或消息 决议
无法创建关系,因为所选的两列都包含重复值。 若要创建有效的关系,至少选择的对的一列必须仅包含唯一值。

可以编辑列以删除重复项,也可以反转列的顺序,以便包含唯一值的列用作 相关查找列
该列包含 null 或空值。 数据列不能在 null 值上相互联接。 对于每一行,关系中使用的两个列必须都有一个值。
主题 DESCRIPTION
创建两个表之间的关系(SSAS 表格) 介绍如何在两个表之间手动创建关系。
删除关系(SSAS 表格) 介绍如何删除关系以及删除关系的影响。

另请参阅

表和列 (SSAS 表格)
导入数据(SSAS 表格)