一般情況下,一張數據表必須要有一個主鍵字段,這樣這個主鍵字段就可以唯一標識這條記錄了。不過采用什么樣的字段來做為主鍵字段還是一個必須解決的問題,目前有兩種常用的主鍵策略:業務主鍵與邏輯主鍵。
業務主鍵是指采用業務數據中的某個字段做為主鍵,比如在員工檔案表中可以用工號來做為主鍵、在車輛管理系統中可以用車牌號做為主鍵字段。邏輯主鍵,也稱代理主鍵,是指不采用任何業務數據做為主鍵,而是采用一個沒有業務意義的不重復值做主鍵,比如在員工檔案表中用一個自動增長的字段來做為主鍵,這個字段沒有任何的業務意義。
使用業務主鍵是比較簡單的,但是會存在潛在的問題,一個是業務主鍵並不能真正的保證唯一性,第二個是做為主鍵的數據一旦發生變化就會帶來維護的問題。假設在社區人員信息表中使用身份證號碼做為主鍵,由於我國身份證編號制度還存在一定缺陷,所以存在不少的身份證號碼重復現象,這樣一旦社區中有兩個同樣身份證號的人員出現,系統將會出現問題;即使能夠杜絕身份證號碼重復現象,也會存在升級的問題,比如今后出現身份證號碼位數升級的問題,那么由於很多表都是通過身份證號碼這個主鍵字段來關聯社區人員信息表的,那么不僅要升級社區人員信息表,還要將這些關聯表進行升級。因此建議盡量不要用業務字段做主鍵,而是使用沒有業務意義主鍵。
使用業務主鍵可以保證主鍵值的唯一性,並且在業務發生變化時,適應性更強一些。不過使用代理主鍵也有劣勢,那就是主鍵字段由於沒有任何業務意義,所以在使用的時候比較麻煩。不過總的來與業務主鍵比起來,邏輯主鍵更有優勢,因此除非有特別的理由,否則使用邏輯主鍵是一個好的習慣。
如果決定采用邏輯主鍵的話,使用什么樣的主鍵生成策略則是必須考慮的。常用的主鍵生成策略有:自動增長字段和UUID。使用自動增長字段就是每次向表中插入記錄的時候DBMS 自動為主鍵設定一個自動增長的值;使用UUID 則是為主鍵字段設置一個UUID 類型的值,這個UUID 值采用UUID 算法來生成,這樣可以保證生成的值是絕對唯一的。
使用自動增長字段的優勢在於速度比較快,根據統計UUID算法要比自動增長字段的生成速度慢約30倍;使用自動增長字段的劣勢在於進行表合並的時候會存在沖突的問題,比如A表和B表的結構完全相同,而且它們都采用自動增長字段來生成主鍵,如果想將A表和B表合並為一張表的話那么就有可能由於A表中的記錄的主鍵值和B表中的記錄的主鍵值沖突而造成合並失敗,而使用UUID 算法則不會有這個問題,因為UUID 算法能夠保證兩個UUID 值是唯一的。
