2017年5月18日 星期四

【DB】Serial number(int) or UUID(GUID) as primary key?

應該使用整數流水號(int)或 GUID 做主鍵?
※GUID 是 M$ 的 UUID 規格

先講我查完的結論,預期資料增長有限或在1-N中屬於1方的適合整數流水號;而預期有大量增長且可能具分散、整合需求或在1-N中屬於N方,適合用 GUID。
用 GUID 做主鍵要去改 PK 為非叢集索引,再放一個流水號做叢集索引以避免 GUID 沒有連續性造成 索引破碎(暗黑執行緒)、 SO 問題影響校能。

用 GUID 做主鍵的優點
1. 擴充性好,易於分散與整合,比方
Id Name
1 Andy
2 Bill
3 Cathy
Id Name
1 Amy
2 Bobby
3 Caroline
Id Name
5c1ryuj5-78f6-4bd6-83fc-ab4c4708cf4d Andy
cd6f3f3f-434c-4ea0-9151-69b745311aa7 Bill
sdx3di1a-fb1d-4205-8d01-474d2qk31lf7 Cathy
Id Name
bbe114d5-4076-4e9a-b939-7d4bf9cb03e5 Amy
8bdabb53-f27c-467a-8498-719fad04da7e Bobby
20daed84-a6f7-4a52-997b-b68ce883754c Caroline
明顯得會是後者容易整合的多。

2. Key 的產生不限定於資料庫裡,要是是流水號一定是要靠自動增值產生,GUID 你基本在哪邊都可以做,一次做多筆再匯入也行。

3. 安全性比較好,比方 Restful 下
http://www.company.com/123/something.pdf
就提供了應有 123 筆資料的情報,跟試 122、124 看看能不能看到別的文件機會。

用 GUID 的缺點
主要就是成本問題,儲存、查詢比較、傳輸的成本都高。

所以,一切端看設計上的預期,如果可以流水號解決得,我還是會偏好流水號解決啦。

ref: ChenHorror一篇比較詳細的分析

沒有留言:

張貼留言