微软BI 之SSAS 系列 - 多维数据集维度用法之三 多对多维度 Many to Many
开篇介绍
对于维度成员和事实数据直接的关系看到更多的可能还是一对一,一对多的关系。比方在事实维度(或退化维度)中一个订单和明细号组合而成的ID,对应的就是事实表中的一条数据,这就是一对一的关系。比方说在产品维度中,一个产品维度成员可能对应着多个事实数据成员,这就是一对多的关系。说简单点,就是事实表的外键引用了维度表的主键,形成了这种关系。
下面的这个例子就是一种多对多的情况,通常情况下,如果维度和度量值组中间是多对多的关系,那么在它们之间就需要创建一个中间事实表。 这个中间事实表的主键在数据仓库中可以不需要设计,包括与左侧维度表和右侧事实表之间的主外键关联也不需要设计,直接在数据源视图中修改逻辑关联就可以了 (在我的脚本代码中为了方便都主动的加上了主外键关联)。
如果要在 DimSalesReason 和 FactInternetSales 建立关联的话,那么就需要通过定义多对多关系来实现。

DimSalesReason - 销售原因维度,即每笔订单都会对应一个或者多个销售原因,比如因为价格原因和产品推广原因客户购买了,或者就是单单价格原因客户购买了。
类似于这种结构,我们一般可以这样来操作:
- 第一步:基于 DimSalesReason 维度表创建一个常规维度 Sales Reason。
- 第二步:基于 FactInternetSales 事实表创建一个事实维度 InternetSalesFact。
- 这样一来在定义维度用法时:
- 第三步:SalesReason 对度量值组 Internet Sales Reason (即FactInternetSalesReason) 将形成一种一对多的关系,常规用法。
- 第四步:InternetSalesFact 对度量值组 Internet Sales Reason (即FactInternetSalesReason) 将形成一种一对多的关系,常规用法。
- 第五步:InternetSalesFact 对度量值组 Internet Sales (即FactInternetSales)将形成一种一对多的关系,事实用法。注:广义上来讲,这里的一对多关系其实也包含了一对一的关系。
- 第六步,最后 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的更多相关文章
- 微软BI 之SSAS 系列 - 多维数据集维度用法之二 事实维度(退化维度 Degenerate Dimension)
这篇文章是基于上一篇 SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension 继续讲解多维数据集维度用法中的事实维度. 事实维度,顾名思义就是把事实表 Fact ...
- 微软BI 之SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension
在 CUBE 设计过程中有一个非常重要的点就是定义维度与度量值组关系,维度的创建一般在前,而度量值组一般来源于一个事实表.当维度和度量值组在 CUBE 中定义完成之后,下一个最重要的动作就是定义两者之 ...
- 微软BI 之SSAS 系列 - 多维数据集中度量值设计时的聚合函数 (累加性_半累加性和非累加性)
在 SSAS 系列 - 实现第一个 Cube 以及角色扮演维度,度量值格式化和计算成员的创建 中主要是通过已存在的维度和事实数据创建了一个多维数据集,并同时解释了 Role-Playing Dimen ...
- 微软BI 之SSAS 系列 - 实现Cube 以及角色扮演维度,度量值格式化和计算成员的创建
在熟悉完下面这三种维度的创建方式之后,就可以开始创建我们的第一个 Cube 了. SSAS 系列 - 自定义的日期维度设计 SSAS 系列 - 基于雪花模型的维度设计 SSAS系列 - 关于父子维度的 ...
- 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式
开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型 ...
- 微软BI 之SSAS 系列 - 在SQL Server 2012 中开发 Analysis Services Multidimensional Project
SQL Server 2012 中提供了开发 SSAS 项目的两种模型,一种是新增加的 Tabular Model 表格模型,另一种就是原始的 Multidimensional Model 多维模型. ...
- 微软BI 之SSAS 系列 - 在 SQL Server 2012 下查看 SSAS 分析服务的模型以及几个模型的简单介绍
在SSDT中部署一个 SSAS 项目到本地服务器上出现错误. You cannot deploy the model because the localhost deployment server i ...
- 微软BI 之SSAS 系列 - 自定义的日期维度设计
SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞 ...
- 微软BI 之SSAS 系列 - 维度的优化,灌木丛属性关系,以及自然层次结构与非自然层次结构的概念
维度的优化 在 SSAS 开发设计过程中,维度的优化非常重要,因为它在 SSAS 分析服务性能调优的过程中往往能起到一个非常重要的作用. 一般来说,对于 Cube 的性能优化第一步可能考虑的就是查看维 ...
随机推荐
- bzoj1208splay模板题
想试下新找的板子,没想到交上去CE了..懒得调..以后有机会就改 /* 用type标记当前树上的是宠物还是人 每次求前驱后缀,删掉最近的那个点 */ #include<iostream> ...
- 性能测试四十:Mysql存储过程造数据
性能测试是基于大量数据的,而进行性能测试之前肯定没那么多数据,所以就要自己准备数据 数据构造方法: 1.业务接口 -- 适合数据表关系复杂 -- 优点:数据完整性比较好2.存储过程 -- 适合表数量少 ...
- python 全栈开发,Day62(外键的变种(三种关系),数据的增删改,单表查询,多表查询)
一.外键的变种(三种关系) 本节重点: 如何找出两张表之间的关系 表的三种关系 一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出 ...
- thinkphp获取ip地址及位置信息
ThinkPHP\Common\funcitons.php下有一个get_client_ip()能够获取ip地址 但是有时候不够准确 找到了下面一段来 function get_client_ip($ ...
- #5【BZOJ4275】[ONTAK2015]Badania
Description 给定三个数字串A,B,C,请找到一个A,B的最长公共子序列,满足C是该子序列的子串. Input 第一行包含一个正整数n(1<=n<=3000),表示A串的长度. ...
- 「2017 山东一轮集训 Day7」逆序对
题解: 满满的套路题.. 首先显然从大到小枚举 然后每次生成的逆序对是1----(i-1)的 这样做dp是nk的 复杂度太高了 那我们转化一下问题 变成sigma(ai (ai<i) )= ...
- [ZJOI2012]旅游
题目: 这题意...还以为他说的线段是路径 写了好久的dp..写不出来 看了网上的题解..才知道就是两点连线 然后就是一般的平面图转对偶图的思想 然后算一下边数发现是颗树,求一下直径就好了 代码: # ...
- 乐观锁和悲观锁及CAS实现
乐观锁与悲观锁 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁.传统的关系型数据库里边就用到了很多这种锁机制, ...
- python全栈开发day34-线程Thread
一.昨日内容回顾 1. 概念和理论 进程是计算机资源分配最小单位 进程三状态.同步.异步.阻塞.非阻塞 2. 进程的创建 实例化.自建类run,start,join,terminate,daemon等 ...
- 第一次亲密接触MSF
第一次亲密接触MSF Metasploit Framework介绍 Metasploit是一款开源安全漏洞检测工具,附带数百个已知的软件漏洞,并保持频繁更新.被安全社区冠以“可以黑掉整个宇宙”之名的强 ...