軟體工程師的小事:到底要不要 Close

問與答:資料表流水識別碼不應使用自動產生 | 2019 鐵人賽

論點

若使用 IDENTITY 等資料庫自動產生的方式給予識別碼
當資料列被刪除時,序號就會產生截斷
所以主索引鍵序號的值應從應用程式產生

例:

1    訂單#1
2    訂單#2
3     訂單#3

若今天刪除「訂單#3」然後再新增一筆訂單就會變成

1    訂單#1
2    訂單#2
4     訂單#4

應該是

1    訂單#1
2    訂單#2
3     訂單#4

這是一個很有趣的論點
上述情境中編號 3 的訂單不見是件「非常合理」的事情

大部分取得訂單會使用流水識別碼
若今天 3 被刪掉然後又新增一筆 3 出來

使用者就會發現:
今天我編號 3 的訂單怎麼跟之前不一樣了(因為顯示為訂單#4)

若使用應用程式來管理序號
就需要注意在水平擴充調整規模時會不會產生衝突

所以遞增序號應該由 SQL Server 負責提供
無論是使用「序列 (Sequence)」或是 IDENTITY 皆可
可以更加確保資料的一致性

留言