### 設計基礎
> 1.關系型數據庫設計
**關系**
即一對一關聯的實現方式是用外鍵,多對一關聯的實現方式也是用外鍵,多對多關聯的實現方式是用中間表。
**建表**
1.自增主鍵一般都需要設置(`id` int unsigned NOT NULL AUTO_INCREMENT);
2.不定長字符串長度使用varchar類型,需要考慮實際業務最長長度的基礎上擴容20%到40%為宜,且長度取2的指數長為宜(64,128,256等);
3.定長長度使用char類型,長度直接取實際長度即可,類似于手機號字段;
4.所有字段除了軟刪除字段(delete_time),都需要設置為not null,并且設置默認值(字符串默認值為'',整型默認值為0);
5.基本所有的字段,表名都加上備注,除了自增主鍵,創建時間,更新時間之類的通用字段。
6.表結構需指定存儲引擎,默認字符集。
7.關于索引的創建,建議只創建其它表在這個的表的外鍵和查詢頻繁的字段。其它字段在業務擴展時我會及時跟進并設定。
8.表名和字段名以英文加下劃線隔分,字段中英文單詞以不超過三個單詞為宜。
> 更多
(1)狀態字段設置為tinyint,同時備注寫清楚不同數字代表的類型。
(2)時間字段都是存時間戳,以整形為宜。
* * * * *
> **如何選擇存儲引擎?**
關于這個問題,我們需要考慮每個存儲引擎提供了哪些不同的核心功能,一般把這些核心功能分為4類:**支持的字段**和**數據類型**、**鎖定類型**、**索引**和**事務處理。**
支持的字段和數據類型
雖然所有這些引擎都支持通用的數據類型,例如整型、實型和字符型等,但是,并不是所有的引擎都支持其它的字段類型,特別是BLOG(二進制大對象)或者TEXT文本類型。
鎖定類型
鎖定機制主要是為了防止多個處理同時更新同一個數據。不同的存儲引擎支持不同級別的鎖定:表鎖定、頁鎖定和行鎖定。
表鎖定:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,并發度最低。支持最多的就是表鎖定,MyISAM和MEMORY支持這種鎖定。MySQL的表級鎖有兩種模式:表共享讀鎖和表獨占寫鎖。對MyISAM表的讀操作,不會阻塞其他用戶對同一表的讀請求,但會阻塞對同一表的寫請求;對MyISAM表的寫操作,則會阻塞其他用戶對同一表的讀和寫操作;MyISAM表的讀操作與寫操作之間,以及寫操作之間是串行的!
行鎖定:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發度也最高。InnoDB表進行行級鎖定。
頁鎖定:開銷和加鎖時間界于表鎖和行鎖之間;會出現死鎖;鎖定粒度界于表鎖和行鎖之間,并發度一般。BerkeleyDB引擎支持頁鎖定。
索引
建立索引在搜索和恢復數據庫中的數據的時候能夠顯著提高性能。不同的存儲引擎提供不同的制作索引的技術。有些存儲引擎根本不支持索引。
事務處理
事務處理功能通過提供在向表中更新和插入信息期間的可靠性。
* * * * *