第一部分 設(shè)計(jì)庫設(shè)計(jì)流程
一個(gè)完整的數(shù)據(jù)庫設(shè)計(jì)流程包含以下四個(gè)組成部分:需求分析、邏輯設(shè)計(jì)隘世、物理設(shè)計(jì)和維護(hù)優(yōu)化
需求分析
需求分析主要的任務(wù)是分析:
- 數(shù)據(jù)是什么
- 數(shù)據(jù)有哪些屬性
- 數(shù)據(jù)和屬性各自的特點(diǎn)有哪些
邏輯設(shè)計(jì)
邏輯設(shè)計(jì)就是使用ER圖對(duì)數(shù)據(jù)庫進(jìn)行邏輯建模
一個(gè)簡(jiǎn)單的例子如下:
圖中:矩形表示實(shí)體集甜紫,菱形表示聯(lián)系集囱井,橢圓表示實(shí)體的屬性忆畅,線段將屬性連接到實(shí)體集或?qū)?shí)體集連接到聯(lián)系集
物理設(shè)計(jì)
根據(jù)數(shù)據(jù)庫自身的特點(diǎn)將邏輯設(shè)計(jì)轉(zhuǎn)換為物理設(shè)計(jì)
維護(hù)優(yōu)化
主要任務(wù)包括:
- 新的需求進(jìn)行建表
- 索引優(yōu)化
- 大表拆分
第二部分 數(shù)據(jù)庫設(shè)計(jì)范式
常見的數(shù)據(jù)庫設(shè)計(jì)范式包括:第一范式犁功,第二范式氓轰,第三范式及BC范式,這是目前我們大多數(shù)數(shù)據(jù)庫設(shè)計(jì)所要遵循的范式浸卦。
在了解范式之前署鸡,我們有必要了解一下數(shù)據(jù)操作異常及數(shù)據(jù)冗余的定義。
- 插入異常:如果某實(shí)體隨著另一個(gè)實(shí)體的存在而存在,即缺少某個(gè)實(shí)體時(shí)無法表示這個(gè)實(shí)體储玫,那么這個(gè)表就存在插入異常
- 更新異常:如果更改表所對(duì)應(yīng)的某個(gè)實(shí)體市里的單獨(dú)屬性時(shí)侍筛,需要將多行更新,那么就說這個(gè)表存在更新異常
- 刪除異常:如果刪除表的某一行來反映某實(shí)體實(shí)例失效時(shí)導(dǎo)致另一個(gè)不同實(shí)體實(shí)例信息丟失撒穷,那么這個(gè)表就存在刪除異常
第一范式(1NF)
定義:數(shù)據(jù)庫表中的所有字段都是單一屬性匣椰,不可再分的。
1NF是所有關(guān)系型數(shù)據(jù)庫的最基本要求端礼,你在關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)禽笑,例如SQL Server,Oracle蛤奥,MySQL中創(chuàng)建數(shù)據(jù)表的時(shí)候佳镜,如果數(shù)據(jù)表的設(shè)計(jì)不符合這個(gè)最基本的要求,那么操作一定是不能成功的凡桥。
第二范式(2NF)
定義:數(shù)據(jù)庫的表中不存在非關(guān)鍵字段對(duì)任一候選關(guān)鍵字段的部分函數(shù)依賴蟀伸。
部分函數(shù)依賴是指存在著組合關(guān)鍵字中的某一關(guān)鍵字決定非關(guān)鍵字的情況。
換句話說:所有單關(guān)鍵字段的表都符合第二范式缅刽。
舉一個(gè)簡(jiǎn)單的例子:
第三范式(3NF)
定義:第三范式是在第二范式的基礎(chǔ)上定義的啊掏,如果數(shù)據(jù)表中不存在非關(guān)鍵字段對(duì)任意候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。
舉一個(gè)簡(jiǎn)單的例子:
Boyce.Codd范式(BCNF)
定義:在第三范式的基礎(chǔ)之上衰猛,數(shù)據(jù)庫表中如果不存在任何字段對(duì)任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合BC范式迟蜜。
也就是說如果是復(fù)合關(guān)鍵字,則復(fù)合關(guān)鍵字之間也不能存在函數(shù)依賴關(guān)系
舉一個(gè)簡(jiǎn)單的例子:
第三部分 物理設(shè)計(jì)細(xì)節(jié)(以MySql為例)
物理設(shè)計(jì)要做什么
- 選擇合適的數(shù)據(jù)庫管理系統(tǒng)
- 定義數(shù)據(jù)庫啡省、表及字段的命名規(guī)范
- 根據(jù)所選的DBMS系統(tǒng)選擇合適的字段類型
- 反范式設(shè)計(jì)
MySql 物理設(shè)計(jì)
1娜睛、MySql常用的存儲(chǔ)引擎
2、字段類型的選擇原則
常見類型存儲(chǔ)占用空間:
通用原則:
在對(duì)數(shù)據(jù)進(jìn)行比較(查詢條件卦睹、JOIN條件及排序)操作時(shí)畦戒,同樣的數(shù)據(jù),字符處理往往比數(shù)字處理慢分预。
在數(shù)據(jù)庫中兢交,數(shù)據(jù)處理以頁為單位薪捍,列的長度越小笼痹,利于性能提升。
char與varchar如何選擇:
- 如果列中存儲(chǔ)的數(shù)據(jù)長度差不多是一致的酪穿,則應(yīng)該考慮用char凳干;否則應(yīng)該考慮用varchar
- 如果列中最大的數(shù)據(jù)長度小于50字節(jié),則一般也考慮用char
- 一般不宜定義大于50字節(jié)的char類型列
decimal與float如何選擇:
- decimal用于存儲(chǔ)精確數(shù)據(jù)被济,而float只能用于存儲(chǔ)非精確數(shù)據(jù)救赐。故精確數(shù)據(jù)只能選擇用decimal類型。
- 由于float的存儲(chǔ)空間開銷一般比decimal小(精確到7位小數(shù)只需要4字節(jié)经磅,精確到15位小數(shù)只需要8字節(jié))泌绣,故非精確數(shù)據(jù)優(yōu)先選擇float類型
時(shí)間類型的選擇:
使用int來存儲(chǔ)時(shí)間字段的優(yōu)點(diǎn)是比datetime小,但使用不方便要進(jìn)行轉(zhuǎn)換预厌,限制是只能存儲(chǔ)到2038-1-19 11:14:07 即2^32
3阿迈、其它注意事項(xiàng)
如何選擇主鍵:
- 區(qū)分業(yè)務(wù)主鍵和數(shù)據(jù)庫主鍵:業(yè)務(wù)主鍵用于標(biāo)識(shí)業(yè)務(wù)數(shù)據(jù),進(jìn)行表與表之間的關(guān)聯(lián)轧叽;數(shù)據(jù)庫主鍵為了優(yōu)化數(shù)據(jù)存儲(chǔ)(沒有的話苗沧,Innodb會(huì)生成6個(gè)字節(jié)的隱含主鍵)
- 跟蹤數(shù)據(jù)庫的類型,考慮主鍵是否要順序增長
- 主鍵的字段類型所占空間要盡可能的小
避免使用外鍵約束:
- 降低數(shù)據(jù)導(dǎo)入效率
- 增加維護(hù)成本
- 雖然不建議使用外鍵約束炭晒,但是相關(guān)聯(lián)的列上一定要建立索引
避免使用觸發(fā)器:
- 降低數(shù)據(jù)導(dǎo)入的效率
- 可能會(huì)出現(xiàn)意想不到的數(shù)據(jù)異常
- 使業(yè)務(wù)邏輯變得復(fù)雜
關(guān)于預(yù)留字段:
- 無法準(zhǔn)確的指導(dǎo)字段的類型
- 無法準(zhǔn)確的指導(dǎo)預(yù)留字段中所存儲(chǔ)的內(nèi)容
- 后期維護(hù)預(yù)留字段所要的成本待逞,同增加一個(gè)字段所需要的成本是相同的
- 嚴(yán)禁使用預(yù)留字段
4、反范式設(shè)計(jì)
反范式設(shè)計(jì)的原因:
- 減少表的關(guān)聯(lián)數(shù)量
- 增加數(shù)據(jù)的讀取數(shù)量
- 反范式一定要適度
第四部分 維護(hù)優(yōu)化細(xì)節(jié)
1网严、維護(hù)與優(yōu)化要做什么
- 維護(hù)數(shù)據(jù)字典
- 維護(hù)索引
- 維護(hù)表結(jié)構(gòu)
- 在適當(dāng)?shù)臅r(shí)候?qū)Ρ磉M(jìn)行水平拆分或垂直拆分
2识樱、如何維護(hù)數(shù)據(jù)字典
- 利用第三方工具對(duì)數(shù)據(jù)字典進(jìn)行維護(hù)
- 利用數(shù)據(jù)庫本身的備注字段來維護(hù)數(shù)據(jù)字典
3、如何維護(hù)索引
如何選擇合適的列建立索引:
- 出現(xiàn)在WHERE從句震束,GROUP BY從句中的列
- 可選擇性高的列要放到索引的前面
- 索引中不要包含太長的數(shù)據(jù)類型
注意事項(xiàng):
- 索引并不是越多越好牺荠,過多的索引不但會(huì)降低寫效率而且會(huì)降低讀的效率
- 定期維護(hù)索引碎片
- 在SQL語句中不要使用強(qiáng)制索引關(guān)鍵字
4、如何維護(hù)表結(jié)構(gòu)
- 使用在線變更表結(jié)構(gòu)的工具:MySQL5.5之前可以使用pt-online-schema-change驴一,MySQL5.6之后本身支持在線表結(jié)構(gòu)的變更
- 同時(shí)對(duì)數(shù)據(jù)字典進(jìn)行維護(hù)
- 控制表的寬度和大小
5休雌、數(shù)據(jù)庫中適合的操作
- 批量操作VS逐條操作
- 禁止使用SELECT * 這樣的查詢
- 控制使用用戶自定義函數(shù)
- 不要使用數(shù)據(jù)庫中全文索引
6、表的垂直拆分
7肝断、表的水平拆分
參考網(wǎng)站: