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. vue.js + ajax 数据加载(纯新手get)

    似懂非懂的感觉下撸了一个小demo .(只是单纯的引用vue.js的小demo.)在实践中进步吧! 首先肯定要先看vue的文档,并且知道超超基础的小知识!!!奉上代码: HTML 部分: js的引用: ...

  2. Deadclock on calling async methond

    Issue: HttpClient.GetAsync(…) never returns when using await/async Related Posts: http://stackoverfl ...

  3. github+hexo搭建自己的博客网站(三)主题之外的一些基本配置(图片位置,文章目录功能)

    使用的yilia主题之后,还需要进行自己的定制配置 1.图片的位置 比如打赏的支付宝二维码图片,是在当前博客的source/assets/img/下 (不是当前主题) 配置:(在yilia主题下文件里 ...

  4. Json安全

    1.不要使用顶级JSON数组,避免被<script>标签引用. 2.使用POST+密钥获取JSON,尽量不要用GET方式. 3.不要使用eval()将对象放入内存,eval()会执行所传入 ...

  5. BotVS趋势交易策略-RSI

    BotVS趋势交易策略-RSI, 基于Python实现. RSI简单买卖测试, 默认 70-100卖出,0-30买入 参数 代码 import math def adjustFloat(v): ret ...

  6. [Spring面试] 问题整理

    1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC:Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spri ...

  7. Linux常用命令简单总结

    Liunx常用命令 1. 文件及目录管理 1.1. ls:显示目录 参数及说明 空:补显示隐含文件 -a:显示所有文件 -l:显示详细列表 1.2. chgrp:设置文件组(root权限) 用法示例 ...

  8. github开源项目学习-front-end-collect

    About 项目地址 项目预览demo(githubio加载较慢) 开源项目fork自:https://github.com/foru17/front-end-collect 此文章是对此开源项目使用 ...

  9. 各种选择框jQuery的选中方法

    select下拉列表的选中方法是:$("slect option:eq(1)").attr("selected",true);//选中第二个option che ...

  10. 有哪些关于 Python 的技术博客?

    Python是一种动态解释型的编程语言,它可以在Windows.UNIX.MAC等多种操作系统以及Java..NET开发平台上使用.不过包含的内容很多,加上各种标准库.拓展库,乱花渐欲迷人眼.因此如何 ...