關聯性概觀
此主題為您簡介可在 PowerPivot for Excel 的資料表之間定義的關聯性。 此主題包含下列各節:
何謂關聯性
關聯性的需求
關聯性的自動偵測和推斷
在閱讀過此主題之後,您應該能了解何謂關聯性、定義關聯性的需求,以及 PowerPivot for Excel 如何能為您自動偵測關聯性。 在此過程中,您也將得知資料庫專業人員用來描述關聯性的術語。
何謂關聯性
關聯性是在兩個資料表之間,以每個資料表中的一個或多個資料行為基礎的連接 (在 PowerPivot 中為每個資料表各一個資料行)。 若要了解為什麼關聯性是有用的,請假設您在追蹤自己商務中的客戶訂單資料。 您可以在具有類似下列結構的單一資料表中追蹤所有資料:
CustomerID |
名稱 |
DiscountRate |
OrderID |
OrderDate |
Product |
Quantity |
|
---|---|---|---|---|---|---|---|
1 |
Ashton |
chris.ashton@contoso.com |
.05 |
256 |
2010-01-07 |
Compact Digital |
11 |
1 |
Ashton |
chris.ashton@contoso.com |
.05 |
255 |
2010-01-03 |
SLR Camera |
15 |
2 |
Jaworski |
michal.jaworski@contoso.com |
.10 |
254 |
2010-01-03 |
Budget Movie-Maker |
27 |
這種方法可能有效,但牽涉到儲存太多重複的資料,例如每筆訂單的客戶電子郵件地址。 儲存雖然廉價,但是如果電子郵件地址變更,您就需要確定更新該客戶的每個資料列。 此問題的一種解決方案,就是將資料分為多個資料表,並且定義這些資料表之間的關聯性。 這正是在 SQL Server 這類「關聯式資料庫」(Relational Databases) 中使用的方法。 例如,您匯入至 PowerPivot for Excel 的資料庫可能會使用三個相關的資料表來表示訂單資料。
Customers
[CustomerID] |
名稱 |
|
---|---|---|
1 |
Ashton |
chris.ashton@contoso.com |
2 |
Jaworski |
michal.jaworski@contoso.com |
CustomerDiscounts
[CustomerID] |
DiscountRate |
---|---|
1 |
.05 |
2 |
.10 |
Orders
[CustomerID] |
OrderID |
OrderDate |
Product |
Quantity |
---|---|---|---|---|
1 |
256 |
2010-01-07 |
Compact Digital |
11 |
1 |
255 |
2010-01-03 |
SLR Camera |
15 |
2 |
254 |
2010-01-03 |
Budget Movie-Maker |
27 |
如果從相同資料庫匯入這些資料表,PowerPivot 即可根據 [方括弧] 的資料行來偵測資料表之間的關聯性,而且可以在 PowerPivot 視窗中重現這些關聯性。 如需詳細資訊,請參閱本主題中的<關聯性的自動偵測和推斷>。 如果從多個來源匯入資料表,則可依照<建立兩個資料表之間的關聯性>中的描述手動建立關聯性。
資料行與索引鍵
關聯性是以包含相同資料的每個資料表中的資料行為基礎。 例如,Customers 和 Orders 資料表可以彼此相關,因為兩者都包含儲存客戶 ID 的資料行。 在此範例中,資料行名稱相同,但這點並不是需求。 一個資料行可以是 CustomerID,另一個資料行則可是 CustomerNumber,只要 Orders 資料表中所有包含 ID 的資料列也都有儲存在 Customers 資料表中即可。
在關聯式資料庫中,有幾種類型的「索引鍵」(Key),這些通常只是具有特殊屬性的資料行。 下列四種類型的索引鍵對於達成我們的目標最有用處:
「主索引鍵」(Primary key):可以唯一識別資料表中的資料列,例如 Customers 資料表中的 CustomerID。
「替代索引鍵」(Alternate key),又稱「候選索引鍵」(Candidate Key):不同於主索引鍵的唯一資料行。 例如,Employees 資料表可能儲存員工 ID 和社會保險號碼,兩者都是唯一的。
「外部索引鍵」(Foreign Key):參考另一個資料表中唯一資料行的資料行,例如 Orders 資料表中的 CustomerID,該資料表會參考 Customers 資料表中的 CustomerID。
「複合索引鍵」(Composite Key):由一個以上資料行所組成的索引鍵。 PowerPivot for Excel 不支援複合索引鍵。 如需詳細資訊,請參閱本主題中的<複合索引鍵與查閱資料行>。
在 PowerPivot for Excel 中,主索引鍵或替代索引鍵稱為「相關查閱資料行」(Related Lookup Column),或簡稱「查閱資料行」(Lookup Column)。 如果資料表同時有主索引鍵和替代索引鍵,您可以將其中一個當做查閱資料行使用。外部索引鍵就是「來源資料行」(Source Column) 或只是「資料行」(Column)。在我們的範例中,關聯性是在 Orders 資料表中的 CustomerID (資料行) 和 Customers 資料表中的 CustomerID (查閱資料行) 間定義。 如果從關聯式資料庫匯入資料,PowerPivot for Excel 就會依預設從一個資料表選擇外部索引鍵,並從另一個資料表選擇對應的主索引鍵。但是,您可以使用具有唯一值的任何資料行做為查閱資料行。
關聯性的類型
Customers 和 Orders 之間的關聯性是「一對多關聯性」(One-to-Many Relationship)。 每個客戶可以有許多張訂單,但是每張訂單不能有多個客戶。 其他類型的關聯性則是「一對一」(One-to-One) 和「多對多」(Many-to-Many)。 定義每個客戶之單一折扣率的 CustomerDiscounts 資料表,與 Customers 資料表之間就具有一對一的關聯性。 Products 與 Customers 之間的直接關聯性就是多對多關聯性的範例,其中客戶可以購買許多產品,而且相同的產品可以由許多客戶購買。 PowerPivot for Excel 在使用者介面中不支援多對多關聯性。如需詳細資訊,請參閱本主題中的「多對多關聯性」。
下表顯示三個資料表之間的關聯性:
關聯性 |
型別 |
查閱資料行 |
資料行 |
---|---|---|---|
Customers-CustomerDiscounts |
一對一 |
Customers.CustomerID |
CustomerDiscounts.CustomerID |
Customers-Orders |
一對多 |
Customers.CustomerID |
Orders.CustomerID |
關聯性與效能
建立任何關聯性之後,PowerPivot for Excel 通常都必須重新計算使用新建立關聯性中資料表之資料行的任何公式。 視資料量與關聯性的複雜度而定,可能需要一些時間進行處理。 如需詳細資訊,請參閱<重新計算公式>。
關聯性的需求
建立關聯性時,PowerPivot for Excel 具有多項必須遵循的需求:
資料表之間的單一關聯性
多個關聯性可能會在資料表之間造成模稜兩可的相依性。 若要建立精確的計算,您需要從一個資料表到下一個資料表的單一路徑。 因此,每一對資料表之間只能有一個關聯性。 例如,在 AdventureWorksDW2012 中,資料表 DimDate 包含一個資料行 DateKey,這個資料行與資料表 FactInternetSales 中的三個不同資料行相關:OrderDate、DueDate 與 ShipDate。 如果您嘗試匯入這些資料表,會成功建立第一個關聯性,但是對於包含相同資料行的後續關聯性,則會收到下列錯誤:
* 關聯性: table[column 1]-> table[column 2] - 狀態: 錯誤 - 原因: 無法建立資料表 <資料表 1> 和 <資料表 2> 之間的關聯性。 兩個資料表之間只能有一個直接或間接關聯性。
如果您有兩個資料表,而且在這兩個資料表之間有多個關聯性,則您需要匯入包含查閱資料行之資料表的多個複本,然後在每對資料表之間建立一個關聯性。
每個來源資料行一個關聯性
來源資料行無法參與多個關聯性。 如果您已經使用一個資料行做為某個關聯性中的來源資料行,但是想要使用該資料行連接至不同資料表中的其他相關查閱資料行,您可以建立資料行的複本,然後將該資料行用於新的關聯性。
建立具有完全相同之值的資料行複本相當容易,只要在導出資料行中使用 DAX 公式即可。 如需詳細資訊,請參閱<導出資料行>。
每個資料表的唯一識別碼
每個資料表都必須具有能夠唯一識別該資料表中每個資料列的單一資料行。 此資料行通常稱為主索引鍵。
唯一查閱資料行
查閱資料行中的資料值必須是唯一的。 換句話說,資料行不能包含重複的值。 在 PowerPivot for Excel 中,Null 和空白字串相當於空白,是不同的資料值。 這表示您無法在查閱資料行中有多個 Null 值。
相容的資料類型
來源資料行和查閱資料行中的資料類型都必須相容。 如需資料類型的詳細資訊,請參閱<PowerPivot 活頁簿中支援的資料類型>。
複合索引鍵和查閱資料行
您無法在 PowerPivot 活頁簿中使用複合索引鍵。您必須一定擁有剛好一個可唯一識別資料表中每個資料列的資料行。 如果您嘗試匯入擁有以複合索引鍵為基礎之現有關聯性的資料表,[資料表匯入精靈] 將會忽略該關聯性,因為它無法在 PowerPivot 中建立。
如果您要在 PowerPivot 中於兩個資料表之間建立關聯性,而且有多個資料行定義主索引鍵與外部索引鍵,您就必須在建立關聯性之前先合併這些值,以建立單一的索引鍵資料行。 您可以在匯入資料之前執行這項作業,也可以在 PowerPivot 中透過建立導出資料行來執行。
多對多關聯性
PowerPivot for Excel 不支援多對多關聯性,而且您無法直接在 PowerPivot 中加入「聯合資料表」(Junction Table)。 不過,您可以使用 DAX 函數來塑造多對多關聯性。
自我聯結與迴圈
在 PowerPivot 資料表中不允許使用自我聯結。 自我聯結是資料表和本身之間的遞迴關聯性。 自我聯結通常用來定義父子式階層。 例如,您可以將 Employees 資料表聯結到其本身,以產生會顯示商務中管理鏈結的階層。
PowerPivot for Excel 不允許在活頁簿中於關聯性之間建立迴圈。 換句話說,系統禁止下列這組關聯性。
資料表 1 的資料行 a - 資料表 2 的資料行 f
資料表 2 的資料行 f - 資料表 3 的資料行 n
資料表 3 的資料行 n - 資料表 1 的資料行 a
如果您嘗試建立的關聯性會建立迴圈,則會產生錯誤。
關聯性的自動偵測和推斷
將資料匯入 PowerPivot 視窗時,[資料表匯入精靈] 會自動偵測資料表之間的任何現有關聯性。 而且,當您建立樞紐分析表時,PowerPivot for Excel 也會分析資料表中的資料。 它會偵測尚未定義的可能關聯性,而且會建議用來包含這些關聯性的適當資料行。
偵測演算法會使用資料行之值和中繼資料的相關統計資料,來推斷關聯性的機率。
所有相關資料行中的資料類型都必須相容。 自動偵測只支援整數和文字資料類型。 如需資料類型的詳細資訊,請參閱<PowerPivot 活頁簿中支援的資料類型>。
為了順利偵測關聯性,查閱資料行中的唯一索引鍵數目必須大於多邊資料表的值。 換言之,位於關聯性多邊的索引鍵資料行不得包含不在查閱資料表之索引鍵資料行中的任何值。 例如,假設您有一份列出產品與其識別碼的資料表 (查閱資料表) 以及一份列出每項產品銷售量的銷售量資料表 (關聯性的多邊)。 如果您的銷售記錄包含某項產品的識別碼,但是該項產品在 Products 資料表中沒有對應的識別碼,則系統將無法自動建立關聯性,但是您可能可以手動建立關聯性。 若要讓 PowerPivot for Excel 偵測關聯性,您必須先使用遺漏產品的識別碼來更新 Product 查閱資料表。
請確定位於多邊之索引鍵資料行的名稱與查閱資料表中之索引鍵資料行的名稱很相似。 這些名稱不需要完全相同。 例如,在商務設定中,您經常會有不同的資料行名稱變化,但基本上包含相同的資料:如 Emp ID、EmployeeID、Employee ID、EMP_ID 等等。 演算法會偵測到相似的名稱,然後指派較高機率給具有類似或完全相符名稱的資料行。 因此,若要提高建立關聯性的機率,您可以嘗試重新命名所匯入的資料行,使其名稱類似現有資料表中的資料行。 如果 PowerPivot for Excel 找到多個可能的關聯性,它就不會建立關聯性。
這項資訊可以幫助您了解為何偵測不到所有關聯性,或是中繼資料 (例如欄位名稱和資料類型) 的變更如何改進自動關聯性偵測的結果。 如需詳細資訊,請參閱<關聯性疑難排解>和 PowerPivot 自動關聯性偵測的幕後資訊。
命名集的自動偵測
系統不會自動偵測命名集與樞紐分析表內相關欄位之間的關聯性。 您可以手動建立這些關聯性。 如果您要使用自動關聯性偵測,請移除每個命名集,然後將個別的欄位從命名集直接加入至樞紐分析表中。
推斷關聯性
在某些情況下,資料表之間的關聯性會自動鏈結。 例如,如果您在以下前兩組資料表之間建立關聯性,就會推斷另外兩個資料表之間也有關聯性,然後自動建立關聯性。
Products 和 Category – 手動建立
Category 和 SubCategory – 手動建立
Products 和 SubCategory -- 推斷出關聯性
為了讓關聯性能夠自動鏈結,如上所示,關聯性都必走向同一個方向。 例如,如果初始關聯性是在 Sales 和 Products,以及 Sales 和 Customers 之間,就不會推斷出關聯性。 這是因為 Products 和 Customers 之間的關聯性是多對多關聯性。