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不支持“多对多”关系类型,在处理这种数据时,通常有两种方式:

  1. 删除关系:把"多对多"的数据合并到一个表中
  2. 把"多对多"的关系转换成两个"一对多"的关系:新建一个维度表,该维度表只包含单列的唯一值,连接原“多对多”的两个表

参考文档:

Power BI Desktop New Feature: Bi-Directional Relationships!

Why Is My Relationship Inactive in Power BI Desktop?

 

PowerBI开发 第五篇:关系的设计的更多相关文章

  1. PowerBI开发 第五篇:关系和交互

    PowerBI 使用 内存的列式数据库 VertiPaq,用于对已发布的数据集进行数据压缩和快速处理,能够使PowerBI报表执行脱机访问,面向列的处理,高度优化对1:N关系的处理性能.关系是数据分析 ...

  2. PowerBI开发 第十一篇:报表设计技巧(更新)

    PowerBI版本在持续的更新,这使得报表设计能够实现更多新的功能,您可以访问 PowerBI Blog查看PowerBI的最新更新信息,本文总结了PowerBI新版本的重要更新和设计技巧. 我的Po ...

  3. PowerBI开发 第三篇:报表设计技巧

    最近做了几个PowerBI报表,对PowerBI的设计有了更深的理解,对数据的塑形(sharp data),不仅可以在Data Source中实现,例如在TSQL查询脚本中,而且可以在PowerBI中 ...

  4. PowerBI开发 第八篇:查询参数

    在PowerBI Desktop中,用户可以定义一个或多个查询参数(Query Parameter),参数的功能是为了实现PowerBI的参数化编程,使得Data Source的属性.替换值和过滤数据 ...

  5. PowerBI开发 第四篇:DAX表达式

    DAX 表达式主要用于创建度量列(Measure),度量值是根据用户选择的Filter和公式,计算聚合值,DAX表达式基本上都是引用对应的函数,函数的执行有表级(Table-Level)上下文和行级( ...

  6. PowerBI开发 第四篇:DAX 表达式基础

    DAX 表达式主要用于创建度量列(Measure),度量值是根据用户选择的Filter和公式,计算聚合值,DAX表达式基本上都是引用对应的函数,函数的执行有表级(Table-Level)上下文和行级( ...

  7. PowerBI入门 第三篇:报表设计技巧

    最近做了几个PowerBI报表,对PowerBI的设计有了更深的理解,对数据的塑形(sharp data),不仅可以在Data Source中实现,例如在TSQL查询脚本中,而且可以在PowerBI中 ...

  8. PowerBI开发 第七篇:数据集和数据刷新

    PowerBI报表是基于数据分析的引擎,数据真正的来源(Data Source)是数据库,文件等数据存储媒介,PowerBI支持的数据源类型多种多样.PowerBI Service(云端)有时不直接访 ...

  9. PowerBI开发 第十三篇:增量刷新

    PowerBI 将要解锁增量刷新(Incremental refresh)功能,这是一个令人期待的更新,使得PowerBI可以加载大数据集,并能减少数据的刷新时间和资源消耗,该功能目前处于预览状态,只 ...

随机推荐

  1. 关于php文件读取的一些学习记录

    初学PHP的时候使用了一些文件读取API,但是没有真正弄清楚各API的区别以及差异,于是找了一篇学习了一下,贴在这里,引用自IBM社区的一篇文章, 整体整理测试如下 <?php /** * Cr ...

  2. RoutePrefix和Route 路由前缀

    使用应用到某个控制器中所有操作的路由前缀来批注该控制器. web api /// <summary> ////// </summary> [RoutePrefix(" ...

  3. Myeclipse详细使用教程

    Myeclipse详细使用教程.. /*+Shift+Enter(生成多行注释) /**+Shift+Enter(生成文档注释)-----------------问题:在编辑jsp的时候,如果光标移动 ...

  4. 【JBoss】Linux下JBoss服务器"Too many open files"的解决方法

    linux中,每个socket连接都使用文件描述符进行标识,文件描述符属于系统资源,存在使用上的限制:缺省情况下JBoss能使用的最大描述符数是系统默认的最大文件描述符数(通过命令ulimit -H ...

  5. mysql存储过程查询结果循环遍历 判断 赋值 游标等基本操作

    一.首先说下本篇博客所实现功能的背景和功能是怎样的: 背景:因为公司项目开始迁移新平台项目,所以以前的平台老数据以及订单信息需要拆分表,而且需要业务逻辑来分析以前的订单表,来拆分成另外的几个新表,包括 ...

  6. python+selenium自动化软件测试(第16章):基础实战(3)

    #coding:utf-8 from time import sleep from selenium import webdriver class cloudedge_register(object) ...

  7. Java的类型转换

    Java的类型转换 在适当的时候,我们会想要将一种数据类型自动转换成另一种,比如把int转化成float类型.Java有隐藏式的自动转换,可以自动转换成想要的类型,但是强制的自动转换的话,.需要将希望 ...

  8. java对象与json对象之间的转换

    jar包:import net.sf.json.JSONObject; 1.解析json字符串 将json字符串转换为json对象,然后再解析json对象:.JSONObjectjsonObject ...

  9. C语言运算符运算顺序判断实例1

    程序1 #include <stdio.h> int main(void) { , j = , k = ; printf("%d\n", --j > i & ...

  10. Core Java 谈谈HashMap

    说起Java的HashMap相信大家都不是很陌生,但是对于HashMap内部结构有些同学可能不太了解,咱们下一步就将其展开. HashMap是基于Hash算法的,同理的还有HashSet和HashTa ...