首页 > 代码库 > SqlServer Analysis Service的事实维度关系

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维度关系相同的查询结果:

技术分享

 

SqlServer Analysis Service的事实维度关系