2017-02-11 94 views
0

在數據倉庫中鍵入FACT表時,最好使用外部表中的主鍵還是業務使用的唯一鍵或標識符?例如(見下圖),假設您有兩個維度表「DimStores」和「DimCustomers」以及一個名爲「FactSales」的FACT表。這兩個維度表都有一個索引主鍵字段,它是一個整數數據類型並被命名爲「ID」。他們還有一個索引唯一的業務密鑰字段,它是一個名爲「Number」的字母數字文本數據類型。關鍵數據倉庫事實表的正確方法

通常,您將使用維度表的主鍵作爲FACT表中的外鍵。但是,我想知道這是否是最好的方法。

通過使用主鍵,爲了查找或對FACT表中的事實進行計算,您可能必須始終對主鍵執行聯接查詢並將該業務鍵用作查找。原因是因爲大多數用戶不知道在FACT表中進行查找的主鍵值。但是,他們可能會知道業務關鍵。因此,要使用該商業密鑰,您必須執行聯合查詢來建立關係。

由於無論如何都會對業務鍵進行索引,只是將它用作FACT表中的外鍵會更好嗎?這樣你就不必進行連接,只需直接進行查找或計算?

我想它歸結爲聯接查詢是否昂貴?想象一下,你正在處理數十億條記錄的FACT表格和維度。

示例表:

DimStores: 
+------------+-------------+-------------+ 
| StoreId | StoreNumber | StoreName | 
+------------+-------------+-------------+ 
| 1   | S001  | Los Angeles | 
| 2   | S002  | New York | 
+------------+-------------+-------------+ 

DimCustomers: 
+------------+----------------+--------------+ 
| CustomerId | CustomerNumber | CustomerName | 
+------------+----------------+--------------+ 
| 1   | S001   | Michael  | 
| 2   | S002   | Kareem  | 
| 3   | S003   | Larry  | 
| 4   | S004   | Erving  | 
+------------+----------------+--------------+ 

FactSales: 
+---------+------------+------------+ 
| StoreId | CustomerId | SaleAmount | 
+---------+------------+------------+ 
| 1  | 1   |  $400 | 
| 1  | 2   |  $300 | 
| 2  | 3   |  $200 | 
| 2  | 4   |  $100 | 
+---------+------------+------------+ 

在上面得到了洛杉磯店的總銷售額我不得不這樣做:

Select Sum(SaleAmount) 
From FactSales FT 
Inner Join DimStores D1 ON FT.StoreId = D1.StoreId 
Where D1.StoreNumber = 'S001' 

假如我用了「StoreNumber」和「CustomerNumber」字段代替「FactSales」表中的外鍵。我不需要做一個加入查詢,而是可以直接完成此操作:

Select Sum(SaleAmount) 
From FactSales 
Where StoreNumber = 'S001' 

回答

1

您使用人造主鍵的原因是將數據倉庫與業務決策隔離開來。

您的業務增長。現在你有超過1000家商店。商店的鑰匙改變。你如何處理這個問題?

如果存儲密鑰散佈在整個數據倉庫中,這是一個痛苦的操作。如果商店密鑰只是維度表上的一個屬性,那麼這很容易。

我還應該注意到,在很多情況下,尺寸可能是2型尺寸 - 這意味着它們隨時間而變化。例如,顧客可以改變他們的名字,但是你可能想知道他們的名字在特定的時間點。

第三個原因。人造主鍵通常是整數。這些比字符串更好(尤其是長度可變的字符串)。性能的差異很小,但這是使用主鍵的原因。事實上,如果鍵是字符串並且比整數長,那麼在空間方面使用人造鍵可能會更有效。

+0

感謝您的回覆。是的,我明白我們爲什麼使用整數主鍵。但是,我只是想知道這樣做是否會有性能差異。或者,如果我們因爲(缺乏更好的單詞)數據管理原因而放棄了性能。我知道這很重要。再一次,我試圖縮小性能,以便衡量整體的優缺點。 – ptownbro

+0

如果您使用的是Oracle,那麼您可能用於主鍵的不同數據類型之間的性能差別很小。我會遇到的一個例外是我會建議在你的時間維度中使用DATA數據時間(如果有的話)。獲得正確的執行計劃更重要。 – BobC

+0

謝謝。我感謝您的幫助 – ptownbro