一煞躬、邏輯設(shè)計
1.范式設(shè)計
(1)數(shù)據(jù)范式設(shè)計一
- 數(shù)據(jù)庫表中的所有字段都只具有單一屬性
- 單一屬性的列是由基本的數(shù)據(jù)類型所構(gòu)成
- 表是簡單的二維表
如:
錯誤的范式
字段name-age不是單一屬性
id | name-age |
---|---|
1 | xiaoming-18 |
正確的范式
id | name | age |
---|---|---|
1 | xiaoming | 18 |
(2)數(shù)據(jù)范式設(shè)計二
- 表中只存在一個業(yè)務(wù)逐漸,而不能存在非主鍵列只對部分主鍵的依賴關(guān)系。
錯誤范式:產(chǎn)品與訂單的ID沒有直接的關(guān)聯(lián)關(guān)系
產(chǎn)品表
id | name |
---|---|
1 | 游戲機(jī) |
2 | 手機(jī) |
訂單表
id | address | prd_id |
---|---|---|
1 | 北京 | 1 |
2 | 上海 | 1 |
正確范式:
產(chǎn)品表
id | name |
---|---|
1 | 游戲機(jī) |
2 | 手機(jī) |
訂單表
id | address |
---|---|
1 | 北京 |
2 | 上海 |
訂單中間表
id | order_id | prd_id |
---|---|---|
1 | 1 | 1 |
2 | 2 | 1 |
(3)數(shù)據(jù)范式設(shè)計三
- 非主鍵列不能依賴其他表的非主鍵列。
錯誤范式:
訂單與客戶姓名關(guān)聯(lián)
訂單與客戶編號關(guān)聯(lián)
客戶姓名和客戶編號關(guān)聯(lián)季率。
不應(yīng)該將客戶編號和客戶姓名存放在訂單中漾稀,如果修改用戶表中的姓名和編號修改
則需要對訂單中的客戶編號和姓名進(jìn)行修改。
id | address | 客戶姓名 | 客戶編號 |
---|---|---|---|
1 | 北京 | 小明 | bj123 |
2 | 上海 | 如花 | sh123 |
2.反范式設(shè)計
- 反范化設(shè)計為了提高范式化導(dǎo)致性能和讀取的效率問題攀唯,從而適當(dāng)?shù)膶?shù)據(jù)范式設(shè)計進(jìn)行違反。
- 通過少量的冗余數(shù)據(jù)渴丸,提高讀取效率和性能上的問題侯嘀,這種方式就是空間換時間。
3.范式化與反范式化的優(yōu)缺點
范式設(shè)計
優(yōu)點:
- 盡可能減少數(shù)據(jù)的冗余
- 范式化比反范式化的更新操作更快
- 范式化的表比反范式化的表更小谱轨。
缺點: - 對于表的查詢需要對多個表進(jìn)行關(guān)聯(lián)
- 更難進(jìn)行索引優(yōu)化
反范式設(shè)計
優(yōu)點:
- 減少表的關(guān)聯(lián)
- 可以更好的進(jìn)行索引的優(yōu)化
缺點: - 存在數(shù)據(jù)冗余和冗余數(shù)據(jù)的維護(hù)
- 多數(shù)據(jù)的修改需更多的成本去處理
二戒幔、物理設(shè)計
(1)物理設(shè)計的過程
- 定義數(shù)據(jù)、表和字段的命名規(guī)范
- 選擇合適的存儲引擎
- 字段選擇適合的數(shù)據(jù)類型
- 根據(jù)業(yè)務(wù)設(shè)計合理表和表之間的關(guān)聯(lián)關(guān)系
- 建立數(shù)據(jù)庫結(jié)構(gòu)
(2)命名規(guī)范
- 數(shù)據(jù)庫土童、 表诗茎、字段必須遵循可讀性原則。
- 數(shù)據(jù)庫献汗、 表敢订、字段必須遵循表意性原則,表的名字能夠描述表的功能罢吃、模塊等楚午。
- 數(shù)據(jù)庫、 表尿招、字段必須遵循長名原則矾柜,盡可能的少用縮寫的名字。
- 數(shù)據(jù)庫泊业、 表把沼、字段應(yīng)使用英文或者拼音的專有名詞。不要使用拼音吁伺。
(3)存儲引擎的選擇
對比項 | MyISAM | InnoDB |
---|---|---|
主外鍵 | 不支持 | 支持 |
事務(wù) | 不支持 | 支持 |
行表鎖 | 表鎖饮睬,不適合高并發(fā)操作 | 行鎖,適合高并發(fā)操作 |
緩存 | 緩存索引篮奄,不緩存查詢的數(shù)據(jù) | 不僅緩存索引捆愁,還會緩存查詢數(shù)據(jù),對內(nèi)存要求較高窟却,而且內(nèi)存的大小會對性能造成影響 |
表空間 | 小昼丑,因為MyISAM會壓縮 | 大 |
關(guān)注點 | 性能 | 事務(wù) |
表級鎖:開銷小,加鎖快夸赫;不會出現(xiàn)死鎖菩帝;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。
行級鎖:開銷大呼奢,加鎖慢宜雀;會出現(xiàn)死鎖;鎖定粒度最小握础,發(fā)生鎖沖突的概率最低,并發(fā)度也最高辐董。
頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現(xiàn)死鎖禀综;鎖定粒度界于表鎖和行鎖之間简烘,并發(fā)度一般。
僅從鎖的角度來說:
表級鎖更適合于以查詢?yōu)橹鞫希挥猩倭堪此饕龡l件更新數(shù)據(jù)的應(yīng)用孤澎。
行級鎖則更適合于有大量按索引條件并發(fā)更新少量不同數(shù)據(jù),同時又有并發(fā)查詢的應(yīng)用依鸥,如一些在線事務(wù)處理系統(tǒng)亥至。
(4)數(shù)據(jù)類型的選擇
- 優(yōu)先考慮使用數(shù)字類型
- 其次日期和時間類型
- 最后字符串類型
- 對于相同級別的數(shù)據(jù)類型,優(yōu)先考慮使用占用空間較少的數(shù)據(jù)類型贱迟。
- 對精度有要求的時候,選擇精度高的數(shù)據(jù)類型絮供。 int<float<double<decimal.
datetime 與timestamp 都是日期類型衣吠,datetime與時區(qū)無關(guān),而timestamp與時區(qū)有關(guān)壤靶。timestamp本質(zhì)是使用int進(jìn)行存儲缚俏。所以效率會比datetime高。但是要考慮時區(qū)的問題贮乳。