##三、字段設計規范
1. 用DECIMAL代替FLOAT和DOUBLE存儲精確浮點數
> 浮點數的缺點是會引起精度問題,請看下面一個例子:
<code>
mysql> CREATE TABLE t3 (c1 float(10,2),c2 decimal(10,2));
Query OK, 0 rows affected (0.05 sec)
>mysql> insert into t3 values (999998.02, 999998.02);
Query OK, 1 row affected (0.01 sec)
>mysql> select * from t3;
+-----------+-----------+
| c1 | c2 |
+-----------+-----------+
| 999998.00 | 999998.02 |
+-----------+-----------+
1 row in set (0.00 sec)
</code>
可以看到c1列的值由999998.02變成了999998.00,這就是float浮點數類型的不精確性造成的。因此對貨幣等對精度敏感的數據,應該用定點數表示或存儲。
2. 使用TINYINT來代替ENUM類型
> 采用enum枚舉類型,會存在擴展的問題,例如用戶在線狀態,如果此時增加了:5表示請勿打擾、6表示開會中、7表示隱身對好友可見,那么增加新的ENUM值要做DDL修改表結構操作了。
3. 字段長度盡量按實際需要進行分配,不要隨意分配一個很大的容量
> 選擇字段的一般原則是保小不保大,能用占用字節少的字段就不用大字段。比如主鍵,強烈建議用int整型,不用uuid,為什么?省空間啊。空間是什么?空間就是效率!按4個字節和按32個字節定位一條記錄,誰快誰慢太明顯了。涉及幾個表做join時,效果就更明顯了。更小的字段類型占用的內存就更少,占用的磁盤空間和磁盤I/O也會更少,而且還會占用更少的帶寬。
有不少開發人員在設計表字段時,只要是針對數值類型的全部用int,但這不一定合適,就比如用戶的年齡,一般來說,年齡大都在1~100歲之間,長度只有3,那么用int就不適合了,可以用tinyint代替。又比如用戶在線狀態,0表示離線、1表示在線、2表示離開、3表示忙碌、4表示隱身等,其實類似這樣的情況,用int都是沒有必要的,浪費空間,采用tinyint完全可以滿足需要,int占用的是4字節,而tinyint才占用1個字節。
int整型有符號(signed)最大值是2147483647,而無符號(unsigned)最大值是4294967295,如果你的需求沒有存儲負數,那么建議改成無符號(unsigned),可以增加int存儲范圍。
int(10)和int(1)沒有什么區別,10和1僅是寬度而已,在設置了zerofill擴展屬性的時候有用,例:
<code>
root@localhost(test)10:39>create table test(id int(10) zerofill,id2 int(1));
Query OK, 0 rows affected (0.13 sec)
root@localhost(test)10:39>insert into test values(1,1);
Query OK, 1 row affected (0.04 sec)
root@localhost(test)10:56>insert into test values(1000000000,1000000000);
Query OK, 1 row affected (0.05 sec)
root@localhost(test)10:56>select * from test;
+------------+------------+
| id | id2 |
+------------+------------+
| 0000000001 | 1 |
| 1000000000 | 1000000000 |
+------------+------------+
2 rows in set (0.01 sec)
</code>
4. 字段定義為NOT NULL要提供默認值
> 從應用層角度來看,可以減少程序判斷代碼,比如你要查詢一條記錄,如果沒默認值,你是不是得先判斷該字段對應變量是否被設置,如果沒有,你得通過java把該變量置為''或者0,如果設了默認值,判斷條件可直接略過。
NULL值很難進行查詢優化,它會使索引統計更加復雜,還需要MySQL內部進行特殊處理。
5. 盡可能不使用TEXT、BLOB類型
> 增加存儲空間的占用,讀取速度慢
6.表中添加create_time和update_time字段。方便大數據團隊抽取數據使用。create_time不允許更新,update_time字段設置為自動更新。
例如:
`create_time` datetime NOT NULL COMMENT '創建時間',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
- 說明
- Python編程規范
- Python風格規范
- Python語言規范
- Java編程規范
- 一、命名約定
- 二、常量定義
- 三、格式約定
- 四、OOP約定
- 五、集合處理
- 六、并發控制
- 七、控制語句
- 八、注釋約定
- 九、異常日志
- 十、日志約定
- Android開發規范
- 前端開發規范
- HTML
- JavaScript
- CSS
- MySQL約定
- 一、基本規范
- 二、庫表設計規范
- 三、字段設計規范
- 四、索引規范
- 五、SQL設計規范
- 六、業務字段命名規范
- 開發安全約定
- 一、代碼安全
- 二、移動開發安全
- 三、服務器安全
- 四、安全意識
- 版本管理
- Git使用規范
- 技術實踐及可視化
- 一、Code Review
- 二、單元測試
- 三、自動化測試
- 四、技術債
- 五、CI
- IOS開發規范