定义多对多关系及其属性

本主题介绍 Analysis Services 中的多对多维度,包括何时使用它们以及如何创建它们。

介绍

Analysis Services 支持多对多模型,允许进行比经典星型架构所描述更为复杂的分析。 在经典星型模型中,所有维度都与事实数据表具有一对多关系。 每个事实联接到一个维度成员;单个维度成员与许多事实相关联。

多对多通过使事实(如帐户余额)与同一维度的多个成员相关联来消除此建模限制(联合帐户的余额可以归因于联合帐户的两个或多个所有者)。

从概念上讲,Analysis Services 中的多维关系相当于关系模型中的多对多关系,支持相同类型的方案。 多对多的常见示例包括:

  • 学生在许多课程中注册:每个课程都有许多学生。

  • 医生有很多病人:病人有很多医生。

  • 客户有许多银行账户;银行账户可能属于多个客户。

  • 在 Adventure Works 中,许多客户有许多订购产品的原因,销售原因可以与许多订单相关联。

从分析的角度来看,多对多关系所解决的问题是如何相对于维度关系准确表示计数或总和,通常通过在对特定维度成员进行计算时消除重复计数来实现。 需要一个示例来阐明这一点。 请考虑属于多个类别的产品或服务。 如果要按类别计算服务数,则希望每个类别中包含属于这两个类别的服务。 同时,你不希望夸大你所提供的服务数量。 通过指定多对多维关系,在按类别或服务进行查询时,更有可能获得正确的结果。 但是,始终需要彻底的测试,以确保这是这种情况。

在结构上,创建多对多维关系与在关系数据模型中创建多对多关系的方式类似。 虽然关系模型使用 交接表 来存储行关联,但多维模型使用 中间度量值组。 中间度量组是我们用来指代映射不同维度成员的表的术语。

从视觉上看,多对多维关系未在多维数据集图中体现。 相反,请使用“维度使用情况”选项卡快速识别模型中的任何多对多关系。 以下图标指示多对多关系。

维度使用中的多对多图标

单击该按钮打开“定义关系”对话框,验证关系类型是否为多对多,并查看关系中使用的中间度量值组。

维度使用情况中的“定义关系”按钮

在后续部分中,你将了解如何设置多对多维度和测试模型行为。 如果希望先查看其他信息或尝试教程,请参阅本文末尾的 “了解详细信息 ”。

创建多对多维度

简单的多对多关系包括两个维度,具有多对多基数、用于存储成员关联的中间度量值组,以及包含可度量数据的事实度量值组,例如总销售额或银行账户余额的总和。

多对多关系中的维度可能具有 DSV 中的对应表,其中模型中的每个维度都基于数据源中的现有表。 相反,模型中的维度可能派生自 DSV 中更少的或不同的物理表。 以"销售原因"和"销售订单"为例,Adventure Works 示例多维数据集展示了一种多对多关系,其中使用了仅作为模型数据结构存在的维度,而在 DSV 中没有物理对应项。 销售订单维度依据基础数据源中的事实表,而不是维度表。

下一过程假定你已知道哪些实体参与多对多关系。 有关进一步研究 ,请参阅“了解详细信息 ”。

为了说明创建多对多关系的步骤,此过程将重新创建 Adventure Works 示例多维数据集中的一个多对多关系。 如果源数据(即 Adventure Works 示例数据仓库)安装在关系数据库引擎实例上,则可以执行以下步骤。

步骤 1:验证 DSV 关系

  1. 在 SQL Server Data Tools 的多维项目中,创建一个数据源到 Adventure Works DW 2012 关系数据仓库,该数据仓库托管在 SQL Server 数据库引擎实例上。

  2. 使用以下现有表创建数据源视图:

    • FactInternetSales

    • 互联网销售原因事实

    • DimSalesReason

  3. 请确认您计划用于多对多关系的所有表在 DSV 中通过主键关系相关。 这是在后续步骤中建立指向中间度量值组的链接的要求。

    注释

    如果基础数据源不提供主键和外键关系,则可以在 DSV 中手动创建关系。 有关详细信息,请参阅 “在数据源视图(Analysis Services)中定义逻辑关系”。

    以下示例确认此过程中使用的表是使用主键链接的。

    DSV 显示相关表

步骤 2:创建维度和度量组

  1. 在 SQL Server Data Tools 的多维项目中,右键单击 “维度 ”并选择“ 新建维度”。

  2. 基于现有表 DimSalesReason 创建新维度。 指定源时接受所有默认值。

    对于属性,请选择“全部”。

    新维度中的属性列表

  3. 基于现有表 Fact Internet Sales 创建第二个维度。 虽然这是事实数据表,但它包含销售订单信息。 我们将使用它来构建销售订单维度。

  4. 在“指定源信息”中,你将看到一条警告,指示必须指定“名称”列。 选择 SalesOrderNumber 作为名称。

    “销售订单”维度显示名称列

  5. 在向导的下一页上,选择属性。 在此示例中,你可以仅选择 SalesOrderNumber

    销售订单维度显示属性列表

  6. 将维度重命名为 Dim Sales Orders,使维度具有一致的命名约定。

    向导页显示维度重命名

  7. 右键单击 多维数据集 并选择“ 新建多维数据集”。

  8. 在度量值组表中,选择 FactInternetSalesFactInternetSalesReason

    你正在选择 FactInternetSales,因为它包含你希望在数据立方体中使用的度量值。 你正在选择 FactInternetSalesReason ,因为它是中间度量值组,提供将销售订单与销售原因相关的成员关联数据。

  9. 为每个事实数据表选择度量值。

    若要简化模型,请清除所有度量值,然后选择列表底部的“ 销售金额 ”和“ 事实 Internet 销售计数 ”。 FactInternetSalesReason 只有一个度量值,因此会自动为你选择它。

  10. 在维度列表中,应会看到 Dim Sales ReasonDim Sales Orders

    在“选择新维度”页中,向导会提示你为 Fact Internet Sales Dimension 创建新维度。 不需要此维度,因此可以从列表中清除它。

  11. 命名立方体,然后单击完成

步骤 3:定义多对多关系

  1. 在立方体设计器中,单击“维度使用情况”选项卡。注意,Dim Sales ReasonFact Internet Sales 之间已经存在多对多关系。 请注意,以下图标表示多对多关系。

    维度使用情况中的多对多图标

  2. 单击 Dim Sales ReasonFact Internet Sales 之间的交集单元格,然后单击该按钮以打开“定义关系”对话框。

    可以看到,此对话框用于指定多对多关系。 如果要添加具有规则关系的维度,则可以使用这个对话框将其更改为多对多。

    维度使用情况中的“定义关系”按钮

  3. 将项目部署到 Analysis Services 多维实例。 在下一步中,你将浏览 Excel 中的多维数据集以验证其行为。

测试多对多

在多维数据集中定义多对多关系时,测试必须确保查询返回预期结果。 应使用供最终用户使用的客户端应用程序工具测试多维数据集。 在下一过程中,你将使用 Excel 连接到多维数据集并验证查询结果。

在 Excel 中浏览数据立方体

  1. 部署该项目,然后查看多维数据集以确认聚合有效。

  2. 在 Excel 中,单击数据 | 其他来源 | Analysis Services。 输入服务器的名称,选择数据库和多维数据集。

  3. 创建一个使用以下内容的数据透视表:

    • 销售额 作为值

    • 列上的销售原因名称

    • 行中的销售订单编号

  4. 分析结果。 由于我们使用的是示例数据,因此初始印象是所有销售订单都具有相同的值。 但是,如果向下滚动,将开始看到数据变体。

    部分下行,可以找到订单号 SO5382 的销售金额和销售原因。 此特定订单的总计为 539.99,此订单的购买原因包括促销、其他和价格。

    显示多对多聚合的 Excel 工作表

    请注意,为订单正确计算了销售金额;整个订单为 539.99 。 虽然每个原因都显示539.99,但这个数值并不是这三个原因的总合,却错误地夸大了我们的总计。

    为什么一开始就把销售金额放在每个销售原因之下? 答案是,它允许我们确定我们可以归因于每个原因的销售量。

  5. 滚动到工作表底部。 现在很容易看到,价格是客户购买的最重要原因,相对于其他原因和总计。

    Excel 工作簿中多对多显示总计

处理意外查询结果的提示

  1. 隐藏中间度量值组中的度量值(如计数),这些度量值不会在查询中返回有意义的结果。 这可以防止人们尝试使用产生毫无意义的数据的聚合。 若要隐藏度量值,请将维度设计器中的属性的 Visibility 设置为 False

  2. 创建透视图,以使用度量值和维度的子集,从而支持您希望提供的分析体验。 可能,包含许多度量值组和维度的多维数据集在所有情况下都无法很好地协同工作。 通过隔离想要一起使用的维度和度量值组,可确保获得更可预测的结果。

  3. 请始终记得在更改模型后部署和重新连接。 在 Excel 中,使用数据透视表分析功能区上的“刷新”按钮。

  4. 避免在多个多对多关系中使用链接度量值组,尤其是在这些关系位于不同的多维数据集中时。 这样做可能会导致不明确的聚合。 有关详细信息,请参阅 带有多对多关系的立方体中链接度量的不正确值

了解详细信息

使用以下链接获取有助于掌握概念的其他信息。

如何在 Analysis Services 中定义多对多维度

多对多革命 2.0

教程:SQL Server Analysis Services 的多对多维度示例

另请参阅

维度关系
安装 Analysis Services 多维建模教程的示例数据和项目
部署 Analysis Services 项目(SSDT)
多维模型中的视角