2016-07-21 106 views
0

我在閱讀關於DW建模的知識,並開始想知道爲什麼使用代理鍵?爲什麼需要代理鍵?

據我所知,有時候商業密鑰並不是整數,這使生活(以及尋找和索引)變得更困難。 但是,我不明白爲什麼要通過添加和額外的列來管理唯一標識符來解決DW或RDBMS的有限侷限性?

這種功能對於DW/RDBMS用戶來說是否透明並且該條目會自動從系統獲取內部標識符會更合適嗎?例如,創建整行或其子集(可以某種文本格式表示的那些字段)的SHA-1摘要。

+0

代理鍵通常是自動遞增的整數,長度爲32位。由於您必須在適用的情況下將行標識符作爲外鍵複製,因此通常會在複製長字符串或多列時節省大量空間。 – apokryfos

+0

瞭解。我沒有得到的是爲什麼DW用戶不得不擔心這個問題,爲什麼它不是DW或RDBMS軟件的集成功能? – aviad

+0

我的猜測是RDBMS不希望在沒有必要的情況下強加替代鍵所佔用的額外空間。 RDBMS提供的是DB開發人員在需要時定義此類密鑰的機制。 – apokryfos

回答

1

使用代理鍵的原因是因爲您可以控制數據倉庫,但很有可能無法控制源系統。您今天對自然鍵的穩定性的假設可能會在未來導致您的問題。你可能會碰到

問題通過不使用自己的代理鍵:

  1. 大型或複雜的天然關鍵 - 正如你已經提到的,源系統可以使用自然鍵,不會執行以及一個簡單的整數
  2. 自然鍵可以在源碼中重複使用 - 我遇到了一個問題,一旦源系統從1開始回收密鑰,一旦達到最大整數值就可以了(對於這是有道理的)。數據倉庫必須認識到重複密鑰是全新的記錄。
  3. 合併 - 想象兩家公司合併在一起。每個公司都有一個Employee表,其中有一個用作鍵的自動遞增整數。每家公司都會有一名員工#1。 DW倉庫需要代理鍵來區分共享相同ID的兩個人。
+0

好點!然而,您所有的觀點都與我(部分)提到的有關:不要假設源系統中使用的密鑰,並在DB SW級別維護唯一標識符。難道這不是正確的方式來處理這個問題,而是在每一次瀆職時間重新發明輪子? – aviad

+0

是的,不要假定源系統中的密鑰,並且在數據庫級別維護唯一標識符,最有可能使用自動遞增整數字段。我不確定你的意思是「每一次重新發明輪子」。 – Cory

+0

重新發明輪子=讓DB用戶將唯一ID實施到記錄中,而不是在DB軟件中將其標準化。 – aviad