开篇介绍

对于维度成员和事实数据直接的关系看到更多的可能还是一对一,一对多的关系。比方在事实维度(或退化维度)中一个订单和明细号组合而成的ID,对应的就是事实表中的一条数据,这就是一对一的关系。比方说在产品维度中,一个产品维度成员可能对应着多个事实数据成员,这就是一对多的关系。说简单点,就是事实表的外键引用了维度表的主键,形成了这种关系。

下面的这个例子就是一种多对多的情况,通常情况下,如果维度和度量值组中间是多对多的关系,那么在它们之间就需要创建一个中间事实表。 这个中间事实表的主键在数据仓库中可以不需要设计,包括与左侧维度表和右侧事实表之间的主外键关联也不需要设计,直接在数据源视图中修改逻辑关联就可以了 (在我的脚本代码中为了方便都主动的加上了主外键关联)。

如果要在 DimSalesReason 和 FactInternetSales 建立关联的话,那么就需要通过定义多对多关系来实现。

DimSalesReason - 销售原因维度,即每笔订单都会对应一个或者多个销售原因,比如因为价格原因和产品推广原因客户购买了,或者就是单单价格原因客户购买了。

类似于这种结构,我们一般可以这样来操作:

  1. 第一步:基于 DimSalesReason 维度表创建一个常规维度 Sales Reason。
  2. 第二步:基于 FactInternetSales 事实表创建一个事实维度 InternetSalesFact。
  3. 这样一来在定义维度用法时:
  4. 第三步:SalesReason 对度量值组 Internet Sales Reason (即FactInternetSalesReason) 将形成一种一对多的关系,常规用法。
  5. 第四步:InternetSalesFact 对度量值组 Internet Sales Reason (即FactInternetSalesReason) 将形成一种一对多的关系,常规用法。
  6. 第五步:InternetSalesFact 对度量值组 Internet Sales (即FactInternetSales)将形成一种一对多的关系,事实用法。注:广义上来讲,这里的一对多关系其实也包含了一对一的关系。
  7. 第六步,最后 Sales Reason 维度将借助于 度量值组 Internet Sales Reason 关系到事实维度 InternetSalesFact,并通过事实维度 InternetSalesFact 关联到度量值组 Internet Sales而形成一种多对多的关系。

第一步

首先还是先将 DimSalesReason 这个维度创建好。

第二步

添加一个事实维度,选择事实表 FactInternetSales。由于事实表并不存在类似于维度的 NameColumn 描述信息,并且这个事实表也非常的特殊,因为它是由 SalesOrderNumber 和 SalesOrderLineNumber 共同组成的主键列。由于相对而言 SalesOrderNumber 比 SalesOrderLineNumber 更有意义一些,这里选择 SalesOrderNumber 作为 Name Colum。

不需要与其它的维度进行关联。

不需要太多的属性,就留一个主 KEY 就可以了。

下一步并将维度名称命名为InternetSalesFact, 把 Fact 写在最后表示它是一个事实维度。

两个维度创建好了之后,保存并部署项目,同时修改 Cube 向 Cube 添加一个度量值组 - Fact Internet Sales Reason,这个维度只是一个中间维度。

可以隐藏 Fact Internet Sales Reason Count 度量值,因为实际上没有特别大的意义,讲它的 Visible 属性设置为 False。

一会将度量值组名称改为 - Internet Sales Reason。

保存并部署,然后编辑多维数据集的维度用法, 添加 SalesReason 维度后在 SalesReason 与 Internet Sales Reason 之间默认出现一个 Sales Reason。

第三步

SalesReason 对度量值组 Internet Sales Reason (即FactInternetSalesReason) 将形成一种一对多的关系,常规用法。

点击查看它们默认的关系,注意这里只是 SalesReason 维度和这个中间度量值组之间的关系,实际上 SalesReason 和 Internet Sales 之间是没有关联的。

在维度用法中添加新的维度即事实维度 InternetSalesFact,将表现第四步和第五步的行为。

第四步

InternetSalesFact 对度量值组 Internet Sales Reason (即FactInternetSalesReason) 将形成一种一对多的关系,常规用法。

第五步

InternetSalesFact 对度量值组 Internet Sales (即FactInternetSales)将形成一种一对多的关系,事实用法。

第六步

最后 Sales Reason 维度将借助于 度量值组 Internet Sales Reason 关系到事实维度 InternetSalesFact,并通过事实维度 InternetSalesFact 关联到度量值组 Internet Sales而形成一种多对多的关系。

可以看到 SalesReason 和 InternetSales 之间形成了多对多关系。

保存并部署,浏览一下 Cube 中的数据。可以看到订单号为 SO43697 的这笔订单有两个销售原因 - Manufacturer 和 Quality,虽然两个销售原因对应的销售额都是 3578美元,但是这仍然是属于一笔订单,因此看到销售类别 Other 的 Internet Sales Amount 还是显示的是 3578 美元。

数据库中的订单对应了两个销售原因,但它的销售额仍然是 3578.27 而不是 两个 SalesAmount的总和。

参看与本文相关的文章如下

SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension

SSAS 系列 - 多维数据集维度用法之二 事实维度(退化维度 Degenerate Dimension)

引起争论的结论

虽然这篇文章讲到了多对多维度的实现,但是实际开发中尽量避免使用这种关联关系,因为多对多的关系处理在数据聚合上效率肯定比通常一对一,一对多的效率要低很多。同时由于在建立多对多关系的时候需要额外创建一个事实维度来实现这种多对多的关联,因此额外的事实维度需要被创建,在维度处理上变得更复杂,个人建议在设计的时候应该尽量避免这种关系的出现。

PS

感谢各位在本贴的留言,回复与讨论。上面的这个结论下的有点不严谨,个人观点,希望不会误导大家,不过大家可以充分讨论。关于这个多对多的设计能否在某些场景下避免的问题,我保留我的意见,这个问题待续。

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)    如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。

微软BI 之SSAS 系列 - 多维数据集维度用法之三 多对多维度 Many to Many的更多相关文章

  1. 微软BI 之SSAS 系列 - 多维数据集维度用法之二 事实维度(退化维度 Degenerate Dimension)

    这篇文章是基于上一篇 SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension 继续讲解多维数据集维度用法中的事实维度. 事实维度,顾名思义就是把事实表 Fact ...

  2. 微软BI 之SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension

    在 CUBE 设计过程中有一个非常重要的点就是定义维度与度量值组关系,维度的创建一般在前,而度量值组一般来源于一个事实表.当维度和度量值组在 CUBE 中定义完成之后,下一个最重要的动作就是定义两者之 ...

  3. 微软BI 之SSAS 系列 - 多维数据集中度量值设计时的聚合函数 (累加性_半累加性和非累加性)

    在 SSAS 系列 - 实现第一个 Cube 以及角色扮演维度,度量值格式化和计算成员的创建 中主要是通过已存在的维度和事实数据创建了一个多维数据集,并同时解释了 Role-Playing Dimen ...

  4. 微软BI 之SSAS 系列 - 实现Cube 以及角色扮演维度,度量值格式化和计算成员的创建

    在熟悉完下面这三种维度的创建方式之后,就可以开始创建我们的第一个 Cube 了. SSAS 系列 - 自定义的日期维度设计 SSAS 系列 - 基于雪花模型的维度设计 SSAS系列 - 关于父子维度的 ...

  5. 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式

    开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型 ...

  6. 微软BI 之SSAS 系列 - 在SQL Server 2012 中开发 Analysis Services Multidimensional Project

    SQL Server 2012 中提供了开发 SSAS 项目的两种模型,一种是新增加的 Tabular Model 表格模型,另一种就是原始的 Multidimensional Model 多维模型. ...

  7. 微软BI 之SSAS 系列 - 在 SQL Server 2012 下查看 SSAS 分析服务的模型以及几个模型的简单介绍

    在SSDT中部署一个 SSAS 项目到本地服务器上出现错误. You cannot deploy the model because the localhost deployment server i ...

  8. 微软BI 之SSAS 系列 - 自定义的日期维度设计

    SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞 ...

  9. 微软BI 之SSAS 系列 - 维度的优化,灌木丛属性关系,以及自然层次结构与非自然层次结构的概念

    维度的优化 在 SSAS 开发设计过程中,维度的优化非常重要,因为它在 SSAS 分析服务性能调优的过程中往往能起到一个非常重要的作用. 一般来说,对于 Cube 的性能优化第一步可能考虑的就是查看维 ...

随机推荐

  1. bzoj 1060

    这题其实有点骗人... 通过观察很容易发现:考虑某一些叶节点的LCA,由于根节点到这个LCA的距离唯一,故要求这些叶节点到这一LCA的距离都相等 于是我们仅需dfs,找到次底层的节点,然后使这些节点的 ...

  2. python 全栈开发,Day118(django事务,闭包,客户管理,教学管理,权限应用)

    昨日内容回顾 一.django事务 什么是事务 一系列将要发生或正在发生的连续操作. 作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操 ...

  3. #ECMASCRIPT6笔记

    ECMASCRIPT6笔记 来源于http://es6.ruanyifeng.com/#docs/proxy 是我在阅读时做下的笔记,方便以后查阅 Symbol ES5 的对象属性名都是字符串,这容易 ...

  4. 胖哈勃杯Pwn400、Pwn500详解

    概述 这次的胖哈博杯我出了Pwn400.Pwn500两道题目,这里讲一下出题和解题的思路.我个人感觉前两年的Pwn题更多的是考察单一的利用技巧,比我这有个洞怎么利用它拿到权限.但是我研究了一些最近的题 ...

  5. HDU 1517 (累乘 找规律)

    题意:2 个人玩游戏,从 1 开始,轮流对数进行累乘,直到超过一个指定的值. 解题思路:如果输入是 2 ~ 9 ,因为Stan 是先手,所以Stan 必胜如果输入是 10~18 ,因为Ollie 是后 ...

  6. hdu 5256 最少修改多少个数 能使原数列严格递增 (LIS)

    Problem Description我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元素都必须是整数. 请输出最少需要修改多少 ...

  7. springboot2.0+dubbo整合分布式服务发布和调用

    最近项目上要对以前的老项目做分布式的整改,因此我专门花了点时间研究下当前比较热门的dubbo和springboot结合使用,以前使用过dubbo,但是没有与springboot结合过,在网上查了点资料 ...

  8. 用HTML+CSS画出一个同心圆

    参加web前端校招的同学们经常会遇到这样的面试题:用HTML+CSS画出一个同心圆. 例如: 这道题主要考验的是基础盒模型布局能力和倒圆角属性的巧用. 1.html代码 <body> &l ...

  9. 【Java】 剑指offer(3) 二维数组中的查找

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上 ...

  10. springboot Autowired BeanNotOfRequiredTypeException

    现象 org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'xxxxImpl' is expect ...