範式及其在mysql數據庫設計中的應用
一、什麽是範式
1.1、範式:Normal Format,是離散數學的知識,是為了解決數據的存儲與優化而提出來的。要求存儲數據後,凡是能夠通過關系尋找出來的數據,堅決不再重復存儲,終極目標是為了減少數據的冗余。
1.2、範式是一種分層的規範,分為6層,每一層都比上一層更加嚴格,若要滿足下一層範式,前提是滿足上一層範式。6層範式:1NF,2NF...6NF;1NF是最底層,要求最低,6NF最高層,要求最嚴格。
1.3、mysql屬於關系型數據庫,有空間浪費,表設計時也要致力於節省存儲空間。這與範式要解決的問題不謀而合,所以在設計mysql數據庫時,會利用範式來指導設計。但是數據庫不單是要解決空間問題,還要保證效率問題,範式只為解決空間問題,所以數據庫的設計不可能完全按照範式的要求做。一般情況下,滿足前三種範式就可以了。
1.4、範式在數據庫的設計中是有指導意義,但不是強制規範。
二、第一範式
1NF:第一範式。在數據表存儲數據的時候,如果表中設計的字段存儲的數據,在取出來使用之前還需要額外的處理(拆分),那麽表的設計不滿足第一範式。第一範式要求字段的數據具有原子性,不可再分。看下面的例子:
上表設計在某種情況下不存在問題。但是如果需求是將講課時間查出來後,分別顯示開課時間和結課時間,即將字段"講課時間"的數據拆分使用,這就違背了數據的原子性,不符合第一範式。解決方案就是將字段"講課時間"拆成"開課時間"和"結課時間"兩個字段。需要註意的是,如果需求只是顯示講課時間,不拆開數據,上表就不存在問題。所以,表設計是否滿足範式也是看需求的。
三、第二範式
2NF:第二範式,前提是滿足第一範式。在數據表設計的過程中,如果有復合主鍵,且表中有字段並不是由整個主鍵來確定,而是依賴主鍵中的某個字段(主鍵的部分);存在字段依賴主鍵的的部分的問題,稱之為【部分依賴】。第二範式要求不能出現部分依賴。
舉例: 下表使用復合主鍵:講師+班級,字段"性別"依賴講師,而與班級無關,這就是部分依賴。
解決方案:使用邏輯主鍵
四、第三範式
3NF:第三範式,前提是先滿足第二範式。理論上講,一張表中所有的字段都應該直接依賴主鍵(邏輯主鍵,代表的是業務主鍵), 如果表設計中存在一個字段,並不直接依賴主鍵,而是通過某個非主鍵字段依賴,最終實現依賴主鍵,把這種不是直接依賴主鍵而是依賴非主鍵字段的依賴關系稱之為【傳遞依賴】。第三範式就是要解決傳遞依賴的問題。第三範式要求所有字段都依賴主屬性
五、逆規範化
上面的例子中,我們可以通過講師ID查詢講師表獲取講師信息,但是這需要查詢兩張表(關聯查詢),比查詢一張表效率要低。如果表記錄非常多,為了效率,我們可能會講師相關的常用信息也添加到開課表,多數情況下我們就查詢開課表這一張表就可以滿足需求,這樣效率高。
逆規範化會導致數據冗余,所以我們要從數據冗余和查詢效率兩方面綜合考慮。
範式及其在mysql數據庫設計中的應用