這篇文章主要講解了MySQL數(shù)據(jù)庫設(shè)計(jì)三范式的用法,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。
公司主營業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出渾江免費(fèi)做網(wǎng)站回饋大家。
三范式
1NF:字段不可分;
2NF:有主鍵,非主鍵字段依賴主鍵;
3NF:非主鍵字段不能相互依賴;
解釋:
1NF:原子性 字段不可再分,否則就不是關(guān)系數(shù)據(jù)庫;
2NF:唯一性 一個表只說明一個事物;
3NF:每列都與主鍵有直接關(guān)系,不存在傳遞依賴;
第一范式(1NF)
即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只要數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫(mysql/oracle/db2/informix/sysbase/sql server),就自動的滿足1NF。數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng),而不能是集合,數(shù)組,記錄等非原子數(shù)據(jù)項(xiàng)。如果實(shí)體中的某個屬性有多個值時,必須拆分為不同的屬性 。通俗理解即一個字段只存儲一項(xiàng)信息。
關(guān)系型數(shù)據(jù)庫: mysql/oracle/db2/informix/sysbase/sql server 非關(guān)系型數(shù)據(jù)庫: (特點(diǎn): 面向?qū)ο蠡蛘呒? NoSql數(shù)據(jù)庫: MongoDB/redis(特點(diǎn)是面向文檔)
第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫表中的每個實(shí)例或行必須可以被惟一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要我們設(shè)計(jì)一個主鍵來實(shí)現(xiàn)(這里的主鍵不包含業(yè)務(wù)邏輯)。
即滿足第一范式前提,當(dāng)存在多個主鍵的時候,才會發(fā)生不符合第二范式的情況。比如有兩個主鍵,不能存在這樣的屬性,它只依賴于其中一個主鍵,這就是不符合第二范式。通俗理解是任意一個字段都只依賴表中的同一個字段。(涉及到表的拆分)
看下面的學(xué)生選課表:
學(xué)號 | 課程 | 成績 | 課程學(xué)分 |
---|---|---|---|
10001 | 數(shù)學(xué) | 100 | 6 |
10001 | 語文 | 90 | 2 |
10001 | 英語 | 85 | 3 |
10002 | 數(shù)學(xué) | 90 | 6 |
10003 | 數(shù)學(xué) | 99 | 6 |
10004 | 語文 | 89 | 2 |
表中主鍵為 (學(xué)號,課程),我們可以表示為 (學(xué)號,課程) -> (成績,課程學(xué)分), 表示所有非主鍵列 (成績,課程學(xué)分)都依賴于主鍵 (學(xué)號,課程)。 但是,表中還存在另外一個依賴:(課程)->(課程學(xué)分)。這樣非主鍵列 ‘課程學(xué)分‘ 依賴于部分主鍵列 '課程‘, 所以上表是不滿足第二范式的。
我們把它拆成如下2張表:
學(xué)生選課表:
學(xué)號 | 課程 | 成績 |
---|---|---|
10001 | 數(shù)學(xué) | 100 |
10001 | 語文 | 90 |
10001 | 英語 | 85 |
10002 | 數(shù)學(xué) | 90 |
10003 | 數(shù)學(xué) | 99 |
10004 | 語文 | 89 |
課程信息表:
課程 | 課程學(xué)分 |
---|---|
數(shù)學(xué) | 6 |
語文 | 3 |
英語 | 2 |
那么上面2個表,學(xué)生選課表主鍵為(學(xué)號,課程),課程信息表主鍵為(課程),表中所有非主鍵列都完全依賴主鍵。不僅符合第二范式,還符合第三范式。
再看這樣一個學(xué)生信息表:
學(xué)號 | 姓名 | 性別 | 班級 | 班主任 |
---|---|---|---|---|
10001 | 張三 | 男 | 一班 | 小王 |
10002 | 李四 | 男 | 一班 | 小王 |
10003 | 王五 | 男 | 二班 | 小李 |
10004 | 張小三 | 男 | 二班 | 小李 |
上表中,主鍵為:(學(xué)號),所有字段 (姓名,性別,班級,班主任)都依賴與主鍵(學(xué)號),不存在對主鍵的部分依賴。所以是滿足第二范式。
第三范式(3NF)
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主鍵字段。就是說,表的信息,如果能夠被推導(dǎo)出來,就不應(yīng)該單獨(dú)的設(shè)計(jì)一個字段來存放(能盡量外鍵join就用外鍵join)。很多時候,我們?yōu)榱藵M足第三范式往往會把一張表分成多張表。
即滿足第二范式前提,如果某一屬性依賴于其他非主鍵屬性,而其他非主鍵屬性又依賴于主鍵,那么這個屬性就是間接依賴于主鍵,這被稱作傳遞依賴于主屬性。 通俗解釋就是一張表最多只存兩層同類型信息。
反三范式
沒有冗余的數(shù)據(jù)庫未必是最好的數(shù)據(jù)庫,有時為了提高運(yùn)行效率,提高讀性能,就必須降低范式標(biāo)準(zhǔn),適當(dāng)保留冗余數(shù)據(jù)。具體做法是: 在概念數(shù)據(jù)模型設(shè)計(jì)時遵守第三范式,降低范式標(biāo)準(zhǔn)的工作放到物理數(shù)據(jù)模型設(shè)計(jì)時考慮。降低范式就是增加字段,減少了查詢時的關(guān)聯(lián),提高查詢效率,因?yàn)樵跀?shù)據(jù)庫的操作中查詢的比例要遠(yuǎn)遠(yuǎn)大于DML的比例。但是反范式化一定要適度,并且在原本已滿足三范式的基礎(chǔ)上再做調(diào)整的。
看完上述內(nèi)容,是不是對Mysql數(shù)據(jù)庫設(shè)計(jì)三范式的用法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。