MySQL 命名約定
引擎和字符集
引擎始終是MyISAM,除非在特殊情況下需要不同。所有數據庫都必須使用 UTF8 字符集。
數據庫
數據庫名稱必須與項目名稱同名。如果項目名稱爲“我的網站”,則應將數據庫創建爲:
CREATE DATABASE mywebsite DEFAULT CHARSET UTF8;
表
所有表都必須採用 UTF8 編碼。同一包中的所有表都必須具有前綴。使用 2 個或 3 個字母來描述要爲數據庫添加前綴的包。如果項目名稱是Real Deal Marketing,最明顯的前綴將是“rdm_”;
CREATE TABLE rdm_affiliates;
更改表和文件版本 major.minor[.build[.revision]]
所有表的所有更改都應保存在(database_name).sql文件中。如果數據庫名稱爲“realdealmarketing”文件名應爲 realdealmarketing-1.0.0.sql
- 初始文件必須爲版本 1.0.0
- 如果只有表更改文件,則新版本應增加 0.0.1 示例:realdealmarketing-1.0.7.sql
- 如果創建新表,則必須將版本增加 0.1。示例:房地產交易營銷-1.2.0.sql
- 如果刪除表,則必須將版本提高 1.0。示例:realdealmarketing-2.0.0.sql
- 所有次要修訂版都應具有遵循以下模式的適當文件名和版本:major.minor[.build[.revision]]
- 所有版本應保存在同一目錄中
領域
本節說明如何創建數據庫表字段以及如何爲每個字段選擇名稱。
字段名稱
字段名稱必須以表名的 2-4 個字母爲前綴。
字段名稱始終以小寫形式,用“_”分隔單詞
例
DROP TABLE IF EXISTS rdm_affiliates;
CREATE TABLE IF NOT EXISTS rdm_affiliates
(
aff_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
aff_url VARCHAR(120) NOT NULL DEFAULT '',
aff_title VARCHAR(120) NOT NULL DEFAULT '',
aff_website CHAR(10) NOT NULL DEFAULT '',
aff_gender CHAR(8) NOT NULL DEFAULT '',
aff_landing_page VARCHAR(120) NOT NULL DEFAULT '',
aff_link VARCHAR(120) NOT NULL DEFAULT '',
aff_text TEXT,
PRIMARY KEY (aff_id),
INDEX (aff_website)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
所有字段名稱都必須是描述性的,避免使用“唯一”、“排序”和保留字等名稱。
空值和默認值
除AUTO_INCREAMENT、文本、日期(和類似字段)外的所有字段都必須定義爲非空默認“值”
例子:
aff_title VARCHAR(120) NOT NULL DEFAULT ''
aff_gender ENUM('male','female') NOT NULL DEFAULT 'male'
user_id INT UNSIGNED NOT NULL DEFAULT 0
user_birthday DATE DEFAULT NULL
user_allow_newsletter TINYINT(1) UNSIGNED NOT NULL DEFAULT 0
art_text TEXT
指標
WHERE 和 ORDER BY 中的所有字段都應定義爲 INDEX。如果您有這樣的疑問:
SELECT * FROM table1 WHERE a='something' ORDER BY b
然後應將字段 a、b 視爲索引
INDEX index_name (a,b)
查爾特指數
如果文本字段(CHAR、VARCHAR)用作較大表(> 5000 條記錄)的索引,則應始終定義爲 CHAR。例如,如果您有如下字段:
aff_url VARCHAR(255) NOT NULL DEFAULT ''
...
INDEX afiliate_url (aff_url)
爲了提高性能,應將此表更改爲如下所示
aff_url CHAR(20) NOT NULL DEFAULT ''
...
INDEX afiliate_url (aff_url)
查詢
保留字應爲大寫以提高可讀性。此外,嘗試在多行中分隔長查詢,而簡單查詢應保留在一行中。例:
SELECT a.field_name1, a.field_name2, COUNT(a.field3) AS cnt, b.*
FROM table1 AS a
LEFT JOIN table2 AS b ON (a.key_field = b.key_field)
RIGHT JOIN table3 AS c ON (a.key_field2 = c.key_field2)
WHERE a.field7 = 'something here' AND b.field9 = '45'
GROUP BY a.field_name1
ORDER BY a.field_name2 DESC, b.field8
HAVING cnt > 5
逃
始終在 WHERE 中轉義值,即使值爲整數
查詢中的 PHP 變量
PHP 變量必須在查詢之前定義並轉義。
避免:
\(q = "SELECT * FROM users WHERE email='"._escape(\)_POST['email'])."' ";
用:
\(email = _escape(\)_POST['email']);
if (empty(\(email))
{
return false;
}
\)q = "SELECT * FROM users WHERE email='{$email}' ";
附錄
PHPMyAdmin
儘量避免使用 PHP 我的管理員創建表,因爲它存在默認值問題。它是瀏覽和簡單數據庫操作的絕佳產品,但它會讓您懶惰,並且您通常會忘記保留表更改和其他更改的歷史記錄。