在數據倉庫中鍵入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'
感謝您的回覆。是的,我明白我們爲什麼使用整數主鍵。但是,我只是想知道這樣做是否會有性能差異。或者,如果我們因爲(缺乏更好的單詞)數據管理原因而放棄了性能。我知道這很重要。再一次,我試圖縮小性能,以便衡量整體的優缺點。 – ptownbro
如果您使用的是Oracle,那麼您可能用於主鍵的不同數據類型之間的性能差別很小。我會遇到的一個例外是我會建議在你的時間維度中使用DATA數據時間(如果有的話)。獲得正確的執行計劃更重要。 – BobC
謝謝。我感謝您的幫助 – ptownbro