PowerBI 使用 內存的列式數據庫 VertiPaq,用於對已發布的數據集進行數據壓縮和快速處理,能夠使PowerBI報表執行脫機訪問,面向列的處理,高度優化對1:N關系的處理性能。關系是數據分析的基礎,正因為數據之間存在關系,分析數據才有了意義。PowerBI支持的關系(Reliationship)有1:N(稱作一對多的關系)和1:1兩種,PowerBI不支持多對多的關系,在設計PowerBI時,通常把1:1的關系合並成一張表,因為任何一個關系都會降低查詢性能。通常意義上,所謂的PowerBI的關系通常是指一對多的關系,關系(1:N)的構成:兩端是查找表(Lookup,維度表Dimension Table)和事實表(Fact,數據表Data Table),其中查找表處於關系的“1”端,而事實表處於關系的“N”端,維度表中建立關系的列的值是唯一的,事實表中建立關系的列的值可以有重復值。
在PowerBI Desktop的關系(Relationship)視圖中,通過實線/虛線表示物理關系(Physical Relationship),實線的兩端是1和*號,表示關系的兩端,這種實線表示的關系處於活躍狀態,虛線是不活躍的關系。虛擬關系(Virtual Relationship)是通過DAX表達式(例如,通過FILTER函數)創建的關系,一般是用在度量值中,用於交互查詢。PowerBI的關系,實際上是按照特定的屬性對另一端進行切片,通常是按照1端的屬性,對N端進行切片和聚合分析。
PowerBI的關系和關系型數據庫的外鍵相似,外鍵是通過兩個表(事實表和維度表)之間的數據列創建的,例如,事實表(Fact)的數據列c_f引用維度表(Dimension)的數據列c_d,前提是:c_d列的值是唯一的,c_f的值必須是c_d列中的值,而c_f列的值允許重復。在PowerBI中,允許c_f列引用不存在於c_d列中的值,這種情況下,PowerBI自動向維度表的c_d列中添加空值(BLANK(),該空值可以通過Slicer查看),用於引用不滿足外鍵關系的列值,稱作回寫空值。
我的PowerBI開發系列的文章目錄:PowerBI開發
一,單向交叉方向
當關系的“Cross Filter Direction”屬性設置為單向的箭頭,即把Cross Filter Direction設置為Single時,箭頭由查找表指向事實表,一旦關系創建成功,查找表用於對事實表進行過濾,按照查找表對事實表進行切片(聚合查詢)。
這種傳統的數據模型和數據倉庫的星型模型相同,特點是:維度表包含屬性,事實表包含度量(measure),按照維度表的屬性對事實表的度量進行切片/聚合查詢。

二,雙向交叉過濾
當關系的“Cross Filter Direction”屬性設置為雙向的箭頭,即把Cross Filter Direction設置為Both時,為了實現數據的過濾,邏輯上可以認為,PowerBI把這兩個表展開成一個大表。

雙向交叉過濾方向會導致有些關系處於不活躍狀態(inactive),當一個維度(lookup)表和多個事實表有關系時,避免使用Both方向,這樣可能會導致部分關系失效,處於不活躍狀態。單向過濾(single-driectional filtering)PowerBI的默認設置,而雙向過濾(bi-directional filtering)是一個不好的設置,因為通過事實表對查找表進行過濾由一定的性能消耗。
三,關系的傳遞
在PowerBI中,關系是可以傳遞的,這就意味着,過濾條件是可以傳遞的。把Filter看作是流水,箭頭的指向是由上游指向下游(查找表處於上游,而數據表處於下游),Filter由查找表流向數據表。一般情況下,按照查找表對數據表進行過濾,Filter由查找表流向數據表,再流向其他關聯的數據表;如果把交叉過濾的方向設置雙向過濾,那么PowerBI可以按照數據表對查找表進行過濾,也就是說,過濾(Filter)由數據表逆流到查找表。雙向交叉過濾使得查找表被過濾和切片,並能對查找表執行聚合查詢。

關系的傳遞有一個副作用,就是Filter的全選和不選有很大的不同:不選包含Blank值,而全選不包含Blank值。
在關系的傳遞時,數據行的缺失會導致下游數據出現空值(BLANK),我使用如下的關系圖演示,注意關系的類型和指向:

導入示例的數據,各個表的數據如下圖所示:

把CourseID作為Filter(Slice可視化控件),下游數據(Card可視化控件,Count(Distinct EventID)會出現Blank,這是因為存在StudentID=4的數據行沒有選擇對應的CourseID。

不選擇任何Filter時,“Count of EventID”的值是2,包含Blank對應的EventID:

當選擇CourseID=1時,“Count of EventID”的值是1:

當選擇所有Filter時,“Count of EventID”的值是1:

四,關系的設計
把數據模型設計成維度表和事實表,維度表和事實表之間的關系是1:N,交叉過濾方向由維度表指向事實表,避免使用Both交叉方向。
由於PowerBI不支持“多對多”關系類型,在處理這種數據時,通常有兩種方式:
- 刪除關系:把"多對多"的數據合並到一個表中
- 把"多對多"的關系轉換成兩個"一對多"的關系:新建一個維度表,該維度表只包含單列的唯一值,連接原“多對多”的兩個表
參考文檔:
Power BI Desktop New Feature: Bi-Directional Relationships!
Why Is My Relationship Inactive in Power BI Desktop?
