从数据到信息
从信息到洞察

参照完整性

  表格没有空白行,切片器里面怎么会有空白项

—– 令人困惑的空白选项

这个问题曾经困扰过很多人:

我的数据中明明没有空白,为什么制作报表的时候,筛选器和图表有时会显示一条空白记录?

空白当然不是凭空产生的,它遵循一定的规律,这篇文章我们来介绍空白项产生的原因,也就是参照完整性

 

关系模型的三类完整性约束

数据库关系模型中有三类完整性约束,分别是:实体完整性,参照完整性,用户定义完整性

实体完整性

用于保证关系数据库中每条记录都是可区分的,唯一的,这种唯一既不能有重复值,也不能有空值。在主键 外键和索引中我们介绍过,这其实就是主键的作用,因此,从便于记忆的角度,你也可以理解为主键完整性。

用户定义完整性

不同的关系数据库因其应用环境的不同,通常需要针对某一具体字段设置约束条件,这种由使用者基于具体业务逻辑设定的约束条件,就叫做用户定义完整性。比如学生的性别字段只能有男、女两个值,学生考试成绩的范围是 0-100 分。

参照完整性

参照完整性,又称引用完整性,是相关联的两个表之间的约束,对于建立关系的两个表来说,维度表中每条记录的外键的值必须是主表中存在的,简单的说,就是事实表的每一行必须在维表中存在对应的记录。

以下表为例,位于关系多端的 Orders 表的外键 CustomerID 存在一条记录[CustomerID = CustX]与维表不匹配,这种情况下以 DIM_A 表的 Customer 列建立筛选器(文章开头的图片),会显示一条空白记录。

违反参照完整性示意图

Power BI 允许违反参照完整性的情况出现,而在数据库系统中,如果两个表之间建立了关联关系,对关系的操作会影响到另一个表中的记录,此时参照的完整性不允许关系中有不存在的实体引用。参照完整性与实体完整性二者,皆是关系模型必须满足的完整性约束条件,其目的在于保证数据一致性。

下面两幅图只有上图符合参照完整性

Power BI 中的参照完整性

  1. 允许违反参照完整性的情况出现,也就是事实表中可以存在与维表不匹配的行,通过维度表的属性汇总数据时,系统将这些不匹配的记录自动映射到空白行。
  2. 空白项本身不代表记录数量,有多条不匹配记录,也只显示一个空白行
  3. 当维度表本身存在空值的时候,参照完整性和自身的空值合并显示会让情况变的复杂

维度表的 Category 列本身有空值,和参照完整性混合显示(右侧)

处理参照完整性

熟悉参照完整性可以帮助你了解源数据中是否在不匹配的记录,以便及时采取相应的措施。不过,很多情况下这种违反并不需要干预。但是出现在报表中的空白就很影响用户体验了,这个时候我们可以使用视觉筛选器过滤掉空白记录。

图表和筛选器都可以使用类似的方法过滤掉空白项

另外,某些 DAX 函数也遵循不同的参照完整性策略,比如 VALUES 考虑参照完整性,DISTINCT 不考虑参照完整性。在表函数部分,会对这种行为做详细介绍。

假设引用完整性对性能的影响

在直连模式下(DirectQuery),使用假设引用完整性可以获得更好的性能表现,如果感觉直连模式下查询缓慢,请检查此设置是否开启。

开启方式

本文隐藏内容查看价格为1G币,请先
注:加入VIP会员可享受全站权益,性价比更高。单独购买的内容长期有效,不受时间限制。

 

6
说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
4 评论数
3 被回复的评论
5 订阅评论的人数
 
查看最近回复
查看最热评论
  订阅本文评论  
最新 最旧 得票最多
提醒
成员
phoebepan

表关系没有引用完整性问题是,“假设应用完整性”这个选项好像是不可选状态?

成员
喵喵的BI_road

请问老师,作为非技术人员,平时使用pbi的数据源都是放在excel里面的。现在数据量越来越大,可以直接用原来在excel里面弄好的维度表和事实表,全部导入到比如mysql数据库?之后数据库里面的数据加载到pbi.
如果是这样的话,我再问问,比如pbi里面的建模,比如一对多,就是可以sql写比如左连接语句。这两者内在逻辑怎么联系起来?

成员
zhangyongjin

老师的2.0版啥时候出版哈 微笑

DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数