## 命名規范
* 庫名、表名、字段名必須使用小寫字母,并采用下劃線分割。
* 庫名、表名、字段名禁止超過32個字符。
* 庫名、表名、字段名見名知意,使用名詞而不是動詞。
* 庫名、表名、字段名,使用常見單詞,避免使用長單詞和生僻詞。
* 表名、字段名應當有注釋,描述該表、字段的用途。
* 表名不使用復數名詞。
## 表字段設計規范
* 使用InnoDB存儲引擎,表字符集選擇UTF8。
* 使用UNSIGNED存儲非負數值。
* 使用INT UNSIGNED存儲IPV4。
* 使用DECIMAL代替FLOAT和DOUBLE存儲精確浮點數。
* INT類型固定占4字節存儲,例如INT(4)僅代表顯示字符寬度為4位,不代表存儲長度。
* 區分使用TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT數據類型。例如取值范圍為0-80時,使用TINYINT UNSIGNED。
* 建議字段定義為NOT NULL。
* 盡可能不使用TEXT、BLOB類型。
* VARCHAR(N),N表示的是字符數不是字節數,比如VARCHAR(255),可以最大可存儲255個漢字,需要根據實際的寬度來選擇N。
* VARCHAR(N),N盡可能小,因為MySQL一個表中所有的VARCHAR字段最大長度是65535個字節,進行排序和創建臨時表一類的內存操作時,會使用N的長度申請內存。
* 時間字段,除特殊情況一律采用INT來記錄時間戳;使用created\_time表示記錄創建時間、updated\_time表示記錄更新時間。
* 禁止在數據庫中存儲圖片、文件等大數據。
* 表達其實際含義的英文單詞或簡寫。布爾意義的字段以is\_作為前綴,后接動詞過去分詞
* 各表之間相同意義的字段應同名。各表之間相同意義的字段,以去掉模塊前綴的表名\_字段名命名。
* 外鍵字段用表名\_字段名表示其關聯關系。
* 表的主鍵一般都約定成為id,自增類型,是別的表的外鍵均使用xxx\_id的方式來表明。
* 表示開關的字段(0/1),用Tinyint
## 索引
* 表的主鍵的字段名約定為id,自增類型。
* 索引中的字段數建議不超過5個,單張表的索引數量控制在5個以內。
* 索引名稱必須使用小寫。
* 主鍵索引名為pk\_字段名,唯一索引名為uk\_字段名,普通索引名則為idx\_字段名。
* 組合索引建議包含所有字段名,過長的字段名可以采?縮寫形式。
* 禁止冗余索引、禁止重復索引。
* 索引字段的順序需要考慮字段值去重之后的個數,個數多的放在前面。
* ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面。
* 使用EXPLAIN判斷SQL語句是否合理使用索引,盡量避免extra列出現:Using File Soqian,Using Temporary。
* UPDATE、DELETE語句需要根據WHERE條件添加索引。
* 對長度過長的VARCHAR字段建立索引時,添加crc32或者MD5 Hash字段,對Hash字段建立索引。
* 合理創建聯合索引(避免冗余),(a,b,c) 相當于 (a) 、(a,b) 、(a,b,c)。
* 合理使用覆蓋索引減少IO,避免排序。
## SQL
* 使用prepared statement,可以提供性能并且避免SQL注入。
* 避免在SQL語句進行數學運算或者函數運算。
* SQL語句中IN包含的值不應超過1000個。
* 統計表中記錄數時使用COUNT(\*),而不是COUNT(primary\_key)。
* 避免對記錄行數超過1000行的表使用%前導查詢,因為%前導查詢無法利用到索引。
* 非統計類查詢,應避免使用JOIN和子查詢。
* 不使用ORDER BY RAND(),使用其他方法替換。
* 避免使用含業務邏輯的存儲過程、觸發器、函數等。
* WHERE條件中必須使用合適的類型,避免MySQL進行隱式類型轉化
* UPDATE、 DELETE 語句不使用 LIMIT。
## 使用uuid作為mySQL主鍵
新建一個id字段,不要設置自增,只設置PK,然后建立觸發器,如下。
~~~
DELIMITER $$
CREATE TRIGGER `id_trigger` --觸發器名稱
BEFORE INSERT --作用時機
ON `hncj_testuuid` --作用于數據表名稱
FOR EACH ROW
BEGIN
SET new.id=REPLACE(UUID(),'-',''); --邏輯
END -- begin 和 end中間是觸發器定義,可以寫到phpmyadmin中間
~~~
- 搭建ThinkPHP6的開發環境
- 配置ThinkPHP6
- 必要的基礎知識(basic)
- MVC開發模式
- 控制器(controller)
- 數據庫(database)
- 模型(model)
- 模型關聯(relation)
- 視圖(view)
- Session
- Cookie
- 緩存(cache)
- 上傳(upload)
- 驗證器(validate)
- 驗證碼(captcha)
- 命令行(command)
- 服務器部署(deploy)
- 數據備份(backup)
- 數據同步(synchronization)
- 訂閱服務(subscribe)
- PHP 易混淆知識點
- 助手函數
- MySQL規范
- Redis 規范
- office插件 phpoffice
- 拼音插件 pinyin
- 日期插件 datetime
- 消息插件 amqp
- 產品部署環境的搭建
- PDF 等雜項處理
- 文件上傳
- 常用擴展
- flc/dysms
- 使用示例 ①
- 使用示例 ②
- qiniu/php-sdk
- 簡介
- 使用示例
- 使用示例 2 ②
- liliuwei/thinkphp-jump
- 擴展介紹
- 下載擴展
- 使用方法
- topthink/think-captcha
- 安裝擴展
- 驗證碼顯示
- 更換驗證碼
- 驗證碼校驗
- 驗證碼配置
- 自定義驗證碼
- phpoffice/phpspreadsheet
- 數據寫入表格
- 讀取表格數據
- topthink/think-queue
- 安裝
- 自定義函數
- 任務類
- 帶有日志的任務類