數據庫範式:掀起你的蓋頭來(1)
1 介紹
凡是做過數據庫設計的,隻要不是大菜鳥,聽到範式兩個字,馬上就會在腦海中浮現1NF,2NF,3NF,BCNF這些術語,但是若要大家詳細的將這幾個東東的專業定義描述出來。。。。。。嗬嗬,至少大部分人都會暈的,什麼功能依賴、函數依賴,~!@#¥%……&*,my god!反正我是記不住:)
但既然上了IT這條賊船,就無法避免和數據庫設計打交道,醜媳婦總是要見公婆的:)既然無法避免,那就讓我們勇敢的麵對,揭開數據庫範式的神秘麵紗,看看到底是一個醜媳婦還是一個俊媳婦!!
2 一句話範式
數據庫範式本身的定義這裏就不囉嗦了,大家隨便上網搜索或者找本教材看看,保證隨處可見,我在這裏給大家用通俗的語言描述出來。
在詳細探討之前還是囉嗦一句:千萬要注意:範式隻是在設計表的時候用的原則,數據庫其它的設計例如索引、視圖、觸發器、存儲過程等都和範式沒有關係。
2.1 第一範式1NF
1NF在數據庫設計中其實很簡單:“列不可再分”。
什麼叫列不可再分呢?意思就是每一列隻包含一個屬性,所有屬性的類型都是一樣的。
可能有人看到這裏會說:暈,這還用說,誰設計的數據庫表的列還可以再分呢?其實這句話隻對了一部分,下麵我們詳細分析為什麼叫隻對了一部分。
我們目前說的和用的數據庫都是關係數據庫,而關係數據庫中是不可能設計一個列能夠包含兩個不同類型的屬性的;但大千世界,無奇不有,除了關係數據庫,還有其它的數據庫,例如麵向對象數據庫、XML數據庫,這種數據庫就可以設計一個屬性再包含多個子屬,所以1NF在關係數據庫中是天然滿足的,而在其它類型數據庫就不一定了。
看了上麵這段話,你是不是長籲一口氣,心裏踏實了,以為就可以從此不管1NF了呢?非也,數據庫隻做了第一層保證,但你還是可以設計不符合1NF的表來。下麵我們給幾個簡單的例子,看看我們如何不遵守1NF。
例子1:Student表有一個屬性name,類型為字符串。
這個是最簡單的例子,估計很多人都如此設計過,數據庫也不會拒絕我們創建這樣的表,但這個設計是不符合1NF的,為什麼?很簡單的,名字其實是“有名有姓”的,這其實就是兩個屬性。比如我們要查找姓“李”的同學有多少,或者查詢同名(例如“狗剩”)的有哪些。這樣的查詢如果隻有一個name列,嗬嗬,隻能用like來查詢了,這樣不同的名字方式(例如中國人姓在前,美國人姓在後),like都需要修改,而且like還不能利用索引加快查詢速度。
例子2:Custom表中有一個屬性Address。
大家可以自己按照上麵的例子自己分析一下,看看會有什麼問題……..
擔心一次寫太多,大家會暈,故分幾次來寫,未完待續。。。。。。
最後更新:2017-04-02 00:06:44