關係
適用於: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium
在表格式模型中,關聯性是兩個數據表之間的連接。 關聯性會建立兩個數據表中的數據應該如何相互關聯。 例如,Customers 數據表和 Orders 資料表可以相關,以顯示與每個訂單相關聯的客戶名稱。
從相同的數據源匯入時,您選擇匯入的數據表(數據源)中已經存在的關聯性將會在模型中重新建立。 您可以使用 [圖表檢視] 中的模型設計工具,或使用 [管理關聯性] 對話框,來檢視偵測並自動重新建立的關聯性。 您也可以使用 [圖表檢視] 中的模型設計工具,或使用 [建立關聯性] 或 [管理關聯性] 對話框,手動建立數據表之間的新關聯性。
定義數據表之間的關聯性之後,不論是在匯入或手動建立期間自動建立,您就能夠使用相關數據行來篩選數據,並在相關數據表中查閱值。
提示
如果您的模型包含許多關聯性,[圖表檢視] 可協助您更清楚地可視化並建立數據表之間的新關聯性。
好處
關聯性是兩個數據表之間的連接,根據每個數據表中的一或多個數據行。 若要查看關聯性為何很有用,假設您追蹤企業客戶訂單的數據。 您可以追蹤單一資料表中具有如下結構的所有資料:
CustomerID | 名字 | 電子郵件 | DiscountRate | OrderID | OrderDate | 產品 | 數量 |
---|---|---|---|---|---|---|---|
1 | 阿什頓 | chris.ashton@contoso.com | .05 | 256 | 2010-01-07 | Compact Digital | 11 |
1 | 阿什頓 | chris.ashton@contoso.com | .05 | 255 | 2010-01-03 | SLR 相機 | 15 |
2 | Jaworski | michal.jaworski@contoso.com | .10 | 254 | 2010-01-03 | 預算 Movie-Maker | 27 |
這種方法可以運作,但它牽涉到儲存大量的備援數據,例如每個訂單的客戶電子郵件位址。 記憶體很便宜,但您必須確定在電子郵件地址變更時,更新該客戶的每一個數據列。 此問題的其中一個解決方案是將數據分割成多個數據表,並定義這些數據表之間的關聯性。 這是 關係資料庫 SQL Server 中使用的方法。 例如,您匯入模型的資料庫可能會使用三個相關數據表來代表訂單數據:
客戶
[CustomerID] | 名字 | 電子郵件 |
---|---|---|
1 | 阿什頓 | chris.ashton@contoso.com |
2 | Jaworski | michal.jaworski@contoso.com |
CustomerDiscounts
[CustomerID] | DiscountRate |
---|---|
1 | .05 |
2 | .10 |
訂單
[CustomerID] | OrderID | OrderDate | 產品 | 數量 |
---|---|---|---|---|
1 | 256 | 2010-01-07 | Compact Digital | 11 |
1 | 255 | 2010-01-03 | SLR 相機 | 15 |
2 | 254 | 2010-01-03 | 預算 Movie-Maker | 27 |
如果您從相同的資料庫匯入這些數據表,Import 可以根據 [方括弧] 中的數據行來偵測數據表之間的關聯性,而且可以在模型設計工具中重現這些關聯性。 如需詳細資訊,請參閱本文中的自動偵測和關聯性推斷一節。 如果您從多個來源匯入數據表,您可以手動建立關聯性,如 建立兩個數據表之間的關聯性中所述。
數據行和索引鍵
關聯性是以包含相同數據的每個數據表中的數據行為基礎。 例如,Customers 和 Orders 數據表可以彼此關聯,因為它們都包含儲存客戶標識碼的數據行。 在此範例中,數據行名稱相同,但這不是必要專案。 一個可能是 CustomerID 和另一個 CustomerNumber,只要 Orders 數據表中的所有數據列都包含也會儲存在 Customers 數據表中的標識符。
在關係資料庫中,有數種類型的 索引鍵,這通常只是具有特殊屬性的數據行。 下列四種類型的索引鍵可用於關係資料庫中:
主鍵:可唯一識別數據表中的數據列,例如 Customers 數據表中的 CustomerID。
替代索引鍵(或 候選密鑰):非唯一主鍵以外的數據行。 例如,Employees 數據表可能會儲存員工標識碼和社會安全號碼,這兩者都是唯一的。
外鍵:參考另一個數據表中唯一數據行的數據行,例如 Orders 數據表中的 CustomerID,該數據表是指 Customers 數據表中的 CustomerID。
複合索引鍵:由多個數據行組成的索引鍵。 表格式模型中不支持複合索引鍵。 如需詳細資訊,請參閱本文中的複合索引鍵和查閱數據行一節。
在表格式模型中,主鍵或替代索引鍵稱為 相關的查閱數據行,或只是 查閱數據行。 如果數據表同時具有主鍵和替代索引鍵,您可以使用任一作為查閱數據行。 外鍵稱為 源資料行,或只是 資料行。 在我們的範例中,會在 Orders 數據表中的 CustomerID 和 Customers 數據表中的 CustomerID(查閱數據行)之間定義關聯性。 如果您從關係資料庫匯入數據,模型設計工具預設會從一個數據表選擇外鍵,並從另一個數據表選擇對應的主鍵。 不過,您可以使用任何具有查閱數據行唯一值的數據行。
關聯性類型
Customers 與 Orders 之間的關聯性是 一對多關係。 每個客戶都可以有多個訂單,但訂單不能有多個客戶。 其他類型的關聯性 一對一,多對多。 CustomerDiscounts 數據表會定義每個客戶的單一折扣率,與 Customers 數據表處於一對一關係中。 「多對多」關聯性的範例是「產品」與「客戶」之間的直接關聯性,其中客戶可以購買許多產品,而同一個產品可由許多客戶購買。 模型設計工具不支援使用者介面中的多對多關聯性。 如需詳細資訊,請參閱本文中的多對多關聯性一節。
下表顯示三個資料表之間的關聯性:
關係 | 類型 | 查閱數據行 | 列 |
---|---|---|---|
Customers-CustomerDiscounts | 一對一 | Customers.CustomerID | CustomerDiscounts.CustomerID |
Customers-Orders | 一對多 | Customers.CustomerID | Orders.CustomerID |
關聯性和效能
建立任何關聯性之後,模型設計工具通常必須重新計算使用新建立關聯性中數據表之數據行的任何公式。 處理可能需要一些時間,視數據量和關聯性的複雜度而定。
關聯性的需求
建立關聯性時,模型設計工具有數個必須遵循的需求:
數據表之間的單一作用中關聯性
多個關聯性可能會導致數據表之間的模棱兩可相依性。 若要建立精確的計算,您需要從一個數據表到下一個數據表的單一路徑。 因此,每個數據表組之間只能有一個作用中的關聯性。 例如,在 AdventureWorks DW 2012 中,數據表 DimDate 包含一個數據行 DateKey,與數據表中三個不同的數據行 FactInternetSales:OrderDate、DueDate 和 ShipDate 相關。 如果您嘗試匯入這些數據表,則會成功建立第一個關聯性,但您會收到下列錯誤,這些關聯性牽涉到相同的數據行:
* 關聯性:table[column 1]-> table[column 2] - 狀態:錯誤 - 原因:數據表 <數據表 1> 和 <數據表 2>之間建立關聯性。 兩個數據表之間只能有一個直接或間接關聯性。
如果您有兩個數據表和兩者之間的多個關聯性,則必須匯入包含查閱數據行之數據表的多個複本,並在每一組數據表之間建立一個關聯性。
數據表之間可能會有許多非作用中關聯性。 數據表之間要使用的路徑是由報表用戶端在查詢時指定。
每個源數據行的一個關聯性
源數據行無法參與多個關聯性。 如果您已經在某個關聯性中使用數據行做為源數據行,但想要使用該數據行連接到不同數據表中的另一個相關查閱數據行,您可以建立數據行的複本,並將該數據行用於新的關聯性。
使用匯出數據行中的 DAX 公式,即可輕鬆地建立具有相同值的數據行複本。 如需詳細資訊,請參閱 建立匯出資料行。
每個數據表的唯一標識碼
每個數據表都必須有單一數據行,可唯一識別該數據表中的每個數據列。 此數據行通常稱為主鍵。
唯一查閱數據行
查閱數據行中的數據值必須是唯一的。 換句話說,數據行不能包含重複專案。 在表格式模型中,Null 和空字串相當於空白,這是相異的數據值。 這表示查閱數據行中不能有多個 Null。
相容的數據類型
源數據行和查閱數據行中的數據類型必須相容。 如需資料類型的詳細資訊,請參閱 支援的數據類型。
複合索引鍵和查閱數據行
您無法在表格式模型中使用複合索引鍵;您一律必須有一個可唯一識別數據表中每個數據列的數據行。 如果您嘗試匯入以複合索引鍵為基礎的現有關聯性的數據表,匯入將會忽略該關聯性,因為它無法在表格式模型中建立。
如果您想要在模型設計工具中建立兩個數據表之間的關聯性,而且有多個數據行定義主鍵和外鍵,您必須先結合這些值來建立單一索引鍵數據行,再建立關聯性。 您可以在匯入數據之前執行此動作,或建立匯出數據行,在模型設計工具中執行此動作。
多對多關聯性
部署至 Azure Analysis Services、SQL Server 2019 和更新版本的 1500 和更高相容性層級的表格式模型,以及 Power BI Premium 支援多對多關聯性。
多對多關聯性是數據表之間的關聯性,其中兩個數據行都是非唯一的。 維度與事實數據表之間可以定義關聯性,其數據粒度高於維度的索引鍵數據行。 這可避免將維度數據表正規化,而且可以改善用戶體驗,因為產生的模型具有較少數目的數據表,且具有邏輯分組的數據行。
使用 Visual Studio 2019 搭配 Analysis Services 專案、表格式物件模型 (TOM) API、表格式模型腳本語言 (TMSL) 和開放原始碼表格式編輯器工具,建立多對多關聯性。
1400 和較低相容性層級的表格式模型不支援多對多關聯性,而且您無法在模型設計工具中 新增
自我聯結和迴圈
表格式模型數據表中不允許自我聯結。 自我聯結是數據表與本身之間的遞歸關聯性。 自我聯結通常用來定義父子式階層。 例如,您可以將 Employees 數據表聯結至本身,以產生顯示企業管理鏈結的階層。
模型設計工具不允許在模型中的關聯性之間建立迴圈。 換句話說,禁止下列一組關聯性。
表格 1, 資料行 a 到表格 2, 資料行 f
表 2, 資料行 f 到表格 3, 資料行 n
表格 3, 資料行 n 到表格 1, 資料行 a
如果您嘗試建立會導致建立迴圈的關聯性,就會產生錯誤。
關聯性的推斷
在某些情況下,數據表之間的關聯性會自動鏈結。 例如,如果您在下方的前兩組數據表之間建立關聯性,則會推斷其他兩個數據表之間有關聯性,而且會自動建立關聯性。
產品和類別 - 手動建立
類別和子類別 - 手動建立
產品和 SubCategory -- 關聯性推斷
為了讓關聯性自動鏈結,關聯性必須以一個方向前進,如上所示。 如果初始關聯性介於 Sales 和 Products 和 Sales and Customers 之間,則不會推斷關聯性。 這是因為 Products 與 Customers 之間的關聯性是多對多關聯性。
匯入數據時偵測關聯性
當您從關係型數據源數據表匯入時,會根據來源架構數據,在數據表之間偵測到現有的關聯性。 如果匯入相關數據表,這些關聯性將會在模型中複寫。
手動建立關聯性
雖然會自動偵測到單一關係型數據源中數據表之間的大部分關聯性,並在表格式模型中建立,但您也必須手動建立模型數據表之間的關聯性。
如果您的模型包含來自多個來源的數據,您可能必須手動建立關聯性。 例如,您可以從關係型數據源匯入 Customers、CustomerDiscounts 和 Orders 數據表。 來源端的數據表之間現有的關聯性會自動在模型中建立。 然後,您可以從不同的來源新增另一個數據表,例如,從 Microsoft Excel 活頁簿中的 Geography 數據表匯入區域數據。 然後,您可以手動建立 Customers 數據表中的數據行與 Geography 數據表中的數據行之間的關聯性。
若要在表格式模型中手動建立關聯性,您可以使用 [圖表檢視] 中的模型設計工具,或使用 [管理關聯性] 對話方塊。 圖表檢視會以圖形化格式顯示數據表,其中具有關聯性。 您可以按下某個數據表中的數據行,並將游標拖曳至另一個數據表,以正確的順序輕鬆地建立數據表之間的關聯性。 [管理關聯性] 對話框會以簡單的數據表格式顯示數據表之間的關聯性。 若要瞭解如何手動建立關聯性,請參閱 建立兩個數據表之間的關聯性。
重複的值和其他錯誤
如果您選擇無法用於關聯性的數據行,則數據行旁邊會出現紅色 X。 您可以暫停錯誤圖示上的游標,以檢視提供問題詳細信息的訊息。 無法建立所選取資料行之間關聯性的問題包括下列各項:
問題或訊息 | 解析度 |
---|---|
無法建立關聯性,因為選取的兩個數據行都包含重複的值。 | 若要建立有效的關聯性,您選取的配對中至少有一個數據行只能包含唯一值。 您可以編輯資料列以移除重複專案,也可以反轉資料行的順序,讓包含唯一值的數據行用來做為 相關查閱資料列。 |
數據行包含 Null 或空白值。 | 數據行無法在 Null 值上彼此聯結。 對於每個數據列,在關聯性中使用的兩個數據行中都必須有一個值。 |
另請參閱
品 | 描述 |
---|---|
建立兩個數據表之間的關聯性 | 描述如何手動建立兩個數據表之間的關聯性。 |
刪除關聯性 | 描述如何刪除關聯性和刪除關聯性的後果。 |
雙向交叉篩選 | 描述相關數據表的雙向交叉篩選。 如果數據表相關且定義雙向交叉篩選,則可以在查詢第二個數據表關聯性時,使用一個數據表關聯性的篩選內容。 |