一對一關聯性指導方針
本文的目標讀者是使用 Power BI Desktop 的數據模型師。 其能為您提供處理一對一模型關聯性的指導方針。 當兩個資料表個別包含具有通用與唯一值的資料行時,便可以建立一對一關聯性。
注意
本文並未涵蓋模型關聯性簡介。 如果您對關聯性、其屬性或如何進行設定不是很熟悉,建議您先閱讀 Power BI Desktop 中的模型關聯性一文。
您也必須了解星型結構描述設計。 如需詳細資訊,請參閱了解星型結構描述及其對 Power BI 的重要性。
有兩個涉及一對一關聯性的案例:
資料列跨越資料表:單一商務實體或主體可能因資料來源於不同的數據存放區而被載入為兩個(或更多)模型資料表。 此情況對於 維度表來說可能很常見。 例如,主要產品詳細資料會儲存在營運銷售系統中,而補充產品詳細資料則儲存在不同的來源中。
不過,不尋常的是,您會將兩個事實數據表與一對一關聯性建立關聯性。 這是因為這兩個事實數據表都需要有相同的維度和粒度。 此外,每個事實數據表都需要唯一的數據行,才能建立模型關聯性。
變質維度
當事實數據表中的數據行用於篩選或分組時,您可以考慮在個別數據表中提供這些數據行。 如此一來,您會將用於篩選或分組的數據行與用來摘要事實數據列的數據行分開。 此分隔可以:
- 減少儲存空間。
- 簡化模型計算。
- 有助於改善查詢效能。
- 提供更直觀的 數據 窗格體驗,讓報表製作者獲得更好的使用感受。
請考慮名為 Sales
的源數據表,將銷售訂單明細參考詳細數據儲存在兩個數據行中。
OrderNumber
欄位儲存訂單號碼,而 OrderLineNumber
欄位儲存訂單中一連串的行。
在下圖中您會看到訂單編號和訂單行號欄尚未載入到 Sales
表。 相反地,其值用來建立名為 的 OrderLineNumberID
欄。 (索引鍵值的計算方式是將訂單號碼乘以 1000,然後再加上訂單行號。)
Sales Order
維度表為報表作者提供豐富的體驗,包含兩個欄位:Sales Order
和 Sales Order Line
。 這些特定欄位支援需要篩選、分組或向下鑽取訂單和訂單行的報表設計。
由於 Sales Order
數據表衍生自銷售數據,因此每個數據表中的數據列數目應該完全相同。 此外,每個 OrderLineNumberID
欄之間應該有相符的值。
跨資料表的資料列資料
請考慮包含兩個一對一相關維度資料表的範例:Product
和 Product Category
。 每個數據表都代表匯入的數據,並具有包含唯一值的 SKU
(庫存單位)數據行。
以下是這兩個資料表的部分模型圖表。
第一個資料表名為 Product
,其中包含三個數據行:Color
、Product
和 SKU
。 第二個資料表名為 Product Category
,其中包含兩個數據行:Category
和 SKU
。 一對一關聯將兩個 SKU
欄位關聯起來。 關聯性會朝兩個方向進行篩選,此情況在一對一關聯性中一律會發生。
為了協助描述關聯性篩選傳播的運作方式,下圖顯示一些數據表數據列。 此文章中的所有範例都是以此資料為基礎。
下列項目符號清單描述這兩個資料表的資料列詳細資料:
-
Product
資料表有三個資料列:-
SKU
CL-01,Product
T恤,Color
綠色 -
SKU
CL-02,Product
牛仔褲,Color
藍 -
SKU
AC-01、Product
帽子、Color
藍色
-
-
Product Category
表格有兩列:-
SKU
CL-01Category
服裝 -
SKU
AC-01Category
配件
-
請注意,Product Category
資料表不包含產品 SKU CL-02的資料列。 我們將會在此文章稍後討論遺漏此資料列的後果。
在 [數據] 窗格中,報表作者會在兩個數據表中尋找產品相關字段:Product
和 Product Category
。 讓我們看看將來自兩個資料表的欄位新增到資料表視覺效果時,會發生什麼事。 在此範例中,SKU
數據行是從 Product
數據表來源。
請注意,產品 SKU Category
值為 BLANK。 這是因為此產品的 Product Category
數據表中沒有對應的數據列。
建議
在資料列資料會跨越模型資料表時,我們建議您盡可能避免建立一對一模型關聯性。 這是因為此設計可以:
- 參與數據窗格雜亂,列出比必要更多的數據表。
- 讓報表作者難以尋找相關的欄位,因為它們會分散到多個數據表。
- 限制建立階層的能力,因為其層級必須基於相同數據表中的欄位。
- 當數據表之間沒有完全相符的數據列時,產生非預期的結果。
視一對一關聯性為「來源群組內部」或「跨來源群組」而定,特定建議會有所不同。 如需關聯性評估的詳細資訊,請參閱 Power BI Desktop中的
來源群組內部的一對一關聯性
當資料表之間存在一對一的「來源群組內部」關聯性時,建議將資料合併成單一模型資料表。 您可以藉由合併 Power Query 查詢來執行此動作。
下列步驟提供合併和模型化一對一相關數據的方法。
合併查詢:在結合兩個查詢時,請考慮每個查詢中資料的完整性。 如果某個查詢包含一組完整的資料列 (例如主要清單),請將另一個查詢與其合併。 將合併轉換設定為使用 左外部聯結,這是預設聯結類型。 此聯結類型能確保您會保留第一個查詢的所有資料列,並以第二個查詢中任何相符的資料列來加以補充。 將第二個查詢的所有必要資料行展開至第一個查詢。
停用查詢載入:請務必停用第二個查詢的載入。 如此一來,其便不會將結果載入為模型資料表。 此組態可減少數據模型記憶體大小,並協助將 [ 資料 ] 窗格取消整理。
在我們的範例中,報表作者現在會在 [
Product
] 窗格中尋找名為 的單一數據表。 其包含所有產品相關欄位。取代遺漏值:如果第二個查詢具有不相符的數據列,Null 值會出現在它引進的數據行中。 適當時,請考慮使用令牌值取代 Null 值。 當報表作者會依資料行值進行篩選或分組時,取代遺漏值便特別重要,因為報表視覺效果中可能會出現空白。
在下圖中,請注意,產品 SKU CL-02 的類別現在顯示為 [未定義]。 在查詢中,將會以此語彙基元文字值來取代 Null 類別。
建立階層:如果關聯性存在於現已合併之資料表的資料行之間,請考慮建立階層。 如此一來,報表作者將能快速識別報表視覺效果切入的機會。
在我們的範例中,報表作者現在可以使用具有兩個層級的階層:
Category
和Product
。
如果您喜歡個別資料表協助組織欄位的方式,我們仍然建議合併成單一資料表。 您仍然可以組織欄位,只是須改為使用「顯示資料夾」。
在我們的範例中,報表作者可以在 Category
顯示資料夾中找到 Marketing
欄位。
若您仍決定在模型中定義一對一的來源群組內部關聯性,在可能的情況下,請確定相關資料表中具有相符的資料列。 由於一對一的來源群組內部關聯性會評估為一般關聯性,因此資料完整性問題可能會以空白的形式出現在報表視覺效果中。 (您可以在此文章所呈現的第一個資料表視覺效果中看到空白分組的範例。)
跨來源群組的一對一關聯性
當數據表之間存在一對一 跨來源群組 關聯性時,除非您預先合併數據源中的數據,否則沒有替代模型設計。 Power BI 會將一對一模型關聯性評估為受限關聯性。 因此,請小心確保相關數據表中有相符的數據列,因為查詢結果會排除不相符的數據列。
讓我們看看將來自兩個資料表的欄位新增到資料表視覺效果,且資料表之間存在受限關聯性時,會發生什麼事。
第一個表格視覺化,使用跨來源群組關係,只顯示兩行。 缺少產品 SKU CL-02,因為 Product Category
數據表中沒有相符的數據列。 第二個數據表視覺效果會根據模型中的單一合併數據表顯示三個數據列。
相關內容
如需本文的詳細資訊,請參閱下列資源:
- Power BI Desktop 中的模型關聯性
- 了解星型結構描述及其對 Power BI 的重要性
- 關聯性疑難排解指導方針
- 有任何問題嗎? 嘗試詢問網狀架構社群
- 有任何建議嗎? 貢獻想法以改善平臺