The Will Will Web | 深入瞭解 GUID 與為什麼要用 GUID

The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

深入瞭解 GUID 與為什麼要用 GUID

最近看了一篇文章 The Gospel of the GUID 覺得很有價值,作者主要是講在用 SQL Server 時,他建議所有表格的 Primary Key 都用uniqueindentifier (GUID) 欄位格式,也看了好幾篇相關的文章,對 GUID 的掌握又更完整了。

文章的摘要如下:

為什麼要使用GUID的四大理由:

1. I can make less trips to the database, now THAT is a performance enhancement!

   你可以直接在Application中直接產生GUID,不用進資料庫執行 NEWID() 函數

2. Data Merging is so easy, Mac using developers can do it!

   在不同的應用程式之間產生的資料或兩台資料庫之間,很容易就可以合併資料到同一個表格。

3. Type/Table Ignorance

   要做資料稽核的紀錄,或各個表格資料加上一個Note欄位等應用,都很適合用GUID處理,但別想讓這個表格去查Parent Row這件事,很沒意義!

4. The hits just keep on coming!

   很容易區���哪些是「測試機上的資料」或「正式機上面的資料」,直接拿測試機的GUID去刪除正式機上相同的GUID即可!

兩個使用 GUID 的缺點:

1.  比較難自己手動下SQL取得資料

   SELECT * FROM ORDER WHERE ORDERID = 12

   比以下這個 SQL 好下多了:

   SELECT * FROM ORDER WHERE ORDERGUID = ‘{45F57B42-38A4-46ce-A180-6DE0E7051178}'

2. 在效能上,用 GUID 一定比用 INT 欄位格式慢,但只有慢一點點而已,幾乎沒理由不用!

一些閱讀後的心得整理:

1. 如果要處理大量INSERT動作的應用,GUID欄位不適合用Clustered Index做索引!因為GUID是亂數,會導致每次INSERT都要重算索引要被插入的位址。

2. 當 uniqueindentifier (GUID) 的資料表用久了可能會造成資料庫碎片的情況,會浪費一些空間,但這可以透過設定 Fill factor 或在做資料庫維護的時候解決。

3. 為什麼不用 SQL 2005 提供的 NewSequentialID() 函數?因為某些原因所以不用。

4. 類似 Notes 或 Audit 表格儲存所有表格的相關連資料,將無法建立referential integrity (參考完整性) ,即 Foreign Key,不過應該沒關係,因為大多時候資料並不會真正被刪除。

5. 資料庫表格中的 Primary Key 永遠都不要設定成「客戶看的懂得編號」,如果真要讓客戶識別資料,請特別另外留一個欄位給客戶輸入,並設定 UNIQUE Key 保持唯一性。

6. 使用 GUID 將使程式碼易於維護,我們已經處理過太多使用 int 時遇到的問題,例如說:LastInsertedID。

相關連結:

The Gospel of the GUID
http://weblogs.asp.net/wwright/archive/2007/11/04/the-gospel-of-the-guid-and-why-it-matters.aspx

Gospel of the GUID - Answers to your Burning Questions, Comments and Insults
http://weblogs.asp.net/wwright/archive/2007/11/11/gospel-of-the-guid-answers-to-your-burning-questions-comments-and-insults.aspx

Guid Primary Keys are Revolutionised in SQL Server 2005
http://www.styledesign.biz/weblogs/macinnesm/archive/2004/09/14.aspx

NEWSEQUENTIALID()
http://technet.microsoft.com/en-us/library/ms189786.aspx

The Cost of GUIDs as Primary Keys
http://www.informit.com/articles/article.aspx?p=25862&seqNum=1