目錄
- 范式定義
- 第一范式
- 第二范式
- 第三范式
- 反范式
范式定義
范式:Normal Format,是一種離散數學中的知識,是為了解決資料的存盤與優化的問題:保存資料的存盤之后,凡是能夠通過關系尋找出來的資料,堅決不再重復存盤,終極目標是為了減少資料的冗余,
范式背景:
1、是為了解決資料冗余
2、是為了資料的優化與存盤
3、保存資料之后,可以通過關系得到的資料,不再存盤
范式概念:
1、是一種分層結構的規范,分為6層
2、每一層都比上一層更嚴格
3、若要滿足下一層范式,前提是滿足上一層
4、范式在資料庫中具有指導意義,但是不強制規范
5、資料庫不僅要考慮空間問題,還要考慮效率問題,一般用前第三層
6、六層范式, 1NF是最底層,要求最低;6NF最高層,最嚴格.
目前關系資料庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又稱完美范式),一般說來,資料庫只需滿足第三范式(3NF)就行了,
第一范式:確保每一列不可再分
要求
1、在設計表存盤資料時候,如果表中設計的欄位存盤的資料,在取出來使用之前還需要額外的處理(拆分),那么表的設計不滿足第一范式
2、第一范式要求欄位具有原子性、不可再分割
例如:
講師代課表
| 講師 | 性別 | 班級 | 教室 | 代課時間 | 代課時間(開始/結束) |
|---|---|---|---|---|---|
| 朱元璋 | Male | php0226 | D302 | 30天 | 2014-02-27,2014-05-05 |
| 朱元璋 | Male | Php0320 | D206 | 30天 | 2014-03-21,2014-04-20 |
| 朱元璋 | Female | Php0320 | D206 | 30天 | 2014-06-01,2014-06-15 |
上表設計不存在問題: 但是如果需求是將資料查出來之后,要求顯示一個老師從什么時候開始上課,到什么時候結課:, 則需要將代課時間進行拆分: 不符合1NF, 資料不具有原子性, 可以再拆分.
解決方案
解決方案: 將代課時間拆分成兩個欄位就解決問題.
| 講師 | 性別 | 班級 | 教室 | 代課時間 | 開始 | 結束 |
|---|---|---|---|---|---|---|
| 朱元璋 | Male | php0226 | D302 | 30天 | 2014-02-27 | 2014-05-05 |
| 朱元璋 | Male | Php0320 | D206 | 30天 | 2014-03-21 | 2014-04-20 |
| 花木蘭 | Female | Php0320 | D206 | 30天 | 2014-06-01 | 2014-06-15 |
第二范式:確保表中每一列都和主鍵有關
要求
1、在資料表設計程序中,如果有復合主鍵(多欄位主鍵),且表中有欄位并不是由整個主鍵來確定,而是依賴于主鍵中的某個欄位(主鍵的部分)
2、存在欄位依賴主鍵的部分的問題,稱之為部分依賴
3、第二范式就是解決表設計不允許出現部分依賴
講師帶課表
| 講師 | 性別 | 班級 | 教室 | 代課時間 | 開始 | 結束 |
|---|---|---|---|---|---|---|
| 朱元璋 | Male | php0226 | D302 | 30天 | 2014-02-27 | 2014-05-05 |
| 朱元璋 | Male | Php0320 | D206 | 30天 | 2014-03-21 | 2014-04-20 |
| 花木蘭 | Female | Php0320 | D206 | 30天 | 2014-06-01 | 2014-06-15 |
復合主鍵: 講師+班級
以上表中: 代課時間,開始和結束欄位都與當前的主鍵(講師和班級)有關系, 但是性別并不依賴班級, 教室不依賴講師, 性別只依賴講師, 教室只依賴班級, 出現了性別和教室依賴主鍵中的一部分: 部分依賴.不符合第二范式.
解決方案
解決方案1: 可以將性別與講師單獨成表, 班級與教室也單獨成表.
解決方案2: 取消復合主鍵, 使用邏輯主鍵
- 邏輯主鍵:沒有業務含義,比如自增主鍵
- 業務主鍵:有業務含義,比如person表用身份證號當主鍵
| ID | 講師 | 性別 | 班級 | 教室 | 代課時間 | 開始 | 結束 |
|---|---|---|---|---|---|---|---|
| 1 | 朱元璋 | Male | php0226 | D302 | 30天 | 2014-02-27 | 2014-05-05 |
| 2 | 朱元璋 | Male | Php0320 | D206 | 30天 | 2014-03-21 | 2014-04-20 |
| 3 | 花木蘭 | Female | Php0320 | D206 | 30天 | 2014-06-01 | 2014-06-15 |
第三范式:確保每一列都和主鍵列直接相關,而不是間接相關
要求
1、要滿足第三范式、必須滿足第二范式
2、理論上講,應該一張表中的所有欄位都應該直接依賴于主鍵,如果表設計中存在一個欄位,并不直接依賴主鍵,而是通過某個非關鍵欄位依賴,最終實作依賴主鍵,把這種不是直接依賴主鍵,而是依賴非主鍵欄位的依賴關系稱之為傳遞依賴
3、第三范式就是解決傳遞依賴的問題
講師帶課表
| ID | 講師 | 性別 | 班級 | 教室 | 代課時間 | 開始 | 結束 |
|---|---|---|---|---|---|---|---|
| 1 | 朱元璋 | Male | php0226 | D302 | 30天 | 2014-02-27 | 2014-05-05 |
| 2 | 朱元璋 | Male | Php0320 | D206 | 30天 | 2014-03-21 | 2014-04-20 |
| 3 | 花木蘭 | Female | Php0320 | D206 | 30天 | 2014-06-01 | 2014-06-15 |
主鍵: ID
以上設計方案中: 性別依賴講師存在, 講師依賴主鍵; 教室依賴班級,班級依賴主鍵: 性別和教室都存在傳遞依賴.
解決方案
將存在傳遞依賴的欄位,以及依賴的欄位本身單獨取出,形成一個單獨的表, 然后在需要對應的資訊的時候, 使用對應的物體表的主鍵加進來.
講師帶課表
| ID | 講師ID | 班級ID | 代課時間 | 開始 | 結束 |
|---|---|---|---|---|---|
| 1 | 1 | 5 | 30天 | 2014-02-27 | 2014-05-05 |
| 2 | 1 | 6 | 30天 | 2014-03-21 | 2014-04-20 |
| 3 | 2 | 6 | 30天 | 2014-06-01 | 2014-06-15 |
講師表
| ID | 講師 | 性別 |
|---|---|---|
| 1 | 朱元璋 | Male |
| 2 | 花木蘭 | Femle |
教室表
| ID | 講師 | 性別 |
|---|---|---|
| 5 | php0226 | D302 |
| 6 | Php0320 | D206 |
反范式
有時候,在設計表的時候,如果一張表中有幾個欄位需要從另外的表中去獲取資訊,理論上講,的確可以獲得想要的資料,但是效率低一點,會刻意的在某些表中,不去保存另外表的主鍵,而是直接保存想要的資料資訊,這樣一來,在查詢資料的時候,一張表可以直接提供資料,而不需要多表查詢((效率低),但是冗余會增加
站在巨人的肩膀上摘蘋果:
https://www.cnblogs.com/hum0ro/p/8877364.html
https://blog.csdn.net/weixin_43048795/article/details/88564962
https://www.jianshu.com/p/2a7242e3d21a
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/68460.html
標籤:MySQL
