Power BI之DAX神功:第4卷第6回 理解DAX中的物理關系
一、VertiPaq和DirectQuery存儲模式
跟我學過Access基礎篇的小伙伴,一定知道,數(shù)據(jù)庫中可以導入表,也可以鏈接表。
// 如果你在火力全開第1集沒聽我的,沒去學習且無基礎,那也就證明你不懂數(shù)據(jù)庫基本原理,雖然DAX原理有些地方有爭議性,是各抒己見的。但是很多不懂數(shù)據(jù)庫基本原理的人,直接學習DAX原理,甚至講出DAX原理,能犯下很多低級錯誤,而且造成這些錯誤的原理與DAX毫無關系,因為知識是相通的。
VertiPaq:就類似import導入表,簡單的說就是將表中的數(shù)據(jù)導入到PowerBI。(我這只是簡單的說)
DirectQuery:就類似鏈接表,數(shù)據(jù)還在數(shù)據(jù)源中,這里只是個影像。鏈接表就好比看電視,比如說你不喜歡這個明星,你把電視砸了,明天你買臺新電視,那個明星又出現(xiàn)了。
當然,VertiPaq和DirectQuery都是有原理而且還有復合模型的存儲模式,《權威指南》第17章有詳細講解,這牽扯優(yōu)化知識,我們會在不久將來《DAX神功》DLC優(yōu)化篇詳細講這部分的原理知識。
從2020.3~2021.12 我所有課程講的都是VertiPaq導入表。
截止2021年10月2日,微軟官網(wǎng)發(fā)布的PowerBI數(shù)據(jù)源,我摘抄了幾個常用源:

暫時只有SQL Server支持DirectQuery,但是這個數(shù)據(jù)是實時變化的,也許你看到這篇文章時,微軟做了調整,均實現(xiàn)了DirectQuery也說不定。因為Access都能以鏈接表方式連接Excel、TXT、CSV、Access等文件,PowerBI未來可期(也可能永遠都不支持)。

Ps: SQL Server也可以導入,有些人會問硬盤存不下怎么辦?SQL的查詢語句是干嘛的?14億中國人,我想分析某一個省的平均壽命,我應該到民政局調取這個省的記錄,而不是取14億中國人的記錄。但是,你確實要分析14億中國人的平均壽命,這時使用導入可能不合適了,DirectQuery會更快一些。DAX優(yōu)化既有對導入表的優(yōu)化,也有對DirectQuery的優(yōu)化。我們在不久將來的DLC中再做詳解。
在很多地方都可以看到表的存儲模式,例如在模型中鼠標懸停在紅卷之內:

友情提示:如果一張表是VertiPaq模式、另一張表是DirectQuery模式,這兩張表進行連線后必然影響查詢速度。在同一模式下就相當于是國內服務器之間訪問,不同模式下,就相當于是國內服務器訪問國外服務器。在建立關系時盡量避開不同模式下的連線。
二、強關系、弱關系直接決定擴展表
確定是強關系還是弱關系,要看兩點:
<1> 主鍵? ? ? ? ? <2> 存儲模式
簡單的說就一句話:有主鍵且在同一存儲模式下就是強關系,否則弱關系。
那強關系與弱關系有什么意義呢?弱關系擴展表就是自己原生列,不會有相關列!

Access基礎篇我們講過:主鍵要求:不為空,不重復,不易發(fā)生改變。
外鍵是相對存在的!什么叫相對,比如說A1單元格右邊的單元格、你前面的同學,比孫興華年齡小的人。說白了外鍵就是相對主鍵存在的。
大家都知道,三種表關系:1對1、1對多、多對多,我們分別來看一下他們是什么關系

如上圖所示,一對一關系,左表學號(主鍵)不為空不重復,連接右表學號(外鍵),只要兩張表存儲模式相同,就是強關系,否則是弱關系。
例如左表是導入表VertiPaq(假設是導入的Excel),右表是鏈接表DirectQuery(假設是鏈接SQL Server),兩張表是弱關系,左右表的擴展表都是自己本身,不會向一端延申。
否則如果兩張表都來自同一存儲模式,那就是強關系,左表擴展表包含右表所有列,右表擴展表也包含左表所有列。因為擴展表原理是向一端延伸。

如上圖所示,一對多關系左表有主鍵,如果兩表在同一存儲模式下就是強關系,右表向左表(一端)擴展,但是左表不能向右表(多端)擴展。反之,如果兩表在不同存儲模式下,就是弱關系,弱關系下擴展表就是自己本身,不能向一端表延伸。

多對多關系,沒有主鍵,因為主鍵要求不為空不重復。無論是否在同一存儲模式下,都是弱關系,擴展表都是自己本身。因為我們在講擴展表原理時提到,擴展表只能向一端擴展,其原理是因為多對多關系沒有主鍵。
Ps: 有些人將左表學號說成主鍵,那是不對的。
三、因不滿足實時參照完整性產(chǎn)生的空行只會出現(xiàn)在強關系中
《DAX神功》第1卷第9回 我們講到了因為不滿足實時參照完整性,比如一端商品表中都是華為手機,但是多端銷售表中出現(xiàn)了小米手機,這就是不滿足實時參照完整性,我們在使用VALUES或ALL等函數(shù)時會產(chǎn)生空行。但是這只限于強關系的情況下。
怎么確定是強關系:<1> 有主鍵? ? ? ? ??<2> 在同一存儲模式下
當時我們在一對多關系下證明了,我跟大家說,一對一關系應該合并成一張表。如果你不合并,就是用原理,那么空行這件事,只看是不是強關系。下面我們用一對一來驗證:

如上圖所示,一對一關系有主鍵,同一存儲模式,強關系。
我們分別使用DISTINCT和VALUES測試空行問題:
返回結果:

總結:只要滿足強關系,當不滿足實時參照完整性時,使用VALUES和ALL等就會產(chǎn)生空行。
四、表關系之箭頭方向
【1】一對一關系,必須是雙向,你改不了單向箭頭
但是可以使用CROSSFILTER停用關系

【2】一對多關系,默認是單向箭頭,從一端指向多端。你可以手工改成雙向箭頭。
但是不推薦這么做,詳見《DAX神功》第1卷第2回
原理:雖然你兩張表之間保持了一對多關系,但是一旦你使用了雙向箭頭,這一條線路上,可能就形成了多對多關系,這樣就會出現(xiàn)您想不到的結果。如下圖所示:因為改變了表2與表3的箭頭方向,線路2中出現(xiàn)了多對多關系。

【3】多對多關系,可以選擇單向箭頭或雙向箭頭
在建立關系時,會彈出下面對話框,讓你選擇是哪張表篩選哪張表或者兩個表雙向篩選。

在這點上就有別于一對多關系,一對多關系使用單向箭頭時必須是一端篩選多端,但是在多對多關系中,由于兩張表都是多端,需要你手工指定誰篩選誰,或者是相互篩選。
五、多表確定強弱關系

表1與表2是強關系,因為有主鍵且同一模式。
表2與表3是弱關系,雖然有主鍵但不在同一模式。

《孫興華講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函數(shù))、PowerQuery(M函數(shù))、Python辦公自動化、Python爬蟲、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110