第四:自制加一
考慮Max加一的效率后,有人采用自制加一,也就是建一個特別的表,字段為:表名,當前序列值。這樣在往表中插入值時,先從此表中找到相應表的最大值后加一,進行插入,有人可能發現,也可能會存在并發處理,這個并發處理,我們可以采用lock線程的方式來避免,在生成此值的時,先Lock,取到值以后,再unLock出來,這樣不會有兩人同時生成了。這比Max加一的速度要快多了。但同樣存在一個問題:在與其他系統集成時,脫離了系統中的生成方法后,很麻煩保證自制表中的最大值與導入后的保持一致,而且數字型都存在上面講到的“o”老數據的導入問題。因此在“自制加一”中可以把主鍵設為字符型的。字符型的自制加一我倒是蠻推薦的,應該字符型主鍵可以應付很多我們意想不到的情況。
第五:GUID主鍵
目前一個比較好的主鍵是采用GUID,當然我是推薦主鍵還是字符型的,但值由GUID生成,GUID是可以自動生成,也可以程序生成,而且鍵值不可能重復,可以解決系統集成問題,幾個系統的GUID值導到一起時,也不會發生重復,就算有“o”老數據也可以區分,而且效率很高,在.NET里可以直接使用System.Guid.NewGuid()進行生成,在SQL里也可以使用 NewID()生成。優點是:
同 IDENTITY 列相比,uniqueidentifier 列可以通過 NewID() 函數提前得知新增加的行 ID,為應用程序的后續處理提供了很大方便。
便于數據庫移植,其它數據庫中并不一定具有 IDENTITY 列,而 Guid 列可以作為字符型列轉換到其它數據庫中,同時將應用程序中產生的 GUID 值存入數據庫,它不會對原有數據帶來影響。
便于數據庫初始化,如果應用程序要加載一些初始數據, IDENTITY 列的處理方式就比較麻煩,而 uniqueidentifier 列則無需任何處理,直接用 T-SQL 加載即可。
便于對某些對象或常量進行永久標識,如類的 ClassID,對象的實例標識,UDDI 中的聯系人、服務接口、tModel標識定義等。
缺點是:
GUID 值較長,不容易記憶和輸入,而且這個值是隨機、無順序的
GUID 的值有 16 個字節,與其它那些諸如 4 字節的整數相比要相對大一些。這意味著如果在數據庫中使用 uniqueidentifier 鍵,可能會帶來兩方面的消極影響:存儲空間增大;索引時間較慢。
文章來源于領測軟件測試網 http://www.kjueaiud.com/