分享

参照完整性

 优雅野人 2022-05-20 发布于湖北

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

—– 令人困惑的空白选项

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

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

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

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

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

实体完整性

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

用户定义完整性

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

参照完整性

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

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

违反参照完整性示意图

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

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

Power BI 中的参照完整性

允许违反参照完整性的情况出现,也就是事实表中可以存在与维表不匹配的行,通过维度表的属性汇总数据时,系统将这些不匹配的记录自动映射到空白行。

空白项本身不代表记录数量,有多条不匹配记录,也只显示一个空白行

当维度表本身存在空值的时候,参照完整性和自身的空值合并显示会让情况变的复杂

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

处理参照完整性

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

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

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

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

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

开启方式

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

设置界面

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

开启效果

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

设置错误会发生什么

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

视觉对象显示的总订单数量 值为 40

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多