作者也是菜鳥一個,最近在學習數據庫,在網上看了一些數據庫三大范式詳解,費了好大盡才算勉強搞明白,下面有說的不對的期望指出,一來我好改正,關鍵不要在誤導其他新手.廢話就說到這里了,直接主題了.
第一范式(1NF)無重復的列
所謂第一范式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重復的屬性。如果出現重復的屬性,就可能需要定義一個新的實體,新的實體由重復的屬性構成,新實體與原實體之間為一對多關系。
上面是官方解釋, 我的理解是這樣的.比如這樣一個表 學生成績表id | 學生名 | 班級 | 考試類型 | 科目 | 分數 |
1 | 張三 | 3_2 | 其中考試 | 數學 | 89 |
同一列中不能有多個值 班級 字段 3_2 數據原意是 3年級2班 (這個是我個人加的應為現在的關系型數據庫是設計不出來不符合第一范式的表出來,原因就是數據庫不支持這樣的設置)
正確的方式應該把 班級分成兩個列 字段應該為 年級 和班編號
第二范式
是在滿足第一范式的基礎上建立起來的
要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。為實現區分通常需要為表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二范式就是非主屬性非部分依賴于主關鍵字上面大概的意思好像是,在一個表中不可以在一個表中表達兩種或以上的事務,舉個列子
id | 姓名 | 科目 |
1 | 張三 | 數學 |
這種是不符合的.因為姓名和科目是兩種不同的類或者說事務,就是說這兩個不可以整到一個表中.但是下面這張表和上面的表是兩碼事
id | 姓名_ID | 科目_ID | 分數 |
1 | 34 | 2 | 89 |
要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系 琢磨一下應該知道說的是什么了.第三范式(3NF) 滿足第三范式必須先滿足第二范式。簡而言之,第三范式要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。先來個不符合的列子
學生_ID | 姓名 | 年齡 | 學校 | 學校電話 |
1 | 張三 | 14 | 藍天小學 | XXX |
符合3范式的修改應該 把上面一張表,改成兩個表,就是單獨把學校信息 搞個表,下面結合上面的3范式,做個我還感覺合格的數據表來,共新手參考下.當然只是考慮如何符合3范式要求,并沒有考慮實際應用.
學生_ID | 姓名 | 年齡 | |
1 | 小明 | 14 |
學校_ID | 學校_名 | 學校_電話 |
1 | 藍天小學 | XXX |
科目_ID | 科目 |
1 | 語文 |
2 | 數學 |
考試類型-ID | 類型 |
1 | 其中考試 |
2 | 期末考試 |
ID | 學校_ID | 學生_ID | 考試類型_ID | 科目_ID | 考試時間 | 考試分數 |
1 | 2 | 2 | 1 | 2 | xxx | 90 |
建立這么多表的好處就是,修改,擴充性強,比如如果要增加考試類型 只需要改寫 考試類型表 就可以了,(但建立的表并不是越多越好,比如說把 學生信息表 姓名 和 年齡 建兩張表,這樣查詢其來會帶來沒必要的麻煩),3范式本身并不是一種定義,她應該是開發者們在實際的工作中凝聚出來的經驗,她的合理性是經得起考驗的.最后希望這篇半抄的文稿能給人帶來幫助.
新聞熱點
疑難解答