數據庫範式:掀起你的蓋頭來(3)
3 範式的兩麵:天使與魔鬼
有人說:掌握了數據庫範式你就是數據庫設計高手了!!
嗬嗬,成為高手看來也很簡單的啊:)但此話對了一半,掌握數據庫範式可以算一般高手,因為畢竟能夠掌握範式並應用的人不算很多;但算不上高高手,為什麼呢?因為範式不是萬能的,也有自己的適應範圍和局限性,如果到處不加原則和場合的使用,它很可能就是一個帶給你夢魘的魔鬼!
首先我們看看數據庫範式的目的是什麼?範式的主要目的有三個:
1) 減少數據冗餘
2) 優化表結構
3) 避免操作異常
從以上三個目的我們可以看出,範式的主要作用是和數據存儲有關的,它要解決的問題是數據存儲的問題。為了解決這些問題,範式的最終動作其實就是將表拆分,將表拆成更多的表。
但是我們在實際應用過程中,不可能把數據存起來就不管了,而是要存要取,否則存起來有什麼意義呢:)既然要涉及到數據讀取,那麼數據讀取的性能當然也是要重點關注的;另外,程序是人寫的,對於人來說,表是否容易理解、是否容易使用,也是相當重要的。如果表的數量很多、關係太複雜,使用的時候很容易出錯。下麵我們看看範式在這兩點上的限製。
範式的限製主要有如下幾個:
1) 表數量增多會帶來更多的連接查詢,而連接查詢的效率肯定比不上單表查詢;
2) 表數量增多會導致表的關係複雜,SQL語句會更加難寫,表的關係也會更加難理解;
基於以上兩個限製,數據庫設計中還有一個概念叫做“反範式”,反範式很簡單,從字麵意思上理解即可,就是範式的反操作。下麵是簡單的對比:
------------範式------------------------------ 反範式----------------------
目的 解決存儲問題 解決性能問題和使用問題
動作 拆表 合表
效果 存儲優化 性能優化
-------------------------------------------------------------------------------------
看到這裏,可能會有人問:那是不是沒有範式就是性能最好的呢?非也,因為影響性能的除了連接查詢外,還有一個關鍵因素就是“鎖”,如果所有信息都在一張表裏麵,那麼對這張表的所有操作之間的衝突會非常厲害,反而會導致性能急劇下降。
因此,數據庫設計最終應該是在“範式”和“反範式”之間進行權衡,找到最佳的平衡點,隻有這樣才是一個真正的數據庫設計高手!!
到此數據庫範式的蓋頭已經被我們全部掀開,當然最後發現這既不是一個俊媳婦,也不是一個醜媳婦,隻是一個可以和我們過設計日子的普普通通的媳婦而已:)
====================================================================
歡迎大家交流指證!!!可以直接在博客中發表意見,也可以直接給我發郵件:yah99_wolf@yahoo.com.cn
最後更新:2017-04-02 00:06:43