關於使用GUID和Identity做主鍵的一些思考

2022-01-31 19:03:21 字數 1316 閱讀 9293

通常,給資料庫中的表都新增乙個「無意義」的主鍵,能夠大大地簡化程式的開發。這個主鍵用什麼型別呢?其實各種型別,只要大小不超過900位元組都可以,但我們最常面臨的兩種選擇是——guid(uniqueidentifity)和identity int。

《ado.net 2.0高階程式設計》一書的「5.2.2 選擇主鍵」一節,對此進行了一些對比,並推薦使用guid型別作為主鍵的型別。但本文中老劉將介紹自己在實際開發中的一些感觸。

老劉在公司寫程式時,面對的資料庫絕大多數都是用identity做主鍵;而回家自己寫程式玩的時候,因為迷信《ado.net 2.0高階程式設計》,所以設計的資料庫都採用guid做主鍵型別。所以,對這兩種主鍵型別都有些想法。

guid優於identify的方面

首先,對於guid型別的主鍵,通常在建立新的資料條目時可以採用guid.newguid()方法為其生成主鍵;而對於identify型別的主鍵,只有當資料條目被真正插入資料庫後才能得到其主鍵值。當需要在同乙個事務中,向多個相關表中插入資料時,若採用guid主鍵,就能使用一次提交動作插入所有資料;而如果使用identify型別做主鍵,就必須先插入主鍵列所在表的資料,再插入外來鍵列所在表的資料。如下面兩段**所示。

//使用guid作為主鍵型別

using

(mydatacontext db 

=new

mydatacontext())

;article a 

=new

article

;db.categories.insertonsubmit(c);

db.articles.insertonsubmit(a);

db.submitchanges();    

//一次提交,如果出現錯誤自動全部回滾

}//使用identity作為主鍵型別

using

(mydatacontext db 

=new

mydatacontext())

;db.categories.insertonsubmit(c);

db.submitchanges();    

//提交後才能得到確定的id值

article a 

=new

article

;db.articles.insertonsubmit(a);

db.submitchanges(a);    

//第二個提交,如果出錯,分類c也會留在資料庫中

}正如注釋中所述,當發生錯誤時,一次提交可以簡單乾淨地回滾;但多次提交,就得採取一些手段了。

identify優於guid的方面

在Oracle中使用Guid

在oracle中可以用sys guid 來生成乙個guid,相當於mssql中的newid 在oracle9i和oracle 10g 裡sys guid產生得到的資料是32 位的,如 234e45f0077881aae0430aa3034681aa 但oracle中的guid與mssql中的guid...

guID 和序列使用 以差旅報銷申請為例

action 表示式操作 執行內容中 setreqattr att id guid 將att id中存入guid 隨機編碼,這是字元型別 1.系統資源管理 常用資源管理 序列資源管理 新增乙個序列 序列是整數型別 2.action 表示式操作 執行內容中 setreqattr peo id seqv...

使用Guid做主鍵和int做主鍵效能比較

摘自 1.在經常需要做資料遷移的系統中,建議用guid。並且在相應的外來鍵字段,也就是用來做連線查詢的字段新增非聚集索引,對於改善效能有極大的好處。where條件的字段也可以適當新增非聚集索引。2.在使用guid型別作為主鍵時,資料型別應為uniqueidentifier,並且一定要記得取消主鍵的 ...