Power BI之DAX神功:第4卷第9回 使用弱关系实现多对多及数据规范


我们继续使用上节课的案例,在上节课一开始我们就证明了多对多关系是可以使用的,但是有很多问题。
一、弱关系忽略空行
上节课我们提到了:两张表多对多直接连线是弱关系,会忽略空行。现在我们测试一下,继续使用上节课的3个度量值:

显示品牌时微软被忽略掉了,你观察总计,其实美国微软和微软中国的任务总和21已经加到总计中了。
弱关系下是否显示空行:决定于行标题是否存在筛选器,因为弱关系下扩展表只是自己本身。

反之,当任务表中没有某个品牌,而商品表中有这个品牌,在矩阵上使用任务表[品牌]列进行筛选时,同样不显示商品表多出来的那个品牌。解决方法上节课已经讲过了。
二、数据库表格类型规范
从根本上避开多对多关系,还要从表格本身入手。
【1】每一列做到不可分割
2021年10月2日 我发表的《论数据清洗重要性》视频 提到了像这种不规范的表格。
如果不进行数据清洗,甚至可能会用到我们《DAX神功》第4卷第7回讲到的 桥接表 。

【2】避免过多一端表造成:一对多与多对一共存的数据模型

【3】多行表头、合并单元格、分块都不能用:留给数据分析的一定是一维表
这些表不是说不能用,而是不能在数据分析中使用,很多人觉得M函数难,那你为什么在表格上给自己制造障碍呀?


三、在数据规范的同时还要注意数据大小
《DAX神功》第4卷第6回 介绍了VertiPaq和DirectQuery存储模式,暂时我们接触的存储模式都是VertiPaq导入表,他是内存中的列式数据库。关于VertiPaq原理和优化我们在《DAX神功》DLC优化篇再讲,但是这里要先告诉你一件事:
画重点:PowerBI文件的大小与列的不重复值有关。(我说的不是Excel文件)
有表1、表2、表3这三张表:每张表都是1万行

我们分别将三张表导入PowerBI



三张表的大小如下:

从下图可以看出,文件大小与列的非重复值有关(又称基数),当基数越大文件就越大。

表1只有一列,列基数是10000
表2有6列,列最大基数是1
表3有6列,列最大基数是1
所以文件大小,看的是这张表所有列的基数最大值。行数和列数与文件大小有关系,但是基数影响更大。由于VertiPaq算法不同,可能Excel文件很大,但是导入PowerBI生成的文件就很小,你再转回Excel文件又变大了。。。。PowerBI就是利用这特殊的列式数据库的算法来提速的。
基数就比是系数:例如奖金多系数低,实发奖金就低。

所以很多人不明真相的说,新建列不好,新建列耗费内存,我每次都没有发表决定性的语言,我说的都是不绝对吧?(当然耗费内存这事不能只看文件大小,与计算方法也有关系)
就说列基数这件事:
这两个新建列,对文件大小影响可真的不一样。
对你来说,应该尽量减少一端表的数量,因为主键因素(不为空不重复)。当然你想获得更多颗粒度,那肯定是有代价的。
举例: 你查孙兴华三代人从咱们建国开始查就可以了。如果你从姜子牙开始查,那你需要获取从商朝开始至今所有人的信息。这回颗粒度丰富了。

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
《DAX神功番外篇》文字版合集:
https://www.bilibili.com/read/readlist/rl478271
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等