PowerBI开发 第五篇:关系的设计
PowerBI 使用 内存的列式数据库 VertiPaq,用于对已发布的数据集进行数据压缩和快速处理,能够使PowerBI报表执行脱机访问,面向列的处理,高度优化对1:N关系的处理性能。PowerBI支持的关系(Reliationship)有1:N(称作一对多的关系)和1:1两种,PowerBI不支持多对多的关系,在设计PowerBI时,通常把1:1的关系合并成一张表,因为任何一个关系都会降低查询性能。通常意义上,所谓的PowerBI的关系通常是指一对多的关系,关系(1:N)的构成:两端是查找表(Lookup,维度表Dimension Table)和事实表(Fact,数据表Data Table),其中查找表处于关系的“1”端,而事实表处于关系的“N”端,维度表中建立关系的列的值是唯一的,事实表中建立关系的列的值可以有重复值。
在PowerBI Desktop的关系(Relationship)视图中,通过实线/虚线表示物理关系(Physical Relationship),实线的两端是1和*号,表示关系的两端,这种实线表示的关系处于活跃状态,虚线是不活跃的关系。虚拟关系(Virtual Relationship)是通过DAX表达式(例如,通过FILTER函数)创建的关系,一般是用在度量值中,用于交互查询。PowerBI的关系,实际上是按照特定的属性对另一端进行切片,通常是按照1端的属性,对N端进行切片和聚合分析。
一,单向交叉方向
当关系的“Cross Filter Direction”属性设置为单向的箭头,即把Cross Filter Direction设置为Single时,箭头由查找表指向事实表,一旦关系创建成功,查找表用于对事实表进行过滤,按照查找表对事实表进行切片(聚合查询)。
这种传统的数据模型和数据仓库的星型模型相同,特点是:维度表包含属性,事实表包含度量(measure),按照维度表的属性对事实表的度量进行切片/聚合查询。
二,双向交叉过滤
当关系的“Cross Filter Direction”属性设置为双向的箭头,即把Cross Filter Direction设置为Both时,为了实现数据的过滤,逻辑上可以认为,PowerBI把这两个表展开成一个大表。
双向交叉过滤方向会导致有些关系处于不活跃状态(inactive),当一个维度(lookup)表和多个事实表有关系时,避免使用Both方向,这样可能会导致部分关系失效,处于不活跃状态。单向过滤(single-driectional filtering)PowerBI的默认设置,而双向过滤(bi-directional filtering)是一个不好的设置,因为通过事实表对查找表进行过滤由一定的性能消耗。
三,关系的传递
在PowerBI中,关系是可以传递的,这就意味着,过滤条件是可以传递的。把Filter看作是流水,箭头的指向是由上游指向下游(查找表处于上游,而数据表处于下游),Filter由查找表流向数据表。一般情况下,按照查找表对数据表进行过滤,Filter由查找表流向数据表,再流向其他关联的数据表;如果把交叉过滤的方向设置双向过滤,那么PowerBI可以按照数据表对查找表进行过滤,也就是说,过滤(Filter)由数据表逆流到查找表。双向交叉过滤使得查找表被过滤和切片,并能对查找表执行聚合查询。
关系的传递有一个副作用,就是Filter的全选和不选有很大的不同:不选包含Blank值,而全选不包含Blank值。
在关系的传递时,数据行的缺失会导致下游数据出现空值(BLANK),我使用如下的关系图演示,注意关系的类型和指向:
导入示例的数据,各个表的数据如下图所示:
把CourseID作为Filter(Slice可视化控件),下游数据(Card可视化控件,Count(Distinct EventID)会出现Blank,这是因为存在StudentID=4的数据行没有选择对应的CourseID。
四,关系的设计
把数据模型设计成维度表和事实表,维度表和事实表之间的关系是1:N,交叉过滤方向由维度表指向事实表,避免使用Both交叉方向。
由于PowerBI不支持“多对多”关系类型,在处理这种数据时,通常有两种方式:
- 删除关系:把"多对多"的数据合并到一个表中
- 把"多对多"的关系转换成两个"一对多"的关系:新建一个维度表,该维度表只包含单列的唯一值,连接原“多对多”的两个表
参考文档:
Power BI Desktop New Feature: Bi-Directional Relationships!
Why Is My Relationship Inactive in Power BI Desktop?
PowerBI开发 第五篇:关系的设计的更多相关文章
- PowerBI开发 第五篇:关系和交互
PowerBI 使用 内存的列式数据库 VertiPaq,用于对已发布的数据集进行数据压缩和快速处理,能够使PowerBI报表执行脱机访问,面向列的处理,高度优化对1:N关系的处理性能.关系是数据分析 ...
- PowerBI开发 第十一篇:报表设计技巧(更新)
PowerBI版本在持续的更新,这使得报表设计能够实现更多新的功能,您可以访问 PowerBI Blog查看PowerBI的最新更新信息,本文总结了PowerBI新版本的重要更新和设计技巧. 我的Po ...
- PowerBI开发 第三篇:报表设计技巧
最近做了几个PowerBI报表,对PowerBI的设计有了更深的理解,对数据的塑形(sharp data),不仅可以在Data Source中实现,例如在TSQL查询脚本中,而且可以在PowerBI中 ...
- PowerBI开发 第八篇:查询参数
在PowerBI Desktop中,用户可以定义一个或多个查询参数(Query Parameter),参数的功能是为了实现PowerBI的参数化编程,使得Data Source的属性.替换值和过滤数据 ...
- PowerBI开发 第四篇:DAX表达式
DAX 表达式主要用于创建度量列(Measure),度量值是根据用户选择的Filter和公式,计算聚合值,DAX表达式基本上都是引用对应的函数,函数的执行有表级(Table-Level)上下文和行级( ...
- PowerBI开发 第四篇:DAX 表达式基础
DAX 表达式主要用于创建度量列(Measure),度量值是根据用户选择的Filter和公式,计算聚合值,DAX表达式基本上都是引用对应的函数,函数的执行有表级(Table-Level)上下文和行级( ...
- PowerBI入门 第三篇:报表设计技巧
最近做了几个PowerBI报表,对PowerBI的设计有了更深的理解,对数据的塑形(sharp data),不仅可以在Data Source中实现,例如在TSQL查询脚本中,而且可以在PowerBI中 ...
- PowerBI开发 第七篇:数据集和数据刷新
PowerBI报表是基于数据分析的引擎,数据真正的来源(Data Source)是数据库,文件等数据存储媒介,PowerBI支持的数据源类型多种多样.PowerBI Service(云端)有时不直接访 ...
- PowerBI开发 第十三篇:增量刷新
PowerBI 将要解锁增量刷新(Incremental refresh)功能,这是一个令人期待的更新,使得PowerBI可以加载大数据集,并能减少数据的刷新时间和资源消耗,该功能目前处于预览状态,只 ...
随机推荐
- 关于php文件读取的一些学习记录
初学PHP的时候使用了一些文件读取API,但是没有真正弄清楚各API的区别以及差异,于是找了一篇学习了一下,贴在这里,引用自IBM社区的一篇文章, 整体整理测试如下 <?php /** * Cr ...
- RoutePrefix和Route 路由前缀
使用应用到某个控制器中所有操作的路由前缀来批注该控制器. web api /// <summary> ////// </summary> [RoutePrefix(" ...
- Myeclipse详细使用教程
Myeclipse详细使用教程.. /*+Shift+Enter(生成多行注释) /**+Shift+Enter(生成文档注释)-----------------问题:在编辑jsp的时候,如果光标移动 ...
- 【JBoss】Linux下JBoss服务器"Too many open files"的解决方法
linux中,每个socket连接都使用文件描述符进行标识,文件描述符属于系统资源,存在使用上的限制:缺省情况下JBoss能使用的最大描述符数是系统默认的最大文件描述符数(通过命令ulimit -H ...
- mysql存储过程查询结果循环遍历 判断 赋值 游标等基本操作
一.首先说下本篇博客所实现功能的背景和功能是怎样的: 背景:因为公司项目开始迁移新平台项目,所以以前的平台老数据以及订单信息需要拆分表,而且需要业务逻辑来分析以前的订单表,来拆分成另外的几个新表,包括 ...
- python+selenium自动化软件测试(第16章):基础实战(3)
#coding:utf-8 from time import sleep from selenium import webdriver class cloudedge_register(object) ...
- Java的类型转换
Java的类型转换 在适当的时候,我们会想要将一种数据类型自动转换成另一种,比如把int转化成float类型.Java有隐藏式的自动转换,可以自动转换成想要的类型,但是强制的自动转换的话,.需要将希望 ...
- java对象与json对象之间的转换
jar包:import net.sf.json.JSONObject; 1.解析json字符串 将json字符串转换为json对象,然后再解析json对象:.JSONObjectjsonObject ...
- C语言运算符运算顺序判断实例1
程序1 #include <stdio.h> int main(void) { , j = , k = ; printf("%d\n", --j > i & ...
- Core Java 谈谈HashMap
说起Java的HashMap相信大家都不是很陌生,但是对于HashMap内部结构有些同学可能不太了解,咱们下一步就将其展开. HashMap是基于Hash算法的,同理的还有HashSet和HashTa ...