為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。
確保每列保持原子性
根據實際需求來定。比如某些資料庫系統中需要用到「位址」這個屬性,本來直接將「位址」屬性設計成乙個資料庫表的字段就行。但是如果系統經常會訪問「位址」屬性中的「城市」部分,那麼就非要將「位址」這個屬性重新拆分為省份、城市、詳細位址等多個部分進行儲存,這樣在對位址中某一部分操作的時候將非常方便。這樣設計才算滿足了資料庫的第一正規化,如下表所示。
確保表中的每列都和主鍵相關
比如要設計乙個訂單資訊表,因為訂單中可能會有多種商品,所以要將訂單編號和商品編號作為資料庫表的聯合主鍵,如下表所示。
這樣就產生乙個問題:這個表中是以訂單編號和商品編號作為聯合主鍵。這樣在該表中商品名稱、單位、商品**等資訊不與該錶的聯合主鍵相關,而僅僅是與商品編號相關。所以在這裡違反了第二正規化的設計原則。而如果把這個訂單資訊表進行拆分,把商品資訊分離到另乙個表中,把訂單專案表也分離到另乙個表中,就非常完美了。如下所示。
這樣設計,在很大程度上減小了資料庫的冗餘。如果要獲取訂單的商品資訊,使用商品編號到商品資訊表中查詢即可。
確保每列都和主鍵列直接相關,而不是間接相關,不存在傳遞依賴。第三正規化需要確保資料表中的,每一列資料都和主鍵直接相關,而不能間接相關解決間接相關,把不直接相關的再建一張表,採用外來鍵形式將兩張表關聯.
比如在設計乙個訂單資料表的時候,可以將客戶編號作為乙個外來鍵和訂單表建立相應的關係。而不可以在訂單表中新增關於客戶其它資訊(比如姓名、所屬公司等)的字段,因為新增後就會出現傳遞依賴 :
訂單編號--》客戶編號, 客戶編號--》客戶詳細資訊
如下面這兩個表所示的設計就是乙個滿足第三正規化的資料庫表。
這樣在查詢訂單資訊的時候,就可以使用客戶編號來引用客戶資訊表中的記錄,也不必在訂單資訊表中多次輸入客戶資訊的內容,減小了資料冗餘。
(1)表達是與否概念的字段,必須使用 is _ *** 的方式命名,資料型別是 unsigned tinyint( 1 表示是,0 表示否 ) 。
說明:任何字段如果為非負數,必須是 unsigned 。
正例:表達邏輯刪除的欄位名 is_deleted ,1 表示刪除,0 表示未刪除。
(2)表名、欄位名必須使用小寫字母或數字並以下劃線分隔 , 禁止出現數字開頭,禁止兩個下劃線中間只出現數字,名字要做到見名思意,不要超過32個字元。
說明:mysql 在 windows 下不區分大小寫,但在 linux 下預設是區分大小寫。
正例: aliyun _ admin , rdc _ config , level 3_ name
反例: aliyunadmin , rdcconfig , level _3_ name
(3)小數型別為 decimal ,禁止使用 float 和 double 。
說明: float 和 double 在儲存的時候,存在精度損失的問題,很可能在值的比較時,得到不正確的結果。如果儲存的資料範圍超過 decimal 的範圍,建議將資料拆成整數和小數分開儲存。
(4)表必備三欄位: id 主鍵, gmt _ create建立時間 , gmt _ modified更新時間 。
(5)不同表之間儲存相同資料的列名和列型別必須一致(關聯列)
(6)優先選擇符合儲存需要的最小、最簡單的資料型別。
選擇資料型別只要遵循小而簡單的原則就好,越小的資料型別通常會更快,占用更少的磁碟、記憶體,處理時需要的cpu週期也更少。越簡單的資料型別在計算時需要更少的cpu週期,比如,整型就比字元操作代價低,因而會使用整型來儲存ip位址,使用datetime來儲存時間,而不是使用字串。
①盡量使用數字型字段
若只含數值資訊的字段盡量不要設計為字元型,這會降低查詢和連線的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連線時會逐個比較字串中每乙個字元,而對於數字型而言只需要比較一次就夠了。
②盡量使用位數較少的型別 ,比如能使用tinyint/smallint就不使用int,能使用無符號位就不適用有符號資料型別
③盡可能的使用 varchar/nvarchar 代替 char/nchar
因為首先變長字段儲存空間小,可以節省儲存空間,其次對於查詢來說,在乙個相對較小的字段內搜尋效率顯然要高些。只有在儲存的字串長度幾乎相等,使用 char 定長字串型別。
(7)不得使用外來鍵與級聯,一切外來鍵概念必須在應用層解決。
(8)表和欄位名要加注釋
(9)將字段很多的表分解成多個表
將使用頻率低的字段拿出來新建乙個表,完成分表,從而提高效率
(10)增加冗餘字段
適當的不遵循正規化的要求,對於經查查找的外表字段可以在本表中增加冗餘字段。比如經常要查乙個學生的系名,就可以在學生表加乙個系名的字段
(1)業務上具有唯一特性的字段,即使是多個欄位的組合,也必須建成唯一索引。
說明:不要以為唯一索引影響了 insert 速度,這個速度損耗可以忽略,但提高查詢速度是明顯的 。
(2)主鍵索引名為 pk_ 欄位名;唯一索引名為 uk _欄位名 ; 普通索引名則為 idx _欄位名。
(3)在 varchar 欄位上建立索引時,必須指定索引長度,沒必要對全欄位建立索引,根據實際文字區分度決定索引長度即可。
(4)限制每張表的索參數量,建議每張表的索參數量不超過5個,並且針對復合索引,最常用的、區分度最高的(列中不同值數量/列的總行數)、字段長度小的放到最左側
(5)索引列定義為 not null
索引null列需要額外空間儲存,需要占用更多地空間,運算和比較的時候會占用更多的空間
(6)值分布稀少的字段不適合建立索引,比如性別
資料庫建表設計規範
mysql 的字符集支援涉及兩個方面 字符集 character set 和排序方式 collection 對字符集的支援可以細化到四個層次 伺服器 server 資料庫 database 資料表 table 連線 connection 連線mysql 可通過如下命令檢視字符集的詳情 對資料庫的命名...
資料庫設計規範
使用明確 統一的標明和列名,例如 school,schoolcourse,courceid。資料表名使用單數而不是複數,例如 studentcourse,而不是studentcourses。資料表名不要使用空格。資料表名不要使用不必要的字首或者字尾,例如使用school,而不是tblschool,或...
資料庫設計規範
csm簡寫會方便很多 就不要用member id,一致性方便大家理解 system.currenttimemillis 進行儲存text查詢是會產生臨時磁碟檔案,效能差進行擷取儲存型別 占用位元組 範圍tinyint 1 128 127 smallint 2 32768 32767 mediumin...