SqlServer Analysis Service的事实维度关系

什么是Fact(事实)维度关系

开发过SSAS Cube的开发人员应该都知道,Cube的维度用法中有一种叫Fact(事实)关系类型,如下图所示:

Fact(事实)维度关系就如同上面截图中红框中的描述一样,指的是一张表即使事实表又是维度表,也就是数据仓库中通常说的“退化维度”。比如在本例中我们的FactInternetSales(FactInternetSales表在数据源视图中的FriendlyName是Internet Sales Facts,所以在Cube中FactInternetSales表显示的是Internet Sales Facts这个名字如下图所示)表既是事实表又是维度表,如下图所示我们看到维度Internet Sales Order Details用的就是FactInternetSales表的列来构建的。

但是在Cube中我们发现FactInternetSales表也是事实表:

所以FactInternetSales表既是事实表又是维度表,维度Internet Sales Order Details和度量值组Internet Sales Facts其实都是引用的同一张数据库表FactInternetSales,那么我们就可以在维度用法中将维度Internet Sales Order Details和度量值组Internet Sales Facts之间的关系定义为Fact(事实)关系如下图所示:

从上图中我们可以看到Fact(事实)关系并不像Regular(常规)和Referenced(引用)关系一样要求设置维度表和事实表之间是通过什么字段来进行关联的,Fact(事实)关系不需要进行任何关联字段的设置,这是因为Fact关系默认会将维度表的Key属性中KeyColumns的列和事实表的主键列进行关联

如下图所示我们看到维度Internet Sales Order Details的Key属性是Internet Sales Order

而我们可以从下图看到Key属性Internet Sales Order中的KeyColumns包含了FactInternetSales表的SalesOrderNumber和SalesOrderLineNumber这两列数据

而事实表FactInternetSales的主键列也是SalesOrderNumber和SalesOrderLineNumber这两列

所以维度Internet Sales Order Details和度量值组Internet Sales Facts之间设置的Fact关系,实际上就是使用了FactInternetSales表的SalesOrderNumber和SalesOrderLineNumber这两列做Join来进行Cube的相关运算的。

我们是用MDX语句可以查看到维度Internet Sales Order Details成功地切割了度量值组Internet Sales Facts的[Sales Amount]数据。

Fact(事实)维度关系的维度可以包含多张表

实际上维度Internet Sales Order Details如果包含了FactInternetSales表以外的表,也可以和度量值组Internet Sales Facts设置为Fact关系,如下图所示我们将DimSalesTerritory(FriendlyName是Sales Territory)表的SalesTerritoryRegion列加入了维度Internet Sales Order Details作为一个属性Sales Territory Region,所以实际上现在维度Internet Sales Order Details用到了两张表FactInternetSales和DimSalesTerritory。

从下图中可以看到,我们使用MDX语句成功地用Internet Sales Order Details维度的Sales Territory Region属性切割了度量值组Internet Sales Facts的[Sales Amount]数据。

错误地配置Fact(事实)维度关系

我们前面说了Fact关系是通过维度的Key属性的KeyColumns列和事实表的主键列做Join来进行Cube运算的。那么如果维度的Key属性设置了错误的KeyColumns列,那么就会导致在处理Cube的时候Fact关系会报错或得到不正确的计算结果。例如下图中我们胡乱地更改了维度Internet Sales Order Details的Key属性Internet Sales Order中的KeyColumns为FactInternetSales表的ShipDateKey和UnitPrice两列。

我们可以看到在Cube的维度用法中Fact关系立马出现了错误,提示事实表主键列的数据类型和维度表Key属性中KeyColumns列的数据类型不一致。

所以正确地设置维度表Key属性中的KeyColumns列对于Fact关系来说至关重要,要特别谨慎。

Fact(事实)关系和Regular(常规)关系有何不同

前面我们说了Fact维度关系就是用维度表Key属性中KeyColmuns列和事实表的主键列做Join来做Cube计算的,那么实际上我们完全可以把Fact关系改为Regular(常规)维度关系,因为Regular关系实际上也是做维度表和事实表的键值Join进行Cube运算,只不过你要在Regular关系中指定用哪些列来做为Join列。比如下图中我们将维度Internet Sales Order Details和度量值组Internet Sales Facts之间的关系从Fact改为了Regular,并指定使用维度Internet Sales Order Details中Key属性Internet Sales Order的KeyColumns列SalesOrderNumber和SalesOrderLineNumber,映射到事实表的SalesOrderNumber和SalesOrderLineNumber列来做Regular关系的Join运算。

在处理Cube后,我们使用和前面相同的MDX做查询,得到了和Fact维度关系相同的查询结果:

时间: 2024-10-12 17:29:33

SqlServer Analysis Service的事实维度关系的相关文章

Service和Thread的关系及如何启用Service,如何停用Service

Service和Thread的关系: 不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Thread之间没有任何关系! 之所以有不少人会把它们联系起来,主要就是因为Service的后台概念.Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行.而Service我们最初理解的时候,总会觉得它是用来处理一些后台任

Android Service和Thread的关系

不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Thread之间没有任何关系! 之所以有不少人会把它们联系起来,主要就是因为Service的后台概念.Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行.而Service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里

数据仓库/集市 星形/雪花形 事实/维度表

声明:本文转载至Davor Gornik 对数据仓库进行数据建模 OLTP 与数据仓库--有何差异? 在日常生活中,我们要使用大量的应用程序来生成新的数据.变更数据.删除数据,当然在大多数的情况下我们还要查阅和分析数据.就来想象一个收发 email 的简单应用程序吧.我们已经存储了地址信息,可能还存储了一些文档.我们可以决定是否存储已经发送过的邮件,但是也可能隔一段时间后将其删除,或者删除已经发送过的所有邮件.那么我们该如何处理一段时间以前删除或者修改过的地址呢?我们再也不会看到它们了. Ema

【转】Android开发:Service和Thread的关系

不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Thread之间没有任何关系! 之所以有不少人会把它们联系起来,主要就是因为Service的后台概念.Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行.而Service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里

Analysis Service OLAP 概述

1. 什么是OLAP ?定义1 :OLAP(联机分析处理)是针对特定问题的联机数据访问和分析.通过对信息(维数据)的多种可能的观察形式进行快速.稳定一致和交互性的存取,允许管理决策人员对数据进行深入观察. ?定义2 :OLAP(联机分析处理) 是使分析人员.管理人员或执行人员能够从多种角度对从原始数据中转化出来的.能够真正为用户所理解的.并真实反映企业维特性的信息进行快速.一致.交互地存取,从而获得对数据的更深入了解的一类软件技术.(OLAP委员会的定义) ?OLAP的目标是满足决策支持或多维环

servlet中service doGet doPost 的关系

在servlet中默认情况下,无论你是get还是post 提交过来都会经过service()方法来处理,然后转向到doGet 或是doPost方法,可以看HttpServlet 类的service方法: protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if(

微软Sql server analysis service数据挖掘技术

最新在一个项目中要求用到微软SSAS中的数据挖掘功能,虽然以前做项目的时候也经常用到SSAS中的多维数据集 (就是CUBE),但是始终没有对SSAS中的数据挖掘功能进行过了解.所以借着项目需求这股东风最近了解了下为SSAS的数据挖掘,这里先写一篇博客做一个简要的归纳. 说到数据挖掘,我们首先需要知道SSAS数据挖掘能干什么,为什么需要进行数据挖掘.我们先来看一个例子假设我们数据库中现在有一张表叫CustomersBoughtCarsSurvey,这张表记录了公司客户购买车辆的信息. CREATE

C# Adomd Connection Analysis Service View Cube

首先需要先引用 C:\Program Files\Microsoft.NET\ADOMD.NET\100\Microsoft.AnalysisServices.AdomdClient.dll                        C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.AnalysisServices.DLL           参照来源为MSDN:http://gallery.technet.

SSAS系列——【03】多维数据(多维数据集对象)

原文:SSAS系列--[03]多维数据(多维数据集对象) 1.什么是Cube? 简单 Cube 对象由基本信息.维度和度量值组组成. 基本信息包括多维数据集的名称.多维数据集的默认度量值.数据源和存储模式等.维度是多维数据集中使用的实际维度组.所有维度都必须先在数据库的维度集合中定义,然后才能在多维数据集中引用.度量值组是多维数据集中的度量值集.度量值组是具有常见数据源视图和维度集的度量值的集合.度量值组是度量值的处理单元:可先对度量值组进行单独处理,然后再浏览.这个概念MSND解释的非常清楚,