什么是范式?
范式是數(shù)據(jù)庫設(shè)計時遵循的一種規(guī)范,不同的規(guī)范要求遵循不同的范式。
最常用的三大范式
第一范式(1NF):屬性不可分割,即每個屬性都是不可分割的原子項。(實體的屬性即表中的列)
理解:一個列不能包含兩個數(shù)據(jù)
第二范式(2NF):滿足第一范式;且不存在部分依賴,即非主屬性必須完全依賴于主屬性。(主屬性即主鍵;完全依賴是針對于聯(lián)合主鍵的情況,非主鍵列不能只依賴于主鍵的一部分)
理解:非主鍵字段必須依賴聯(lián)合主鍵索引的所有字段。
第三范式(3NF):滿足第二范式;且不存在傳遞依賴,即非主屬性不能與非主屬性之間有依賴關(guān)系,非主屬性必須直接依賴于主屬性,不能間接依賴主屬性。(A -> B, B ->C, A -> C)
舉例說明3NF:
1NF
屬性不可再分,即表中的每個列都不可以再進行拆分。
如下學(xué)生信息表(student):
id、name(姓名)、sex_code(性別代號)、sex_desc(性別描述)、contact(聯(lián)系方式)
primary key(id)
如果在查詢學(xué)生表時經(jīng)常用到學(xué)生的電話號,則應(yīng)該將聯(lián)系方式(contact)這一列分為電話號(phone)和地址(address)兩列,這樣才符合第一范式。
修改使表滿足1NF后:
判斷表是否符合第一范式,列是否可以再分,得看需求,如果將電話號和地址分開才能滿足查詢等需求時,那之前的表設(shè)計就是不滿足1NF的,如果電話號和地址拼接作為一個字段也可以滿足查詢、存儲等需求時,那它就滿足1NF。
表中無表,即每個屬性都是不可分割的。
不滿足第一范式的數(shù)據(jù)庫就不是關(guān)系型數(shù)據(jù)庫,所以說能在MySql建立的表肯定滿足第一范式。
其中 聯(lián)系方式 這個屬性還能繼續(xù)被分割,這樣無法建立MySql表。
2NF
在滿足1NF的前提下,表中不存在部分依賴,非主鍵列要完全依賴于主鍵。(主要是說在聯(lián)合主鍵的情況下,非主鍵列不能只依賴于主鍵的一部分)
如下學(xué)生成績表(score):
stu_id(學(xué)生id)、kc_id(課程id)、score(分?jǐn)?shù))、kc_name(課程名)
primary key(stu_id, kc_id)
表中主鍵為stu_id和kc_id組成的聯(lián)合主鍵。滿足1NF;非主鍵列score完全依賴于主鍵,stu_id和kc_id兩個值才能決定score的值;而kc_name只依賴于kc_id,與stu_id沒有依賴關(guān)系,它不完全依賴于主鍵,只依賴于主鍵的一部分,不符合2NF。
修改使表滿足2NF后:
成績表(score) ??primary key(stu_id)
將原來的成績表(score)拆分為成績表(score)和課程表(kc),而且兩個表都符合2NF。
3NF:
在滿足2NF的前提下,不存在傳遞依賴。(A -> B, B -> C, A->C)
如下學(xué)生信息表(student):
primary key(id)
表中sex_desc依賴于sex_code,而sex_code依賴于id(主鍵),從而推出sex_desc依賴于id(主鍵);sex_desc不直接依賴于主鍵,而是通過依賴于非主鍵列而依賴于主鍵,屬于傳遞依賴,不符合3NF。
修改表使?jié)M足3NF后:
學(xué)生表(student) ??primary key(id)
性別代碼表(sexcode) ??primary key(sex_code)
將原來的student表進行拆分后,兩個表都滿足3NF。
什么樣的表越容易符合3NF?
非主鍵列越少的表。(1NF強調(diào)列不可再分;2NF和3NF強調(diào)非主屬性列和主屬性列之間的關(guān)系)
如代碼表(sexcode),非主鍵列只有一個sex_desc;
或者將學(xué)生表的主鍵設(shè)計為primary key(id,name,sex_code,phone),這樣非主鍵列只有address,更容易符合3NF。
解題: 2NF非主鍵列要完全依賴于主鍵, 主鍵只能有一個,只能是AC,但是 B 和D 只依賴主鍵的一部分,所以不滿足。
知識來源:
【23版面試突擊】你知道數(shù)據(jù)庫設(shè)計三大范式嗎?開發(fā)中應(yīng)該遵守嗎?_嗶哩嗶哩_bilibili
數(shù)據(jù)庫三范式是什么?(3NF詳解)_小魚星空的博客-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-684617.html
數(shù)據(jù)庫三范式說的到底是啥? - 知乎文章來源地址http://www.zghlxwxcb.cn/news/detail-684617.html
到了這里,關(guān)于java八股文面試[數(shù)據(jù)庫]——數(shù)據(jù)庫三范式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!