從1NF到4NF

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風格)。雖然這樣有些時候也不是不可以,但當進行一些特定操作的時候,著實會給我們帶來極大的困擾。

  1. 插入異常[ 輸入新信息的時候,系主任電話號碼輸錯 ] : 無法確認系主任的真正號碼。
  2. 刪除異常[ 某個系的學生全部退學了 ] : 該系對應(yīng)的系主任名字和電話號碼也隨之丟失。
  3. 更新異常[ 系主任進行變更 / 系主任換手機號 ] : 我們需要把系里所有學生的行都給更新一遍,顯然開銷過大。

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)的東西放到一個表里面。

修改示范:

拆解成以下四個

  1. TaobaoPucharsedLog(sid, buyer-id, seller-id, goods-id, amount)
  2. BuyerInformation(buyer-id, buyer-name, buyer-age)
  3. SellerInformation(seller-id, seller-name, seller-age)
  4. 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)系修改為

  1. son -> person
  2. son -> father
  3. son -> grand-father

或者是拆成三張表

(其實就是并查集里面的路徑壓縮)

意義:避免查詢路徑過長而導致詢問時間過長或者更新異常。以上面的家族關(guān)系為例,如果我想查詢某位同學曾曾曾曾曾……曾祖父是誰,按照非3NF的依賴,則需要進行多次查詢,而對于滿足3NF的依賴,只需要進行一次查詢。效率大大提高。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1NF: 1NF的定義為:符合1NF的關(guān)系中的每個屬性都不可再分。原子性。 2NF: 2NF在1NF的基礎(chǔ)之上,消...
    Arya鑫閱讀 482評論 1 0
  • CREATE TABLE IF NOT EXISTS ecs_order_info (order_id mediu...
    cookie口閱讀 16,141評論 0 16
  • 數(shù)據(jù)準備 回顧 記錄操作:寫操作:INSERT,UPDATE,DELETE讀取操作:SELECT 這章主要學習:子...
    齊天大圣李圣杰閱讀 1,130評論 0 4
  • 第1章 初涉MySQL 1.1 MySQL文件 (1)MySQL目錄結(jié)構(gòu) (2)MySQL配置向?qū)募ò惭b后配置...
    凜0_0閱讀 992評論 1 0
  • 親愛的 曾經(jīng) 你說我們發(fā)展的快 你問我我們是什么關(guān)系 可能 是我太自私 不想讓你離開我 覺得只有身體和心靈的大面積...
    齊亞寧閱讀 198評論 0 2

友情鏈接更多精彩內(nèi)容