MySQL和PostgreSQL設計規範

MySQL&PostgreSQL設計規範

1. 設計工具

使用Navicat Data Modeler進行數據庫設計,使用*.ndml文件交流設計細節,不允許直接操作數據庫進行修改

修改數據庫一定要同步更新本地的.ndml文件,避免因開發環境異常而導致數據庫丟失,demo測試數據或初始化數據要以sql腳本協議代碼中*

字符集:統一使用utf-8字符集, 按中文排序

2. 命名規範

2.1 數據庫名

  • 使用蛇底式命名法(snake_case)
  • [部門名]_項目名, 部門名可省略

2.2 表名

  • 使用蛇底式命名法(snake_case)
  • 名詞表名應使用單數形式 (辨認、書寫一個單詞的複數形式,更困難)
  • 表名儘量簡短 (例如用戶表,表名應爲user,而非user_info, 當伴隨多個附屬表時便於定位主表)
  • 表名通常使用名詞

2.3 字段名

  • 使用蛇底式命名法(snake_case)
  • 字段名儘量簡短
  • 可使用衆所周知的單詞簡寫(例如 desc)
  • 不可使用保留字
    class, desc等

通用字段

特殊含義字段,除非特別需要,請使用約定名稱

  • id 表的主鍵爲id, 不需要增加類似user,device之類的前綴,例如userid
  • 表名_id 邏輯上的外鍵id,不建議使用外鍵定義
  • name 記錄的名稱,是id的別名,一般用於友好顯示
  • create_time 記錄的創建時間
  • update_time 記錄的更新時間
  • expire_time 記錄的過期時間
  • is_deleted 記錄的刪除標記
  • desc 記錄的描述,描述通常有長度限制,是對name的進一步說明
  • comment 記錄的備註,通常是備忘信息,長度較長

3. 數據類型規範

  • 優先選用數值類型
  • 如果可以儘量不允許輸入null

數字類型選擇

  • 估算範圍優先選擇存儲空間小的類型 (降低數據存儲,降低索引存儲)
  • id應使用自增類型
  • 對與金融貨幣應採用準確的定點型 (防止計算誤差)
  • 用整型代替boolean類型 (mysql boolean實際實現爲tinyint(1),不會節省空間,但會降低擴展性)
  • 需要進行模糊查詢時不應使用數字類型, 而應使用字符串(例如,身份證號,電話號)

字符串與字節流

MYSQL

  • 長度變化不大的字符串用char
  • 長度變化較大的字符串用varchar
  • 需要有默認值使用varchar,不選用text
  • 能用varchar,不用text
  • 非可視字符數據應使用字節流類型

POSTGRESQL

  • 儘量使用text
  • 需要限定最大長度時使用varchar

時間時期類型

  • 只需要時分秒或年月日的情況下可以選擇date
  • 需要秒級精度時儘量選用timestamp類型, 不建議使用time(可使用數據庫的相關時間函數,但需注意對數據庫服務器的時區依賴)
  • 可使用bigint
  • 不允許使用varchar
## 整型
SQL標準             -                             smallint                        -            integer                   bigint  
postgresql 有符號  char(1)[1B,charactor(1)]替代   smallint[2B,int2]         char(3)替代        integer[4B,int,int4]      bigint[8B,int8]
           自增                                   smallserial[2B,serial2]                      serial[4B,serial4]        bigserial[8B,serial8]  
           postgreql serial並非真實類型, 內部實現爲一個integet+一個自增serquence實現,可用\d 查看錶結構檢查
mysql              tinyint(1字節)                 smallint(2字節)           mediumint(3字節)   int(4字節)                bigint(8字節)  

## 浮點型  
postgresql         real,float4(不準確,4字節,6位)     double,float8(不準確,8字節,15位)     decimal,numeric(準確,變長,任意精度,最多1000)
mysql              float(4字節,6位)                  double(8字節,15位)                   decimal(16字節,準確,定點)

## 字符型
postgresql         char(n),character(n)(定長,不足補白,最大1GB)       varchar(n),character varying(n)(變長,最大1GB)         text(變長, 無長度限制)
                   注:postgres中char與varchar無性能差別,但char可能比varchar多佔用空間
mysql              char(n)(定長,不足補白,最大255字節)                varchar(n)(變長,v5.0.3最大255之後最大65535)           tinytext(最大255)     text(最大65535)   mediumtext(最大16777215)   longtext(最大429496729)
                   注:mysql中char比varchar性能更高     
                   
## 布爾型
postgresql         bool,boolean(從擴展性角度,不建議使用)  
mysql              bool,boolean(從擴展性角度,不建議使用)
                   
## 時間日期  
postgresql                            date(4字節, 年月日)    time(8字節,時分秒毫秒)                         timestamp(8字節)                      timestamptz(8字節, 時間戳帶時區)         timetz(12字節, 時間戳帶時區)    interval(12字節, 時間間隔)
mysql              year(1字節, 年)    date(3字節, 年月日)    time(3字節, 時分秒)         datetime(8字節)     timestamp(8字節, 有自動更新特性)

## 字節流
postgresql         bytea(變長,字節流) 
mysql              tinyblob   blob      mediumblob  longBlob

## 特殊數據類型  
postgres  
  money 數據庫級別提供併發機制,準確精確計算,但輸出與幣種有關,且數據庫全局設置,不建議使用
  bit  bitvar,bit varying 位串類型,可在位級別進行長度控制

4. 索引選擇

4.1 索引添加

  1. 數據表id必須加索引
  2. 表示唯一數據的字段應該加索引(除非確定肯定不會在查詢中用到)
  3. 可能作用篩選where語句,排序order by的部分必須加索引

4.2 索引類型

Hash索引: 內存佔用多, 但單條記錄查詢效率最高,不支持排序
B-Tree索引: 查詢效率較高,支持範圍查詢及排序

  • 需要支持排序的索引須使用B-Tree索引,根據場景需注意B-Tree的排序設置
  • 需要聲明唯一性的索引須使用B-Tree索引
  • 需要比較,判等操作時使用B-Tree索引
  • 字段值特別長,且只需要等值查詢時使用Hash索引
  • 按時序插入的數據,且只需要等值及範圍查詢時使用BRIN索引
  • 空間幾何類型數據使用GiST或SP-GiST索引
  • 全文檢索使用BRIN索引

5. 備註規範

5.1 表備註

  • 表名不能準確表達表用途時應備註說明

5.2 字段備註

  • 具有量綱單位的字段,應在備註中給出字段對應的單位
  • 枚舉或編碼數據給出常見值及對應的含義
  • 字段名如果使用縮寫,備註應給出縮寫全稱

6. 數據引擎選擇(PostgreSQL不需考慮)

不同的數據庫對數據庫引擎的支持不同,因此考慮數據庫引擎選擇的優先級別規範

常見MySQL數據庫

MySQL(閉源風險) ==> Infobright (mysql的數據倉庫方案)
MariaDB
Percona
AliSQL
postgres ==> Greenplum(postgres的數據倉庫方案)

常見數據庫引擎使用優先級

Xtradb=>InnoDB (全事務型存儲引擎,事務方面支持較好)
TokuDB (新型事務型存儲引擎,寫入性能高,存儲壓縮比高,適合寫多讀少的場景)
Archive (適合歸檔類數據,讀少,寫多,可考慮用數據倉庫類方案)
MEMORY (適合可忍受丟失,且訪問頻繁的數據,可用redis,memcached等替代方案)
Aria(原名Maria引擎)=>MyISAM (MYSQL8.0開始不再維護,不推薦使用)
SphinxSE引擎 (是和全文搜索)

7. 開發測試環境與部署環境分離

  • 開發測試環境
    服務器:測試用例統一使用數據庫,如 10.0.30.201
    注意:數據隨時刪除不應影響測試,測試用例代碼包含所需測試數據
  • 演示與生產環境
    服務器:如默認使用10.0.30.209 ,具體視實際情況而定
    注意:應有可靠備份,數據不因誤刪除而影響
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章