在數據庫表設計中會糾結於”自然鍵”和”代理鍵”的選擇,自然鍵在實現數據“軟刪除”時實現比較復雜,部分自然鍵因為鍵值過長或多列組合導致不適合作為表主鍵,而比較常見兩種代理鍵為自增列(auto incremnet)和全局唯一標識列(GUID)。
使用自增列作為主鍵的優缺點:
1、 主鍵鍵值長度短,INT列需要4個字節,BIGINT列需要8個字節; 2、 自增主鍵順序遞增,在INSERT操作時”順序”寫入表; 3、 由於數據集中插入到表尾部,在高並發情況下容易造成”數據頁熱點”,影響插入效率; 4、 自增主鍵只能保證在表內數據唯一,對於分庫分表場景,可能因錯誤操作產生相同的“唯一值”。
使用GUID列的優缺點:
1、 32位GUID字符串需要更多的存儲空間來存放(具體存儲長度與字符集相關),影響主鍵和其他索引的查詢性能。 2、 GUID可實現全局唯一,能保證在多個表之間的數據唯一性 3、 GUID將數據分散到全表,不會產生熱點數據頁,但會造成大量隨機IO讀寫
在實際使用過程中,很少場景會使用GUID作為主鍵,大部分業務按照數據量需求使用INT或BIGINT的自增列作為主鍵,對於需要多表唯一的場景可以通過程序實現全局唯一的自增ID。