雙向關聯性指導方針
本文的目標讀者是使用 Power BI Desktop 的數據模型設計師。 其提供您有關何時建立雙向模型關聯性的指導方針。 雙向關聯性是「雙向」進行篩選的關聯性。
注意
本文並未涵蓋模型關聯性簡介。 如果您對關聯性、其屬性或如何進行設定不是很熟悉,建議您先閱讀 Power BI Desktop 中的模型關聯性一文。
您也必須了解星型結構描述設計。 如需詳細資訊,請參閱了解星型結構描述及其對 Power BI 的重要性。
一般而言,我們建議您將雙向關聯性的用法降到最低。 這是因為它們可能會對模型查詢效能產生負面影響,而且可能會為您的報表用戶帶來令人困惑的體驗。
不過,雙向篩選可以解決特定需求時,有三種案例:
特殊模型關聯性
建立下列兩個特殊模型關聯性類型時,雙向關聯性扮演著重要角色:
- 一對一:所有一對一關聯性都必須是雙向的,否則不可能進行設定。 一般而言,我們不建議您建立這些類型的關聯性。 如需關於完整的討論和替代設計模式,請參閱 一對一關係指引。
- 多對多:當關聯兩個 維度數據表時,需要 橋接數據表。 需要雙向篩選,以確保篩選會在橋接資料表之間傳播。 如需詳細資訊,請參閱 多對多關聯性指引。
交叉分析篩選器選項「含數據」
雙向關係可以提供篩選器,以限制選項到數據存在的地方。 (如果您熟悉 Excel 數據透視表和交叉分析篩選器,則從 Power BI 語意模型或 Analysis Services 模型採購數據時,這是預設行為。為了協助說明其意義,請先考慮下列模型圖表。
第一個資料表名為 Customer
.,其中包含三個數據行:Country-Region
、Customer
和 CustomerCode
。 第二個資料表名為 Product
,其中包含三個數據行:Color
、Product
和 SKU
。 第三個數據表名為 Sales
,其中包含四個數據行:CustomerCode
、OrderDate
、Quantity
和 SKU
。
Customer
和 Product
數據表是維度數據表,而且每個數據表都有與 Sales
數據表的一對多關聯性。 每個關聯性都會以單一方向進行篩選。
為了協助描述雙向關聯性篩選的運作方式,此模型圖表已修改為顯示資料表資料列。 此文章中的所有範例都是以此資料為基礎。
下列項目符號清單描述這三個資料表的資料列詳細資料:
-
Customer
表格有兩行資料:-
CustomerCode
CUST-01Customer
Customer-1,Country-Region
美國 -
CustomerCode
CUST-02,Customer
Customer-2,Country-Region
澳大利亞
-
-
Product
資料表有三個資料列:-
SKU
CL-01,Product
T恤,Color
綠色 -
SKU
CL-02,Product
牛仔褲,Color
藍 -
SKU
AC-01、Product
Hat、Color
Blue
-
-
Sales
資料表有三個資料列:-
OrderDate
2019 年 1 月 1 日,CustomerCode
CUST-01,SKU
CL-01,Quantity
10 -
OrderDate
2019 年 2 月 2 日,CustomerCode
CUST-01,SKU
CL-02,Quantity
20 -
OrderDate
2019 年 3 月 3 日,CustomerCode
CUST-02,SKU
CL-01,Quantity
30
-
現在請考量下列報表頁面。
此頁面由兩個交叉分析篩選器與一個卡片視覺效果組成。 第一個交叉分析篩選器是以 [Country-Region
] 字段為基礎,它有兩個選項:澳大利亞和美國。 其目前是由澳洲所配量。 第二個篩選器是以 Product
欄位為基礎,它有三個選項:帽子、牛仔褲和 T 恤。 未選取任何項目 (表示不會篩選任何產品)。 卡片視覺效果會顯示數量為 30。
當報表使用者按澳大利亞進行切片時,您可能會想要將產品篩選器限制為顯示與澳大利亞銷售相關的資料選項,尤其是那些資料 與 相關聯的選項。 這就是「含數據」顯示篩選器選項的意思。 您可以設定 Product
與 Sales
數據表之間的關聯性,以雙向篩選 ,來達成此行為。
產品篩選器現在會列出唯一選項:T 恤。 此選項代表唯一銷售給澳大利亞客戶的產品。
首先,建議您仔細考慮此設計是否適用於報表使用者。 有些報表用戶發現體驗令人困惑,因為他們不理解為何在與其他切片器互動時,切片器選項會動態顯示或消失。
如果您決定顯示篩選器選項「含數據」,我們不建議您設定雙向關聯。 雙向關聯性需要更多的處理,因此它們可能會對查詢效能產生負面影響,特別是隨著模型中的雙向關聯性數目增加。
有更好的方法可以達到相同的結果:您不必使用雙向篩選,而是將視覺層級過濾器套用至產品篩選器本身。
現在,假設 Product
與 Sales
數據表之間的關聯性不再雙向篩選。 而且,下列量值定義已新增至 Sales
數據表。
Total Quantity = SUM(Sales[Quantity])
若要顯示產品篩選器選項「含數據」,只需使用「不是空白」條件來篩選 Total Quantity
量值。
維度對維度分析
涉及雙向關聯性的不同案例將 事實數據表 視作 橋接數據表。 如此一來,它支援在另一個維度表的篩選上下文中分析維度表數據。
使用此文章中的範例模型,請思考如何回答下列問題:
- 向澳洲客戶銷售了多少種顏色?
- 有幾個國家/地區購買了牛仔褲?
這兩個問題都可以 回答,而不需要在橋接事實數據表中彙總數據。 不過,它們會要求篩選從一個維度數據表傳播到另一個維度數據表。 當篩選透過事實表傳播時,可以使用 DISTINCTCOUNT DAX 函式對維度表欄位進行彙總,也可能使用 MIN 和 MAX DAX 函式。
事實數據表的行為就像橋接數據表一樣,您可以套用多對多關聯性指引來關聯兩個維度數據表。 它至少需要設定一個關聯性,用來進行雙向篩選。 如需詳細資訊,請參閱 多對多關聯性指引。
不過,如本文所述,此設計可能會對效能產生負面影響,並對與 交叉分析篩選器選項「包含資料」有關的用戶體驗產生不良後果。 因此,我們建議您改為使用 CROSSFILTER DAX 函式,在量值定義中啟用雙向篩選。 您可以在表達式評估期間,使用 CROSSFILTER 函式來修改篩選方向,或甚至停用關聯性。
請考慮將下列量值定義新增至 Sales
數據表。 在這裡範例中,已設定 Customer
與 Sales
資料表之間的模型關聯性,以 單向篩選。
Different Countries Sold =
CALCULATE(
DISTINCTCOUNT(Customer[Country-Region]),
CROSSFILTER(
Customer[CustomerCode],
Sales[CustomerCode],
BOTH
)
)
在評估 Different Countries Sold
指標的過程中,Customer
和 Sales
表之間的關係會進行雙向篩選。
下列資料表視覺效果顯示每個銷售產品的統計資料。
Quantity
數據行只是數量值的總和。
Different Countries Sold
欄代表所有已購買產品之客戶的不同國家/地區值的計數。
相關內容
如需本文的詳細資訊,請參閱下列資源: