目錄
本文主要總結工作這些年來,一些建表的較好的實踐經驗,希望能給你一點點啓發或者幫助。
一 自增主鍵 id
爲什麼需要自增主鍵id?
從性能、存儲空間兩個角度考慮:
性能:自增主鍵在新增記錄的時候屬於順序寫,磁盤的數據頁利用率高,不會觸發數據頁分裂;與業務相關的字段做主鍵,容易觸發隨機寫,爲了維護索引的有序性,需要移動索引樹頁子節點,容易引發數據頁分裂。
存儲空間:自增主鍵的長度一般要比業務主鍵要小,而非主鍵索引的葉子節點上存儲的都是主鍵的值,顯然,主鍵長度越小,非主鍵索引的葉子節點就越小,非主鍵索引佔用的空間也就越小。
因此,從性能和存儲空間兩個角度來考慮,自增主鍵是合理的。
事無絕對,是否可以在建表的時候不創建id?
你還真別說,我還真就遇到過,我們當初這塊有一個學生關注老師表,該表就沒有主鍵id,學生id和老師id作爲聯合主鍵id,說實話給學生關注老師表添加自增主鍵id,該字段也沒啥業務含義。
如果說創建自增主鍵id沒有業務含義,且能接受文件寫入一定的性能影響,我覺得不加自增id也是可以的。
二 創建時間、更新時間
爲什麼需要添加創建時間、更新時間呢?
有了創建時間和更新時間,對於數據統計、數據追蹤有很大的意義;其中更新時間天然就是一個版本的概念,便於樂觀鎖的實現。
創建時間、更新時間取哪裏的時間呢?WEB 服務器時間?DB 服務器時間?
建議取 WEB 服務器時間(Tomcat,Jboss,Apache),不建議取 DB 服務器時間。還真別說,我就遇到過 DB 服務器時間錯亂,導致線上數據錯誤的問題。都是血淋淋的教訓。
三 字段添加索引
爲什麼需要索引?
索引的目的是爲了減少查詢次數,提高查詢效率。可以充分的運用覆蓋索引、最左前綴原則、唯一索引等對查詢進行優化。
四 數據邏輯刪除
什麼是數據邏輯刪除?
所謂的邏輯刪除,就是給數據打上刪除標籤。
爲什麼不建議進行物理刪除?
因爲一旦進行物理刪除之後,數據就沒了,將來查問題、對數據進行追溯都不方便。再說了,我們是有原則的人,從刪庫到跑路的事情,我們堅決不幹。
五 靈活運用數據庫編碼
如果說表需要存儲 emoji 等特殊字符,可以使用 utf8mb4 編碼,不需要建議使用 utf8 編碼。
六 添加 version 字段
version 字段是給表添加的版本字段,每次對錶進行更新,version 字段也進行更新。version 字段是用來實現樂觀鎖的。