[知识体系] 参照完整性

  [复制链接]
查看191112 | 回复157 | 2021-2-21 19:36:57 | 显示全部楼层 |阅读模式
  表格没有空白行,切片器里面怎么会有空白项

7157211936391.png

—– 令人困惑的空白选项


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


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


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




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

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

实体完整性

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

用户定义完整性

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

参照完整性

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


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


7157211936392.png

违反参照完整性示意图


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


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


7157211936393.png


7157211936394.png

Power BI 中的参照完整性

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


7157211936395.png

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

处理参照完整性

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


7157211936396.gif

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


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

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

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

开启方式

在创建表关系界面下会显示“假设引用完整性”,选中后,Power BI 将对数据验证此设置,以确保没有 Null 或不匹配的行。 但是 ,在值的数量非常大的情况下,验证不能保证没有引用完整性问题。


7157211936397.png

设置界面


验证将在编辑关系时执行,如果数据有任何后续更改,验证结果不会自动更新。

开启效果

查询语句从左外连接变为内连接,大大减轻计算开销。



7157211936398.png


设置错误会发生什么



如果在数据中有引用完整性问题时设置“假设引用完整性”,此设置不会导致错误 。 但是,将导致数据明显不一致。 例如:


  • 视觉对象显示的总订单数量 值为 40
  • 视觉对象显示总的 按仓库城市的订单数量 值仅为 30 ,因为它不包含未匹配记录所含的订单数量。
回复

使用道具 举报

luanmm | 2021-4-24 19:26:06 | 显示全部楼层
佩服佩服!
回复

使用道具 举报

搏斗小子 | 2021-8-23 21:12:02 | 显示全部楼层
站位支持
回复

使用道具 举报

champoin | 2021-9-23 15:11:50 | 显示全部楼层
向楼主学习
回复

使用道具 举报

ailinchen | 2021-9-24 18:49:32 | 显示全部楼层
介是神马?!!
回复

使用道具 举报

易水寒 | 2021-10-11 13:19:27 | 显示全部楼层
太棒了,感谢唐楼主精彩的分享
回复

使用道具 举报

薄荷 | 2021-10-12 08:46:39 | 显示全部楼层
小白一个 顶一下
回复

使用道具 举报

lwfeng | 2021-10-26 20:09:14 | 显示全部楼层
谢谢,一直在学习云发教育课程!
回复

使用道具 举报

树洪 | 2021-11-2 14:20:11 | 显示全部楼层
楼猪V5啊
回复

使用道具 举报

mumiao | 2021-11-3 06:00:51 | 显示全部楼层
垃圾内容,路过为证。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则