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