1. 程式人生 > >MySql表設計及相關規範

MySql表設計及相關規範

一、資料庫設計思維

   1.  新增必要的(冗餘)欄位
       像“建立時間”、“修改時間”、“備註”、“操作使用者IP”和一些用於其他需求(如統計)的欄位等,在每張表中必須都要有,不是 說只有系統中用到的資料才會存到資料庫中,一些冗餘欄位是為了便於日後維護、分析、拓展而新增的,這點是非常重要的,比如黑客攻擊,篡改了資料,我們便就可以根據修改時間和操作使用者IP來查詢定位。
每個欄位要有註釋,每個表名要有註釋,欄位的取值含義或者範圍,列舉值要有註釋,這些都要有中文註釋
   2. 設計合理的表關聯
       若多張表之間的關係複雜,建議採用第三張對映表來關聯維護兩張表之間的關係,以降低表之間的直接耦合度。若多張表涉及到大資料量的問題,表結構儘量簡單,關聯也要儘可能避免。

二、命名規範

   1.表名:同一個應用(或領域)下的,要有相同的字首,如:t_xxx
   2. 庫名、表名、欄位名:要字母小寫加下劃線風格,長度不能超過32個字元,禁止拼音加英文混合命名
   3. 索引命名規範:普通索引 idx_+欄位名,主鍵索引 pk_+欄位名,唯一索引 uk_+欄位名,
   4. 簡潔、見名知意,

三、欄位資料型別設計規範

在資料庫色設計過程中,我們要本著夠用的原則,不能把資料欄位範圍設為最大或者預設值,會導致儲存空間大量的浪費,對資料庫的執行效率造成很大的影響。

用盡量少的儲存空間來存數一個欄位的資料:

        例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);

        IP地址最好使用int型別;

        固定長度的型別最好使用char,例如:郵編;

        能使用tinyint就不要使用smallint,int;

        最好給每個欄位一個預設值,最好不能為null;

 

  1. 欄位型別儘可能佔用少的儲存空間

       更小的資料型別通常更快,因為他們佔用更少的磁碟、記憶體和CPU快取,並且處理CPU的時間也很短。在需要儲存年齡、性別這些類似的應用場景中,應該選擇tinyint來儲存,而不是int。處理日期的時候,儲存使用者日期,應該選擇date型別而不是datetime,datetimek可以精確到時分秒。

        TIMESTAMP和DATETIME除了儲存範圍和儲存方式不一樣,沒有太大區別。當然,對於跨時區的業務,TIMESTAMP更為合適。

      2.資料型別的整合最好固定長度

      儲存字元時,應優先考慮char資料型別,因為char是定長的,而varchar 是變長的,mysql處理char比varchar要快一點。char型別的最大寬度為255 位元組,varchar 最大寬度為 65535 個位元組。

    3.儘量避免NULL

      索引null列需要額外的空間來儲存,佔更多空間,進行比較和計算時,對null值作特別的處理,可能造成索引失效。

    4.資料庫設計過程中儘量使用int欄位型別

     所有的資料型別中int不管是儲存空間還是執行速度方面都是比較好的。但但是不要因為int高效,而把所有的欄位都設計成為int來處理。

    5.財務相關資料,使用decimal型別

      用decimal來儲存金額欄位,不要用float和double,會出現資料精度丟失。

四、Mysql開發規範

    1.不用select *(消耗cpu,io,記憶體,頻寬,這種程式不具有擴充套件性);

    2.sql語句儘可能簡單(一條sql只能在一個cpu運算,大語句拆小語句,減少鎖時間,一條大sql可以堵死整個庫);

    3.所有sql關鍵詞全部大寫,比如SELECT,UPDATE,FROM,ORDER,BY等,所有的表名和庫名都要用``包含

         如SELECT COUNT(*) FROM `cdb_members` WHERE `userName` = 'aeolus';

    4.避免在資料庫中進行數學運算

       MySQL不擅長數學運算和邏輯判斷無法使用索引

    5.使用in代替or,in的值不超過1000個

    6.INSERT語句必須顯式的指明欄位名稱,不使用INSERT INTO table()

    7.禁止使用子查詢,建議將子查詢轉換成關聯查詢

Msql好奇的問題點:

  1. int(5)和int(10)的區別是什麼?

        int(x) x的值不管是什麼,儲存數字的取值範圍還是int本身資料型別的取值範圍,x只是資料顯示的長度而已,bigint和tinyinit型別也類似。

     2.char(10)和varchare(10)的區別是什麼?

       定義一個char[10]和varchar[10],如果存進去的是‘abcd’,那麼char所佔的長度依然為10,除了字元‘abcd’外,後面跟六個空格,而varchar就立馬把長度變為4了,取資料的時候,char型別的要用trim()去掉多餘的空格,而varchar是不需要的。char的存取數度還是要比varchar要快得多,因為其長度固定,方便程式的儲存與查詢;但是char也為此付出的是空間的代價,因為其長度固定,所以難免會有多餘的空格佔位符佔據空間,可謂是以空間換取時間效率,而varchar是以空間效率為首位的。與int不同的是,若存儲存的內容超過定義的長度,就會出錯。

Mysql索引:

索引類似於書本中的目錄

索引由資料庫中一列或多列組合而成,其作用是提高對錶中資料的查詢速度
索引的優點是可以提高檢索資料的速度
索引的缺點是建立和維護索引需要耗費時間
索引可以提高查詢速度,會減慢寫入速度

  • 普通索引:僅加速查詢
  • 唯一索引:加速查詢 + 列值唯一(可以有null)
  • 主鍵索引:加速查詢 + 列值唯一 + 表中只有一個(不可以有null),主鍵建立時就會自動建立主鍵索引
  • 組合索引:多列值組成一個索引
    專門用於組合搜尋,其效率大於索引合併
  • 全文索引:對文字的內容進行分詞,進行搜尋(將非結構化資料中的一部分資訊提取出來,重新組織,使其變得有一定結構,然後對此有一定結構的資料進行搜尋,從而達到搜尋相對較快的目的。)