数据模型初探

#01 事实表&维度表

事实表:实际发生的事实,比如交易记录
维度表:丰富事实表的观察维,比如产品属性、客户属性

#02 关系

可以理解为自动化的vlookup(),一般情况下,源表为事实表,相关表为维度表。
表关系通过源表的外键和相关表的主键相关联。

#03 数据模型

彼此间存在关系的一组表格是一个数据模型

#04规范化与反规范化

反规范化设计表格

从用户角度出发,一个产品有那么多的属性,放在一张表中是理所当然的事情

规范化设计表格

从技术人员出发,将属性值单独用表存放,使用外键与主键来关联表,是合理的选择,可以减少数据冗余

实际在PBI应用当中,要根据情况适当反规范化,减少表格,减少数据模型的复杂程度

#05 一对多

在一对多关系中其中“一”端的主键要求每一行都独一无二。
例如:交易表和产品表,产品表中的主键一定是只有一个(比如产品编号)

#06 行上下文&关系

对行数据做操作时,DAX中行上下文不会自动沿关系传递到另一张表中,需要用到两个有用的的函数:RELATED / RELATEDTABLE

RELATED()

在一对多关系中,可以从“多”端访问到“一”端,即从实事表向维度表进行查询,如果“一”端没有匹配,返回空值

使用RELATED可以对数据表反规范化操作,扩展事实表的数据,并将不再使用的维度表从数据模型中隐藏掉,以简化模型。

例:=FactSales[UnitPrice] – DimProduct[ListPrice]

上面的方法无效,因为这是两张表,当前行上下文不会自动沿关系传递到另一张表中,这时需要用RELATED 沿着模型关系,查询当前表的行上下文关联的“一”端DimProduct表中ListPrice对应的值

=FactSales[UnitPrice] – RELATED (DimProduct[ListPrice])

RELATEDTABLE()

如果是从“一”端访问“多”端,就需要用到RELATEDTABLE(),会根据关系,返回一个表(因为从一端查询多端,得到的结果一般有多行)

例:=COUNTROWS( RELATEDTABLE(DimProduct) )

本列中RELATEDTABLE 将返回“一”端主键值对应的“多”端的行,作为一个“表“返
COUNTROWS将对“表”的行数进行计数

RELATED 和 RELATEDTABLE 可以沿着模型中的关系一层层传递,不仅仅只有一层,前提是该关系链的类型(即一对多或多对一)和方向相同

#07 筛选上下文 & 关系

DAX语言筛选在模型中的传递

筛选上下文会自动与关系相互作用,即当我们在报表中进行筛选时,所做出的筛选会沿着模型关系进行传递,当然,这种传递依旧受关系类型与方向的影响。

筛选上下文只能是从“一”端自动传递到“多”端,无法从“多”端传递到“一”端,与多少层关系无关。

当我们从产品表中筛选一个产品时,该筛选可以传递到对应“多”端的销售明细表中,但是反过来,从“多”端的销售明细表中,无法筛选产品表

Leave a Reply

Your email address will not be published. Required fields are marked *