最近在作數據庫設計的時候(以MySQL爲主),遇到很多困惑,由於以前作數據庫表設計,基本上主鍵都是使用自增的形式,最近由於這種作法,被領導指出存在一些不足,因而我想搞明白哪裏不足。
html
經過網上查閱資料,得出一個這樣的結論:
表的主鍵通常都要使用自增 id,不建議使用業務id ,是由於使用自增id能夠避免頁分裂。mysql
按照我過去的實踐:
選擇使用自增能夠避免不少麻煩,主要體現是數據的惟一性(從1到xxx,確定不會重複的)。sql
這塊我沒看太明白,我主要參考以下連接:
一看就懂的:MySQL數據頁以及頁分裂機制數據庫
爲何?mysql不推薦使用uuid或者雪花id做爲主鍵?服務器
拖庫:指黑客經過各類社工手段、技術手段將數據庫中敏感信息非法獲取,通常這些敏感信息包括用戶的帳號信息如用戶名、密碼;身份信息如真實姓名、證件號碼;通信信息如電子郵箱、電話、住址等。架構
參考連接:
MySQL主鍵應該用UUID仍是INT類型數據庫設計
簡要歸納UUID的適用場景:主要適合用在大型項目微服務架構中,保證全局ID惟一性(大型項目微服務架構集成各式各樣的子系統,避免ID衝突)。性能
起初我在數據表設計的時候就與項目經理爭論過,挺相似這個連接的對話:UUID與數字ID的區別與適用場景ui
指用2個或者是2個以上的字段組成的主鍵,用這個主鍵包含的字段做爲主鍵,這個組合在數據表中是惟一,且附加上了主鍵索引。
我能想到一個用戶信息,針對某個一個區域若是用用戶ID或用戶ID+用戶姓名做爲主鍵,難以保持數據的惟一性,由於這一個地區不只僅是有一個小馬哥,可能有七八我的,如此,前面提到的用戶ID或用戶ID+用戶姓名顯然是行不通的,這時能夠把身份證加入主鍵,變成了用戶ID+用戶姓名+身份證(造成了一個聯合主鍵),這樣一來該用戶數據的惟一性獲得了驗證。固然了,聯合主鍵的場景不只僅是這個,關鍵看業務場景。
從外包公司->創業公司->教育公司->如今所在公司,回過頭來看過去個人數據表設計方面,存在的一個最大不足,即着重考慮技術實現難易層面,而輕視業務場景適用性、擴展性、穩定性等。