主鍵:用于唯一標識一個表中一行數據。
外鍵:用于建立兩個表之間的關系,A表中有一列是B表中的主鍵,那么A表中這列的數據就受到B表主鍵的約束。
那么關于主鍵應該如何設計呢,這里我說下優缺點:
1.用自動增長字段作為主鍵,這樣的主鍵可以稱之為 非業務主鍵(或邏輯主鍵、或代理主鍵),就是說這列與業務無關,僅僅是作為主鍵而設計。
優點:自增長字段往往是integer bigint類型,最多占8個字節。索引與外鍵 所占用的空間連帶減少,增刪改查 效率高。業務變化,不影響,不需要更新主鍵。
缺點:無法轉移數據庫,比如把表中的一批數據 轉移 或 附帶到 另一個表中,那么由于是自增長字段,那么會導致無法轉移,因為另外一個表可能已經存在部分數據,會造成主鍵沖突。自增長字段的缺陷。
? ? ? ? 業務數據的完整性,無法保證。
?
2.用全球唯一標識符GUID,來做主鍵。依然是非業務主鍵。
優點:可以轉移數據庫。業務變化,不影響,不需要更新主鍵。
缺點:字符串較長,占用的空間較多,如果用于外鍵的話,會導致連帶其它表占用的空間連帶增多。A表中有一列是B表中的主鍵 ,那么A表中的這列也是需要有個索引的,即存儲空間會連帶增多。效率變低。
? ? ? ? 即除了正常業務字段外,還是弄個字符串字段來專一保存這個全球唯一標識符,造成存儲浪費。業務數據的完整性,無法保證。
?
3.用業務字段做主鍵。
優點:可以轉移數據庫,最大化節省了空間,因為并沒有 多增加一個非業務字段做主鍵。業務數據的完整性,可以保證。避免產生垃圾數據,銀行就是用業務字段做主鍵的,雖然效率低,但是安全。
缺點:如果業務發生改變,有可能需要修改主鍵,舉例:國家A表用身份證號做主鍵,然后其他很多表中的身份證號這列都是來自 身份證表A中的主鍵(即外鍵),那么如果身份證號升級,比如從1代升級到2代,那么
? ? ? ? 那么連帶的表的外鍵 的索引 通通都得發生變化,效率極低 因為會連帶更新一串用到這個外鍵的表,可見用業務字段做主鍵的話,你得保證 主鍵不經常變化。
?
==============
綜上:用哪種方式做主鍵,還是得看業務需求,實際情況,實事求是。根據情況選擇,沒有固定的標準。