关于主键的设计、primary key
主鍵:用于唯一標(biāo)識一個表中一行數(shù)據(jù)。
外鍵:用于建立兩個表之間的關(guān)系,A表中有一列是B表中的主鍵,那么A表中這列的數(shù)據(jù)就受到B表主鍵的約束。
那么關(guān)于主鍵應(yīng)該如何設(shè)計呢,這里我說下優(yōu)缺點:
1.用自動增長字段作為主鍵,這樣的主鍵可以稱之為 非業(yè)務(wù)主鍵(或邏輯主鍵、或代理主鍵),就是說這列與業(yè)務(wù)無關(guān),僅僅是作為主鍵而設(shè)計。
優(yōu)點:自增長字段往往是integer bigint類型,最多占8個字節(jié)。索引與外鍵 所占用的空間連帶減少,增刪改查 效率高。業(yè)務(wù)變化,不影響,不需要更新主鍵。
缺點:無法轉(zhuǎn)移數(shù)據(jù)庫,比如把表中的一批數(shù)據(jù) 轉(zhuǎn)移 或 附帶到 另一個表中,那么由于是自增長字段,那么會導(dǎo)致無法轉(zhuǎn)移,因為另外一個表可能已經(jīng)存在部分?jǐn)?shù)據(jù),會造成主鍵沖突。自增長字段的缺陷。
? ? ? ? 業(yè)務(wù)數(shù)據(jù)的完整性,無法保證。
?
2.用全球唯一標(biāo)識符GUID,來做主鍵。依然是非業(yè)務(wù)主鍵。
優(yōu)點:可以轉(zhuǎn)移數(shù)據(jù)庫。業(yè)務(wù)變化,不影響,不需要更新主鍵。
缺點:字符串較長,占用的空間較多,如果用于外鍵的話,會導(dǎo)致連帶其它表占用的空間連帶增多。A表中有一列是B表中的主鍵 ,那么A表中的這列也是需要有個索引的,即存儲空間會連帶增多。效率變低。
? ? ? ? 即除了正常業(yè)務(wù)字段外,還是弄個字符串字段來專一保存這個全球唯一標(biāo)識符,造成存儲浪費。業(yè)務(wù)數(shù)據(jù)的完整性,無法保證。
?
3.用業(yè)務(wù)字段做主鍵。
優(yōu)點:可以轉(zhuǎn)移數(shù)據(jù)庫,最大化節(jié)省了空間,因為并沒有 多增加一個非業(yè)務(wù)字段做主鍵。業(yè)務(wù)數(shù)據(jù)的完整性,可以保證。避免產(chǎn)生垃圾數(shù)據(jù),銀行就是用業(yè)務(wù)字段做主鍵的,雖然效率低,但是安全。
缺點:如果業(yè)務(wù)發(fā)生改變,有可能需要修改主鍵,舉例:國家A表用身份證號做主鍵,然后其他很多表中的身份證號這列都是來自 身份證表A中的主鍵(即外鍵),那么如果身份證號升級,比如從1代升級到2代,那么
? ? ? ? 那么連帶的表的外鍵 的索引 通通都得發(fā)生變化,效率極低 因為會連帶更新一串用到這個外鍵的表,可見用業(yè)務(wù)字段做主鍵的話,你得保證 主鍵不經(jīng)常變化。
?
==============
綜上:用哪種方式做主鍵,還是得看業(yè)務(wù)需求,實際情況,實事求是。根據(jù)情況選擇,沒有固定的標(biāo)準(zhǔn)。
轉(zhuǎn)載于:https://www.cnblogs.com/del88/p/6719176.html
總結(jié)
以上是生活随笔為你收集整理的关于主键的设计、primary key的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基本语法-----java常量
- 下一篇: Hadoop HIVE