[數據庫]關於設計表時應該注意的問題
如有錯誤歡迎大家指出。這段時間在家裏,做了點修正。
1、慎重選擇表名。
有兩種選擇:
按照多數開發語言的命名規則。比如(myCustomer)。
按照多數開源思想命名規則。比如(my_customer)。
按照咱們中國人的思想。比如(我的客戶)。
第一種有個缺點,很容易忘掉大寫的字母。
第二種則比較好,每個WORD間用下劃線連接,避免遺忘。
第三種建議不要用,雖然很好記。不覺得解析這個表的時候還需要編碼轉化嗎?我個人理解,大家可以補充。
2. 關於編碼的設定。
A. GBK/GB2312.(適用於純中文存儲)。
B. UTF8.(適用於中英文混合存儲)。
C. LATIN1。(適用於純英文存儲)。
D. 其他的。
3. 關於表引擎的選擇。
A. MYISAM.(很多人說她的表級鎖定會帶來好多問題,其實隻要設計好對應的表以及寫好對應的SQL查詢就沒有那麼大的問題。)
B. INNODB. (如果要用到事務,選擇她不會錯。至於多數人講的MASTER/SLAVE結構上用INNODB在MASTER的選擇是否正確,就要看你怎麼用了。不能一味的瘋狂使用INNODB。除非你想要確保非常高可用性,
)
C. CSV. (以前我寫過文章,關於這個引擎。個人覺得最主要的是來存儲少量數據以及從EXCEL到MYSQL的轉換方麵會很有用。當然隻要涉及到規則數據的導入,她就可以辦到。)
D. BLACKHOLE. (覺得最完美的用處在於MASETR/SLAVE上麵,並且MASTER是一個臨時的專門負責寫的機器。不過缺點也很多,會與MYISAM或者INNODB或者其他的引擎有所衝突,這點自己要做個權衡)。
E. MEMORY. (應該說是MYISAM的兄弟了。不過在讀內存總比讀磁盤的速度要快。不過要注意,它不支持動態數據類型)。
F. FEDERATED. (典型的分布式引擎。我以前文章中有介紹。)
G. NDB。(網絡版存儲引擎。因為Replication 總是有延遲,所以如果係統容不得任何延遲,就用這個吧。)
H. FOLCON。(6.0後用來代替INNODB的引擎。)
H. FOLCON。(6.0後用來代替INNODB的引擎。)
I. 其他舊的以及新開發的引擎具體介紹:https://dev.mysql.com/doc/refman/6.0/en/storage-engines.html)。
4. 關於屬性數據類型的選擇。
A. INT(一個字節的TINYINT,兩個字節的SMALLINT,三個字節的MEDIUMINT,四個字節的INT,8個字節的BIGINT。記住:UNSIGNED不管你定義或者不定義,都不影響內部的存儲字節大小)
B. 少於10個字符用CHAR是在合適不過了。(不過要記住在MEMORY引擎裏麵會自動把VARCHAR轉化為CHAR)
C. 我一般用DECIMAL或者NUMERIC來代替FLOAT 或者DOUBLE。因為老板要求精確的數字。如果不要求精確的,那就用FLOAT吧。速度快,占空間小。(DECIMA、FLOAT(P)是動態存儲。比如
ECIMAL(10,2)占用5個字節。FLOAT占4個字節,)

D. BLOB,TEXT,VARCHAR(一般存放文章內容,特別是新聞網站。需要的字節數是所存儲的字符長度+1。記住BLOB和VARCHAR是TEXT和CHAR的BINARY類型)
E. ENUM(在一定範圍內絕佳的代替VARCHAR和CHAR的工具,因為她隻占一到兩個字節。)
F. 時間和日期類型(占3個字節的DATE,8個字節的DATETIME,4個字節的TIMESTAMP,3個字節的TIME,1個字節的YEAR。)。如果要存儲比如‘1983’這樣的年份,用YEAR明顯比VARCHAR或者CHAR要節省空間。因為後者要占5個字節。
G. BOOLEAN(用來存儲YES或者NO之類的值,占用一個字節。)
H. 關於自增字段。目前我們的項目中涉及到好多ORDER BY RAND()操作。此類語句在數據庫並發大的時候會造成CPU嚴重阻塞,持續產生數據庫死鎖!解決此類問題最好的辦法就是利用自增字段,用程序隨即生成數字序列,或者在數據庫端隨即生成數字序列。
I. 關於ZEROFILL。非常好用的前置填補0的存儲,而不是用用對應個數的空串來代替。在需要前置補零的操作中INT ZEROFILL可以用來代替CHAR或者VARCHR。
5. 關於默認值。
A. 在5.0之後,隻要設定字段為NOT NULL,係統自動給出默認值。對應CHAR->’’,INT->0,BOOLEAN->0等等。
B. 在5.0之前的版本,需要手動指定默認值,否則會出現一定的異常。到時候查都不好查了。
6. 關於多數據庫建立。
A. 應該把對應的業務放在各自不同的數據庫裏,而不是所有業務放到一個庫裏麵。
B. 數據庫的命名和表命名一樣。
7. 關於索引。
A. 設計表初期盡量考慮到應該建立的索引。所有建立的索引一定要測試一下,看是否有必要,否則會翻倍的減少寫數據的性能。
B. 對於隻有存儲0或者1的列,盡量幹掉索引,單獨分出兩個表。一個代替0,另外一個代替1。或者在一個字段裏麵用EMUM或者CHAR(0)或者CHAR(1)來代替。
PS: 最後一個要值得注意的,就是盡量所有的字段用NOT NULL。雖然MYSQL可以對NULL列進行索引,不過我不建議。
最後更新:2017-04-03 12:56:43