代理鍵是指在關係型資料庫設計中,當資料表中的候選鍵都不適合當主鍵時,例如資料太長,或是意義層面太多,就會用一個attribute來當代理主鍵,此主鍵可能是用流水號,來代替可辨識唯一值的主鍵。
在數據倉庫領域有一個概念叫Surrogate key,中文一般翻譯為“代理關鍵字”。代理關鍵字一般是指維度表中使用順序分配的整數值作為主鍵,也稱為“代理鍵”。代理關鍵字用於維度表和事實表的連線。
代理關鍵字的稱呼有surrogate keys,meaningless keys,integer keys,nonnatural keys,artificial keys,synthetic keys等。與之相對的自然關鍵字的稱呼有natural keys,smart keys等。
在Kimball的維度建模領域裡,是強烈推薦使用代理關鍵字的。在維度表和事實表的每一個聯接中都應該使用代理關鍵字,而不應該使用自然關鍵字或者智慧型關鍵字(Smart Keys)。數據倉庫中的主鍵不應該是智慧型的,也就是說,要避免通過主鍵的值就可以了解一些業務信息。當然,退化維度作為事實表的複合主鍵之一時例外。
使用代理關鍵字,有很多優點。
1.使用代理關鍵字能夠使數據倉庫環境對操作型環境的變化進行緩衝。也就是說,當數據倉庫需要對來自多個操作型系統的數據進行整合時,這些系統中的數據有可能缺乏一致的關鍵字編碼,即有可能出現重複,這時代理關鍵字可以解決這個問題。
2.使用代理關鍵字可以帶來性能上的優勢。和自然關鍵字相比,代理關鍵字很小,是整型的,可以減小事實表中記錄的長度。這樣,同樣的IO就可以讀取更多的事實表記錄。另外,整型欄位作為外鍵聯接的效率也很高。
3.使用代理關鍵字可以建立一些不存在的維度記錄,例如“不在促銷之列”,“日期待定”,“日期不可用”等維度記錄。
4.使用代理關鍵字可以用來處理緩慢變化維。維度表數據的歷史變化信息的保存是數據倉庫設計的實施中非常重要的一部分。Kimball的緩慢變化維處理策略的核心就是使用代理關鍵字。
當然,使用代理關鍵字也有它的缺點,代理關鍵字的使用使數據載入變得非常複雜。有關使用代理關鍵字的維度表和事實表的載入方法在ETL Toolkit中有詳細的描述。使用代理關鍵字是一個從長遠考慮的策略。
代理鍵的實踐套用
代理鍵通常是序列數字(例如Sybase 和SQL Server中的"identity column", PostgreSQL 或Informix中的serial, Oracle 或SQL Server中的SEQUENCE ,又或者是MySQL中AUTO_INCREMENT定義的列。)
生成代理鍵值有以下途徑
- Universally Unique Identifiers(UUIDs)
- Globally Unique Identifiers(GUIDs)
- Object Identifiers(OIDs)
- OracleSEQUENCE, orGENERATED AS IDENTITY(自 version 12.1開始)
- SQL ServerSEQUENCE(自SQL Server 2012開始)
- PostgreSQLorIBM Informixserial
- MySQLAUTO_INCREMENT
- SQLiteAUTOINCREMENT
- Microsoft Access中的AutoNumber 數據類型
- AS IDENTITY GENERATED BY DEFAULTinIBM DB2
- Table Sequence 當序列(Sequence)由程式(procedure)和包含某些欄位的sequence表計算得出。這些欄位例如:id, sequenceName, sequenceValue 和 incrementValue