MySQL学习笔记(6)之设计范式
設(shè)計范式(NF?=?Normal?Format)
范式:規(guī)范的格式。
范式是設(shè)計關(guān)系數(shù)據(jù)庫必須遵守的規(guī)則。
如果我們滿足了設(shè)計范式的要求,則數(shù)據(jù)庫會簡潔,結(jié)構(gòu)清晰。
反之,會出現(xiàn)數(shù)據(jù)冗余,還有插入、刪除、修改數(shù)據(jù)出現(xiàn)異常。
?
?設(shè)計范式種類:1NF、2NF、3NF、BCNF(巴德斯科范式)、4NF、5NF(完美范式)。
1NF是最寬松的,依次遞增限制越大。
一般數(shù)據(jù)庫只需要滿足到3NF就可以了。
?
1、1NF(第一范式):字段的原子性
要求:數(shù)據(jù)是二維表,每一列都不能在分割,屬性不能再分割,字段保證原子性。
不滿足1NF的數(shù)據(jù)庫,則為非關(guān)系型數(shù)據(jù)庫。
不滿足1NF的2個例子:
| name | tel | age |
| 小明 | 13988774444,011-15945612 | 1 |
| 小紅 | 16812314725 | 0 |
| name | 手機,座機 | age |
| 小明 | 13988774444,011-15945612 | 1 |
| 小紅 | 16812314725,無 | 0 |
解決辦法:
| name | 手機 | 座機 | age |
| 小明 | 13988774444 | 011-15945612 | 1 |
| 小紅 | 16812314725 | 無 | 0 |
2、2NF(第二范式):消除部分(不完全)依賴
要求:滿足1NF的前提下,消除字段對主鍵的部分依賴,從而完全依賴于主鍵。
依賴:如果字段A一旦確定,則可以指出B字段的值。
部分(不完全)依賴:依賴其中某個部分的值。
????
????????不滿足2NF的例子:
學生 | 課程 | 老師姓名 | 老師學歷 | 課程教材 | 上課教室 | 上課時間 |
| 小明 | 二年級語文上 | 張三 | 研究生 | 二年級語文上冊 | 102 | 8:00 |
| 小紅 | 五年級數(shù)學上 | 李四 | 博士 | 五年級數(shù)學上冊 | 306 | 16:00 |
????????一個課程,一定指定了某個教材,一年級語文上肯定用的是《一年級語文上冊》,那么就有課程推出教材。課程決定了教材,這就叫做部分依賴。
????????解決辦法,拆分成二個或者若干個表:
| 學生 | 課程 | 老師 | 老師學歷 | 上課教室 | 上課時間 |
| 小明 | 二年級語文上 | 張三 | 研究生 | 102 | 8:00 |
| 小紅 | 五年級數(shù)學上 | 李四 | 博士 | 306 | 16:00 |
課程 | 教材 |
| 二年級語文上 | 二年級語文上冊 |
| 五年級數(shù)學上 | 五年級數(shù)學上冊 |
3、3NF:消除傳遞依賴
要求:滿足2NF的前提下消除傳遞依賴。
當表里存在不只一類獨立實體,數(shù)據(jù)也可能存在冗余,在插入、修改、刪除、時可能出現(xiàn)混亂的情況。
?
↓解決辦法:拆分成3個表,利用主鍵建立關(guān)系。
學生學號 | 學生姓名 | 學生課程 | 教師 |
| 110 | 小明 | 001 | 578 |
| 911 | 小紅 | 005 | 561 |
課程ID | 課程名稱 | 教材名稱 |
001 | 二年級語文上 | 二年級語文上冊 |
005 | 五年級數(shù)學上 | 五年級數(shù)學上冊 |
教師ID | 老師姓名 | 老師學歷 |
| 578 | 張三 | 研究生 |
| 561 | 李四 | 博士 |
4、BC范式(BCNF):符合3NF,并且主屬性不依賴于主屬性。
若關(guān)系模式屬于第一范式,且每個屬性都不傳遞依賴于鍵碼,則R屬于BC范式。
通常:BC范式的條件有多種等價的表述:每個非平凡依賴的左邊必須包含鍵碼;每個決定因素必須包含鍵碼。
BC范式既檢查非主屬性,又檢查主屬性。當只檢查非主屬性時,就成了第三范式。滿足BC范式的關(guān)系都必然滿足第三范式。
還可以這么說:若一個關(guān)系達到了第三范式,并且它只有一個候選碼,或者它的每個候選碼都是單屬性,則該關(guān)系自然達到BC范式。
一般,一個數(shù)據(jù)庫設(shè)計符合3NF或BCNF就可以了。在BC范式以上還有第四范式、第五范式。
?
?
5、第四范式:要求把同一表內(nèi)的多對多關(guān)系刪除。
?
6、第五范式:從最終結(jié)構(gòu)重新建立原始結(jié)構(gòu)。
轉(zhuǎn)載于:https://blog.51cto.com/chenhaolinux/1710794
總結(jié)
以上是生活随笔為你收集整理的MySQL学习笔记(6)之设计范式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 行业板块和概念板块有什么区别
- 下一篇: 羊都哪里去了?