範式:Normal Format,是一種離散數學中的知識,是爲了解決數據的存儲與優化的問題:保存數據的存儲以後,凡是可以經過關係尋找出來的數據,堅定再也不重複存儲,終極目標是爲了減小數據的冗餘。
範式:是一種分層結構的規範,分爲六層,每一層都比上一層更加嚴格,若要知足下一層範式,前提是知足上一層範式。
六層範式:1NF,2NF,….6NF。 6NF最高層,最嚴格
MySql屬於關係型數據庫:有空間浪費,與範式所解決的問題不謀而合:在設計數據庫的時候,會利用到範式來指導設計。
可是數據庫不單是要解決空間問題,還要保證效率問題。範式只爲解決空間問題,因此數據庫的設計又不可能徹底按照範式的要求實現,通常狀況下,只有前三種範式須要知足。
範式在數據庫的設計當中是有指導意義,可是不是強制規範。數據庫
第一範式:在設計表存儲數據的時候,若是表中設計的字段存儲的數據,在取出來使用以前,還須要額外的處理(拆分),那麼說表的設計不知足第一範式,第一範式要求字段的數據就有原子性:不可再分。優化
第二範式:在數據表設計的過程當中,若是有複合主鍵(多字段主鍵),且表中有字段並非由整個主鍵來肯定,而是依賴主鍵中的某個字段(主鍵的部分):存在字段依賴主鍵的部分的問題,稱之爲部分依賴,第二範式就是解決表不容許出現部分依賴。
spa
以上表中:由於講師沒有辦法做爲獨立主鍵,須要結合班級才能做爲主鍵(複合主鍵:一個老師在一個班永遠只能帶一階級的課),代課時間,開始和結束字段都是與當前代課主鍵(講師和班級),可是性別並不依賴班級,教師並不依賴講師,性別只依賴講師,教師只依賴班級,出現了性別和教師依賴主鍵中的一部分:部份依賴,不符合第二範式。設計
解決方案1:能夠將性別 與講師單獨成表,班級與教室單獨成表orm
解決方案2:取消複合主鍵,使用邏輯主鍵。blog
要知足第三範式,必須知足第二範式。
第三範式:理論上講,應該一張表中的全部字段都應該直接依賴主鍵,若是表設計中存在一個字段,並不直接依賴主鍵,而是經過某個非主鍵字段依賴,最終實現依賴主鍵,把這種不是直接依賴主鍵,而是依賴非主鍵字段的依賴關係稱之爲傳遞依賴。第三範式就是要解決傳遞依賴的問題
講師帶課表
以上設計方案中,性別依賴講師存在,講師依賴主鍵,教室依賴班級,班級依賴主鍵,性別和教室都存在傳遞依賴。
解決方案:將存在傳遞依賴的字段以及依賴的字段自己單獨取出,造成一個單獨的表,而後在須要對應信息的時候,使用對應的實體表的主鍵加進來。
講師帶課表
講師表 id=講師 主鍵是講師 而不是邏輯主鍵(具備傳遞依賴)
圖片
班級表 id=班級 主鍵是班級 而不是邏輯主鍵(具備傳遞依賴)
數學
有時候,在設計表的時候,若是一張表中有幾個字段須要從另外的表中去獲取信息,理論上講,的確能夠得到想要的數據,可是效率低一點,會刻意的在某些表中,不去保存另外表的主鍵,而是直接保存想要的數據信息,這樣一來,在查詢數據的時候,一張表能夠直接提供數據,而不須要多表查詢((效率低),可是冗餘會增長it
逆規範化:磁盤利用率與效率的對抗。class