新聞中心
在數(shù)據(jù)庫(kù)設(shè)計(jì)中,三范式是一項(xiàng)非常重要的原則。通過(guò)遵循這一原則,可以保證數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu)適當(dāng)、高效,不僅能夠提高數(shù)據(jù)查詢(xún)的速度和準(zhǔn)確性,還能夠避免數(shù)據(jù)冗余和不一致。那么,什么是三范式呢?如何遵循三范式進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)呢?

馬鞍山ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!
什么是三范式?
三范式(3NF,Third Normal Form)是指在數(shù)據(jù)庫(kù)設(shè)計(jì)中,一個(gè)關(guān)系型數(shù)據(jù)庫(kù)表(即一個(gè)二維表格)必須滿足以下三個(gè)條件:
1. 每個(gè)表列必須是一個(gè)原子值(即不可再分解的值)。
這意味著,應(yīng)該將一個(gè)復(fù)雜的值分解為多個(gè)原子值,并將它們存儲(chǔ)在不同的列中。例如,如果你想要存儲(chǔ)一個(gè)人的地址,應(yīng)該將地址信息分解為國(guó)家、省份、城市和街道等不同的列,而不是將整個(gè)地址存儲(chǔ)在一個(gè)列中。
2. 表中的每個(gè)非主鍵列必須完全依賴(lài)于主鍵。
這意味著,如果一個(gè)表中有多個(gè)列與主鍵相關(guān)聯(lián),那么這些列之間必須滿足互相獨(dú)立、沒(méi)有重疊,每個(gè)列只依賴(lài)于主鍵這個(gè)條件。如果一個(gè)列依賴(lài)于另一個(gè)列,則需要將其作為一個(gè)新的表存儲(chǔ),并將兩個(gè)表之間建立關(guān)聯(lián)。
3. 表中不能存在傳遞依賴(lài)。
這意味著,如果一個(gè)列依賴(lài)于非主鍵列,那么這個(gè)非主鍵列必須成為主鍵,或者與其它列一起作為新的表存儲(chǔ)。例如,如果一個(gè)表中有一個(gè)列包含訂單日期和訂單時(shí)間,那么應(yīng)該將這兩個(gè)信息分解為兩個(gè)不同的列,并將它們分別與訂單編號(hào)建立關(guān)聯(lián)。
為什么需要遵循三范式?
遵循三范式有以下幾個(gè)好處:
1. 降低數(shù)據(jù)冗余和不一致
遵循三范式可以避免數(shù)據(jù)冗余和不一致,即同樣的數(shù)據(jù)不會(huì)存儲(chǔ)在多個(gè)地方,也不會(huì)受到多個(gè)操作的不同處理,從而保證了數(shù)據(jù)的一致性和完整性。
2. 提高數(shù)據(jù)查詢(xún)的效率
遵循三范式可以使數(shù)據(jù)結(jié)構(gòu)變得更加高效,查詢(xún)數(shù)據(jù)的速度也會(huì)更快。因?yàn)閿?shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,關(guān)聯(lián)關(guān)系也更加清晰,查詢(xún)數(shù)據(jù)時(shí)只需要關(guān)注主鍵等關(guān)鍵信息即可。
3. 容易維護(hù)和擴(kuò)展
遵循三范式可以使數(shù)據(jù)庫(kù)結(jié)構(gòu)變得更加容易維護(hù)和擴(kuò)展。由于每個(gè)表只存儲(chǔ)了特定的信息,數(shù)據(jù)結(jié)構(gòu)也更加清晰,可以降低修改和維護(hù)的成本。
如何遵循三范式進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)?
在進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),遵循三范式需要注意以下幾個(gè)方面:
1. 確定實(shí)體和關(guān)系
在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)首先需要確定實(shí)體和關(guān)系。一個(gè)實(shí)體可以是一個(gè)物體、一個(gè)概念或一個(gè)事件,其屬性用于描述該實(shí)體的特征。關(guān)系是不同實(shí)體之間的聯(lián)系,可以是一對(duì)一、一對(duì)多或多對(duì)多的關(guān)系。
2. 識(shí)別主鍵
主鍵是用于唯一標(biāo)識(shí)表中每個(gè)行的列。一般情況下,主鍵是一個(gè)自增數(shù)字,也可以是一個(gè)字符串或一個(gè)組合鍵。在確定主鍵時(shí)需要確保其唯一性和不可更改性,以確保數(shù)據(jù)的一致性和完整性。
3. 分解表和建立關(guān)系
通過(guò)將表分解為多個(gè)較小的表,并建立它們之間的關(guān)系,可以滿足三范式的要求。在分解表時(shí)需要確保每個(gè)表只存儲(chǔ)與該表名稱(chēng)相關(guān)的信息,并盡量減少數(shù)據(jù)冗余。在建立關(guān)系時(shí)需要考慮不同實(shí)體之間的關(guān)系,以確保數(shù)據(jù)的正確性和一致性。
4. 優(yōu)化查詢(xún)效率
為了提高數(shù)據(jù)查詢(xún)的效率,需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化。這包括使用索引、合理設(shè)計(jì)查詢(xún)語(yǔ)句等方法。同時(shí),可以使用數(shù)據(jù)倉(cāng)庫(kù)等技術(shù)來(lái)優(yōu)化大數(shù)據(jù)的處理和查詢(xún)效率。
三范式是數(shù)據(jù)庫(kù)設(shè)計(jì)中非常重要的原則,通過(guò)遵循這一原則可以保證數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu)適當(dāng)、高效,避免數(shù)據(jù)冗余和不一致,提高數(shù)據(jù)查詢(xún)的速度和準(zhǔn)確性,降低修改和維護(hù)的成本。在進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),需要注意確定實(shí)體和關(guān)系、識(shí)別主鍵、分解表和建立關(guān)系、優(yōu)化查詢(xún)效率等方面,以確保數(shù)據(jù)的正確性和高效性。
相關(guān)問(wèn)題拓展閱讀:
- 關(guān)于數(shù)據(jù)庫(kù)三大設(shè)計(jì)范式淺析
關(guān)于數(shù)據(jù)庫(kù)三大設(shè)計(jì)范式淺析
為了建立冗余較小、結(jié)構(gòu)合理的數(shù)據(jù)庫(kù),設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)必須遵循一定的規(guī)則。在關(guān)系型數(shù)據(jù)庫(kù)中這種規(guī)則就稱(chēng)為范式。范式是符合某一種設(shè)計(jì)要求的總結(jié)。要想設(shè)計(jì)一個(gè)結(jié)構(gòu)合理的關(guān)系型數(shù)據(jù)庫(kù),必須滿足一定的范式。
真斗扒拆正要明白”范式(NF)”是什么意思,首先看下教材中的定義,范式是“符合某一種級(jí)別的關(guān)系模式的,表示一個(gè)關(guān)系內(nèi)部各屬性之間的聯(lián)系的合理化程度”。實(shí)際上可以把它粗略地理解為一張數(shù)據(jù)表的表結(jié)構(gòu)所符合的某種設(shè)計(jì)標(biāo)準(zhǔn)的級(jí)別。就像家里裝修買(mǎi)建材,最環(huán)保的是E0級(jí),其次是E1級(jí),還有E2級(jí)等等。數(shù)據(jù)庫(kù)范式也分為1NF,2NF,3NF,BCNF,4NF,5NF。一般在我們?cè)O(shè)計(jì)關(guān)系型數(shù)據(jù)庫(kù)的時(shí)候,最多考慮到BCNF就夠。符合高一級(jí)范式的設(shè)計(jì),必定符合低一級(jí)范式,例如符合2NF的關(guān)系模式,必定符合1NF。
在實(shí)際開(kāi)發(fā)中最為常見(jiàn)的設(shè)計(jì)范式有三個(gè):
首先是之一范式(1NF)。
符合1NF的關(guān)系(你可以理解為數(shù)據(jù)表?!瓣P(guān)系”和“關(guān)系模式”的區(qū)別,類(lèi)似于面向?qū)ο蟪绦蛟O(shè)計(jì)中”類(lèi)“與”對(duì)象“的區(qū)別?!标P(guān)系“是”關(guān)系模式“的一個(gè)實(shí)例,你可以把”關(guān)系”理解為此和一張帶數(shù)據(jù)的表,而“關(guān)系模式”是這張數(shù)據(jù)表的表結(jié)構(gòu)。1NF的定義為:符合1NF的關(guān)系中的每個(gè)屬性都不可再分。表1所示的情況,就不符合1NF的要求。
表1
實(shí)際上,1NF是所有關(guān)系型數(shù)據(jù)庫(kù)的最基本要求,你在關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),例如SQL Server,Oracle,MySQL中創(chuàng)建數(shù)據(jù)表的時(shí)候,如果數(shù)據(jù)表的設(shè)計(jì)不符合這個(gè)最基本的要求,那么操作一定是不能成功的。也就是說(shuō),只要在RDBMS中已經(jīng)存在的數(shù)據(jù)表,一定是符合1NF的。如果我們要在RDBMS中表現(xiàn)表中的數(shù)據(jù),就得設(shè)計(jì)為表2的形式:表2
表2
但是僅僅符合1NF的設(shè)計(jì),仍然會(huì)存在數(shù)據(jù)冗余過(guò)大,插入異常,刪除異常,修改異常的問(wèn)題,例如對(duì)于表3中的設(shè)計(jì):
每一名學(xué)生的學(xué)號(hào)、姓名、系名、系主任這些數(shù)據(jù)重復(fù)多次。每個(gè)系與對(duì)應(yīng)的系主任的數(shù)據(jù)也重復(fù)多次——數(shù)據(jù)冗余過(guò)大
假如學(xué)校新建了一個(gè)系,但是暫時(shí)還沒(méi)有招收任何學(xué)生(比如3月份就新建了,但要等到8月份才招生),那么是無(wú)法將系名與系主任的數(shù)據(jù)單獨(dú)地添加到數(shù)據(jù)表中去的 —-—插入異常
假如將某個(gè)系中所有學(xué)生相關(guān)的記錄都刪除,那么所有系與系主任的數(shù)據(jù)也就隨之消失了(一個(gè)系所有學(xué)生都沒(méi)有了,并不表示這個(gè)系就沒(méi)有了)?!?jiǎng)h除異常
假如李小明轉(zhuǎn)系到法律系,那么為了保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的一致性,需要修改三條記錄中系與系主任的數(shù)據(jù)?!薷漠惓?。
正因?yàn)閮H符合1NF的數(shù)據(jù)庫(kù)設(shè)計(jì)存在著這樣空棗那樣的問(wèn)題,我們需要提高設(shè)計(jì)標(biāo)準(zhǔn),去掉導(dǎo)致上述四種問(wèn)題的因素,使其符合更高一級(jí)的范式(2NF),這就是所謂的“規(guī)范化”。
第二范式
第二范式在之一范式的基礎(chǔ)之上更進(jìn)一層。是指2NF在1NF的基礎(chǔ)之上,消除了非主屬性對(duì)于碼的部分函數(shù)依賴(lài)。
函數(shù)依賴(lài):若在一張表中,在屬性(或?qū)傩越M)X的值確定的情況下,必定能確定屬性Y的值,那么就可以說(shuō)Y函數(shù)依賴(lài)于X,寫(xiě)作 X → Y。
表中的函數(shù)依賴(lài)關(guān)系例如:
系名 → 系主任
學(xué)號(hào) → 系主任
(學(xué)號(hào),課名) → 分?jǐn)?shù)
但以下函數(shù)依賴(lài)關(guān)系則不成立:
學(xué)號(hào) → 課名
學(xué)號(hào) → 分?jǐn)?shù)
課名 → 系主任
(學(xué)號(hào),課名) → 姓名
碼:假如當(dāng) K 確定的情況下,該表除 K 之外的所有屬性的值也就隨之確定,那么 K 就是碼。碼也可以理解為主鍵。
第二范式需要確保數(shù)據(jù)庫(kù)表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部分相關(guān)(主要針對(duì)聯(lián)合主鍵而言)。也就是說(shuō)在一個(gè)數(shù)據(jù)庫(kù)表中,一個(gè)表中只能保存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫(kù)表中。
比如要設(shè)計(jì)一個(gè)訂單信息表,因?yàn)橛唵沃锌赡軙?huì)有多種商品,所以要將訂單編號(hào)和商品編號(hào)作為數(shù)據(jù)庫(kù)表的聯(lián)合主鍵,如下表所示。
訂單信息表
這樣就產(chǎn)生一個(gè)問(wèn)題:這個(gè)表中是以訂單編號(hào)和商品編號(hào)作為聯(lián)合主鍵。這樣在該表中商品名稱(chēng)、單位、商品價(jià)格等信息不與該表的主鍵相關(guān),而僅僅是與商品編號(hào)相關(guān)。所以在這里違反了第二范式的設(shè)計(jì)原則。
而如果把這個(gè)訂單信息表進(jìn)行拆分,把商品信息分離到另一個(gè)表中,把訂單項(xiàng)目表也分離到另一個(gè)表中,就非常完美了。如下所示。
訂單信息表
訂單項(xiàng)目表
商品信息表
這樣設(shè)計(jì),在很大程度上減小了數(shù)據(jù)庫(kù)的冗余。如果要獲取訂單的商品信息,使用商品編號(hào)到商品信息表中查詢(xún)即可。
因此可以總結(jié)判斷的方法是:
之一步:找出數(shù)據(jù)表中所有的碼。
第二步:根據(jù)之一步所得到的碼,找出所有的主屬性。
第三步:數(shù)據(jù)表中,除去所有的主屬性,剩下的就都是非主屬性了。
第四步:查看是否存在非主屬性對(duì)碼的部分函數(shù)依賴(lài)。
第三范式
3NF在2NF的基礎(chǔ)之上,消除了非主屬性對(duì)于碼的傳遞函數(shù)依賴(lài)。也就是說(shuō), 如果存在非主屬性對(duì)于碼的傳遞函數(shù)依賴(lài),則不符合3NF的要求。
則就是第三范式需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)。
比如在設(shè)計(jì)一個(gè)訂單數(shù)據(jù)表的時(shí)候,可以將客戶(hù)編號(hào)作為一個(gè)外鍵和訂單表建立相應(yīng)的關(guān)系。而不可以在訂單表中添加關(guān)于客戶(hù)其它信息(比如姓名、所屬公司等)的字段。如下面這兩個(gè)表所示的設(shè)計(jì)就是一個(gè)滿足第三范式的數(shù)據(jù)庫(kù)表。
訂單信息表
客戶(hù)信息表
這樣在查詢(xún)訂單信息的時(shí)候,就可以使用客戶(hù)編號(hào)來(lái)引用客戶(hù)信息表中的記錄,也不必在訂單信息表中多次輸入客戶(hù)信息的內(nèi)容,減小了數(shù)據(jù)冗余。
由此可見(jiàn),符合3NF要求的數(shù)據(jù)庫(kù)設(shè)計(jì),基本上解決了數(shù)據(jù)冗余過(guò)大,插入異常,修改異常,刪除異常的問(wèn)題。當(dāng)然,在實(shí)際中,往往為了性能上或者應(yīng)對(duì)擴(kuò)展的需要,經(jīng)常 做到2NF或者1NF,但是作為數(shù)據(jù)庫(kù)設(shè)計(jì)人員,至少應(yīng)該知道,3NF的要求是怎樣的。
數(shù)據(jù)庫(kù)設(shè)計(jì)的三范式的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于數(shù)據(jù)庫(kù)設(shè)計(jì)的三范式,三范式:數(shù)據(jù)庫(kù)設(shè)計(jì)的重要原則,關(guān)于數(shù)據(jù)庫(kù)三大設(shè)計(jì)范式淺析的信息別忘了在本站進(jìn)行查找喔。
成都網(wǎng)站營(yíng)銷(xiāo)推廣找創(chuàng)新互聯(lián),全國(guó)分站站群網(wǎng)站搭建更好做SEO營(yíng)銷(xiāo)。
創(chuàng)新互聯(lián)(www.cdcxhl.com)四川成都IDC基礎(chǔ)服務(wù)商,價(jià)格厚道。提供成都服務(wù)器托管租用、綿陽(yáng)服務(wù)器租用托管、重慶服務(wù)器托管租用、貴陽(yáng)服務(wù)器機(jī)房服務(wù)器托管租用。
文章題目:三范式:數(shù)據(jù)庫(kù)設(shè)計(jì)的重要原則 (數(shù)據(jù)庫(kù)設(shè)計(jì)的三范式)
網(wǎng)頁(yè)路徑:http://fisionsoft.com.cn/article/dhejoop.html


咨詢(xún)
建站咨詢(xún)
