NF(normal form)作為一個數(shù)據(jù)庫設(shè)計里經(jīng)常會提到的概念,是每一個初學者都應(yīng)該了解并掌握的。復習數(shù)據(jù)庫的時候發(fā)現(xiàn) Database System Concepts 這本書里講的過于抽象,而且網(wǎng)上也沒有特別好的講解,于是自己重新整理一份,有需者自取。
NF的意義
Normal form作為設(shè)計的標準范式,其最大的意義就是為了避免數(shù)據(jù)的冗余和插入/刪除/更新的異常。舉個例子
表1
school(stu-id,stu-name,major,dean-name,dean-telephone)
在學校這個表里面,學生的學號、姓名、專業(yè)、系主任以及系主任電話被放到了一起(典型的excel風格)。雖然這樣有些時候也不是不可以,但當進行一些特定操作的時候,著實會給我們帶來極大的困擾。
- 插入異常[ 輸入新信息的時候,系主任電話號碼輸錯 ] : 無法確認系主任的真正號碼。
- 刪除異常[ 某個系的學生全部退學了 ] : 該系對應(yīng)的系主任名字和電話號碼也隨之丟失。
- 更新異常[ 系主任進行變更 / 系主任換手機號 ] : 我們需要把系里所有學生的行都給更新一遍,顯然開銷過大。
1NF
定義:所有的屬性均有原子性
說人話:所有的屬性均不可被再分割,國外比較喜歡拿人名來舉例(first,middle,last),但跟國內(nèi)國情不太符合,我就舉一個商品的例子好了。
TaobaoPucharsedLog(sid, date, buyer, seller, goods,amount)
顯然“商品”會有更多詳細的屬性,例如商品名稱,商品價格,產(chǎn)地等等?!坝脩簟币灿嘘欠Q,年齡,住址等,“商戶”也是如此。這些屬性都是可以再分割的,所以并不符合1NF范式,需要將其完全拆至不可分割為止。
修改示范:
TaobaoPucharsedLog(sid, date, buyer-id, buyer-name, buyer-age, seller, goods, amount) [僅拆開了buyer]
意義:嗯.. 這個還是等我們講完四個定理再來說吧,現(xiàn)在講解比較困難。
2NF(在滿足1NF的前提上)
定義:如果依賴于主鍵,則需要依賴于所有主鍵,不能存在依賴部分主鍵的情況
說人話:對于上面那個例子,TaobaoPucharsedLog(sid, date, buyer-id, buyer-name, buyer-age, seller-id, seller-name, seller-age, goods-id, goods-name, amount)??梢钥吹嚼锩嬗兴膫€主鍵:sid, buyer-id, seller-id, goods-id。對于seller-name屬性,它僅依賴于seller-id,跟buyer-id之類的沒有任何關(guān)系,所以它對于主鍵的依賴是“部分依賴”,并不符合2NF。簡單點說,就是不要把不相關(guān)的東西放到一個表里面。
修改示范:
拆解成以下四個
- TaobaoPucharsedLog(sid, buyer-id, seller-id, goods-id, amount)
- BuyerInformation(buyer-id, buyer-name, buyer-age)
- SellerInformation(seller-id, seller-name, seller-age)
- GoodsInformation(goods-id, goods-name)
意義:不相關(guān)的東西不要放在一起,用多個小表連接來代替大表,減少修改時候的負擔。
3NF(在滿足1NF和2NF的前提上)
定義:一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息。
說人話:不得存在傳遞式依賴,比如對于一張數(shù)據(jù)庫,里面的元素有son, person, father, grand-father,依賴關(guān)系是son -> person, person -> father, father -> grand-father,明顯有一個鏈表式的傳遞,3NF中禁止此類依賴的出現(xiàn)。
修改示范:
依賴關(guān)系修改為
- son -> person
- son -> father
- son -> grand-father
或者是拆成三張表
(其實就是并查集里面的路徑壓縮)
意義:避免查詢路徑過長而導致詢問時間過長或者更新異常。以上面的家族關(guān)系為例,如果我想查詢某位同學曾曾曾曾曾……曾祖父是誰,按照非3NF的依賴,則需要進行多次查詢,而對于滿足3NF的依賴,只需要進行一次查詢。效率大大提高。