各位看官,各位朋友,久等了,終于有時(shí)間更新了 !
01、第一范式關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)模式設(shè)計(jì)不當(dāng),就會(huì)出現(xiàn)數(shù)據(jù)冗余,從而導(dǎo)致操作異常。對(duì)關(guān)系模式進(jìn)行范式優(yōu)化,使得數(shù)據(jù)的冗余度最小化以及運(yùn)行效率大化。
第一范式(First Normal Form)簡(jiǎn)稱1NF,是對(duì)關(guān)系模式的最基本要求。也就是說(shuō),一個(gè)二維表格,只有滿足1NF的要求,才能被稱為關(guān)系。
如果關(guān)系模式R的每個(gè)屬性都是原子的,即每個(gè)屬性對(duì)應(yīng)的域中的每個(gè)元素都是不可再分的最小單元,則稱R屬于第一范式,記作R∈1NF。
如表1所示的二維表格中,由于每位顧客作為一行,每位顧客可以生成多張訂單,而每張訂單中也可以包含多本圖書(shū),所以在orderid、orderdate、bookid、title、quantity、ctgcode、ctgname列中,針對(duì)每個(gè)行都可能出現(xiàn)多個(gè)值,也就是說(shuō)這些列中存放的值不具有原子性,存在“表中表”的結(jié)構(gòu),所以這個(gè)二維表格不滿足第一范式的要求,不能存放在關(guān)系數(shù)據(jù)庫(kù)中。
■?表1 圖書(shū)銷售表booksale
對(duì)該二維表格進(jìn)行規(guī)范化處理,可以得到表2所示的滿足第一范式的關(guān)系。
■?表2滿足第一范式的圖書(shū)銷售關(guān)系booksale
通過(guò)對(duì)表2所示的關(guān)系分析可知,數(shù)據(jù)之間存在如下聯(lián)系:
(1) 每位顧客可以擁有多張訂單,每張訂單只屬于一位顧客。
(2) 每張訂單里可以包含多冊(cè)圖書(shū),每?jī)?cè)圖書(shū)也可以被包含在多張訂單里。
(3) 每?jī)?cè)圖書(shū)屬于一個(gè)類別,每個(gè)類別下可以有多冊(cè)圖書(shū)。
在這個(gè)關(guān)系中,任意一個(gè)orderid和bookid屬性的值的組合都可以唯一地確定一條圖書(shū)銷售記錄,所以(orderid, bookid)是這個(gè)關(guān)系的候選鍵。(orderid, bookid)是這個(gè)關(guān)系唯一的候選鍵,可以將其視為該關(guān)系的主鍵,這個(gè)關(guān)系的關(guān)系模式可以描述為:
Booksale (cstid, cstname, orderid, orderdate, bookid, title, quantity, ctgcode, ctgname)
02、操作異常問(wèn)題雖然關(guān)系模式Booksale滿足第一范式,但是該關(guān)系模式下的具體關(guān)系中可能存在著大量的數(shù)據(jù)冗余。數(shù)據(jù)冗余不僅會(huì)占用更多的存儲(chǔ)空間,而且在對(duì)關(guān)系進(jìn)行插入、更新、刪除操作的過(guò)程中還可能發(fā)生操作異常,引發(fā)數(shù)據(jù)不一致的問(wèn)題。
1. 插入異常如果有一位顧客想要注冊(cè)為會(huì)員,但是他還從未購(gòu)書(shū),因?yàn)樵撚涗浫鄙僦麈I,所以這位顧客的信息無(wú)法插入到該關(guān)系中。也就是說(shuō),需要插入到關(guān)系中的記錄無(wú)法插入到關(guān)系中。
如果將booksale關(guān)系中的數(shù)據(jù)分別存儲(chǔ)在如表2-22~表2-27所示的5個(gè)關(guān)系中,那么就可以將這位會(huì)員的信息直接插入到關(guān)系customers中,解決想要插入記錄而無(wú)法插入的問(wèn)題。
對(duì)應(yīng)的關(guān)系模式為:
Customers (cstid, cstname)
Orders (orderid, orderdate, cstid[FK])
Books (bookid, title, ctgcode[FK])
Categories (ctgcode, ctgname)
Orderitems (orderid[FK], bookid[FK], quantity)
2. 刪除異常在圖書(shū)銷售booksale關(guān)系中,如果將訂單號(hào)orderid為4的訂單信息刪除,那么顧客“李明宇”的信息也會(huì)被同時(shí)刪除,或者說(shuō)“李明宇”的信息就無(wú)法保存在這個(gè)關(guān)系中了。也就是說(shuō),不希望刪除的數(shù)據(jù)被刪除了。
如果將關(guān)系分解為5個(gè)“小”關(guān)系,則刪除orderid為4的訂單記錄只需要在orders關(guān)系中刪除對(duì)應(yīng)的元組即可,不會(huì)影響到顧客信息的存儲(chǔ),也就避免了刪除異常的問(wèn)題。
3. 更新復(fù)雜當(dāng)需要更新關(guān)系中的數(shù)據(jù)時(shí),例如更新書(shū)號(hào)bookid為10號(hào)的圖書(shū)的書(shū)名title的時(shí)候,因?yàn)樵搱D書(shū)的信息重復(fù)存儲(chǔ),所以需要將所有圖書(shū)的書(shū)名title同時(shí)正確更新,否則就會(huì)出現(xiàn)數(shù)據(jù)不一致的問(wèn)題。
如果將關(guān)系分解為5個(gè)“小”關(guān)系,則更新10號(hào)圖書(shū)的書(shū)名的操作僅需在books關(guān)系中更新一個(gè)元組,不會(huì)造成更新后數(shù)據(jù)不一致的情況發(fā)生。
關(guān)系模式booksale以及由該關(guān)系模式分解得到的5個(gè)關(guān)系模式,都是滿足1NF的關(guān)系,都可以用來(lái)在數(shù)據(jù)庫(kù)中存放相關(guān)數(shù)據(jù),但是它們有各自的優(yōu)缺點(diǎn)。
將關(guān)系booksale分解為5個(gè)關(guān)系后,可以避免數(shù)據(jù)冗余以及操作異常問(wèn)題,但是會(huì)增加數(shù)據(jù)查詢的復(fù)雜程度。例如:想要查看顧客“張志遠(yuǎn)”訂購(gòu)的圖書(shū)的書(shū)號(hào)、書(shū)名、類別名稱,如果通過(guò)booksale關(guān)系查詢,則關(guān)系代數(shù)表達(dá)式非常簡(jiǎn)單:?
同樣的查詢操作,如果通過(guò)分解后的5個(gè)關(guān)系進(jìn)行查詢,則需要先將關(guān)系連接起來(lái)再進(jìn)行查詢。
由于連接運(yùn)算在數(shù)據(jù)庫(kù)操作中既消耗系統(tǒng)資源又效率非常低,所以如果將關(guān)系模式分解得過(guò)于“小”,會(huì)影響數(shù)據(jù)庫(kù)的查詢操作性能。
03、函數(shù)依賴函數(shù)依賴是最重要的一種數(shù)據(jù)依賴,在對(duì)關(guān)系模式進(jìn)行規(guī)范化處理的過(guò)程中,主要使用函數(shù)依賴來(lái)分析關(guān)系中存在的數(shù)據(jù)依賴特點(diǎn)。
1. 函數(shù)依賴的概念假設(shè)X和Y是關(guān)系模式R中的兩個(gè)不同的屬性或?qū)傩越M,如果對(duì)于X中的每一個(gè)具體值,Y中都有唯一的具體值與之對(duì)應(yīng),則稱Y函數(shù)依賴于X,或X函數(shù)決定Y,記作X→Y,其中X被稱為決定因素。
當(dāng)X→Y,并且Y包含于X時(shí),稱X→Y是平凡函數(shù)依賴;當(dāng)X→Y,并且Y不包含于X時(shí),稱X→Y是非平凡函數(shù)依賴。這里討論的是非平凡函數(shù)依賴。
以Booksale關(guān)系模式為例,因?yàn)閷?duì)于屬性cstid中的每一個(gè)具體值,在屬性cstname中都只有唯一一個(gè)值與之對(duì)應(yīng),所以cstid函數(shù)決定cstname,即cstid→cstname。但反過(guò)來(lái),因?yàn)榭赡艽嬖陬櫩椭孛那闆r,對(duì)于屬性cstname中的一個(gè)值,可能對(duì)應(yīng)屬性cstid中的多個(gè)值,所以cstname不能函數(shù)決定cstid,記作
。
由于一張訂單里的一冊(cè)圖書(shū)的銷售數(shù)量是一定的,所以orderid和bookid組合起來(lái)可以決定quantity,即(orderid,bookid)→quantity。
2. 部分函數(shù)依賴與完全函數(shù)依賴假設(shè)X→Y是關(guān)系模式R中的一個(gè)函數(shù)依賴,如果存在X的真子集X′,使得X′→Y成立,則稱Y部分依賴于X,記作
;如果在X中找不到一個(gè)真子集X′,使得X′→Y成立,則稱Y完全依賴于X。
在關(guān)系模式Booksale中
就是一個(gè)部分函數(shù)依賴。因?yàn)闆Q定因素(orderid, bookid)的一個(gè)真子集bookid就可以函數(shù)決定price,即bookid→price。
(orderid,bookid)→quantity是一個(gè)完全函數(shù)依賴,因?yàn)闆Q定因素的任何一個(gè)真子集都不能函數(shù)決定quantity。
3. 傳遞函數(shù)依賴在關(guān)系模式R中,如果存在函數(shù)依賴X→Y,Y→Z,而
,則稱Z傳遞依賴于X,記作。
在關(guān)系模式Booksale中,bookid→ctgcode,ctgcode→ctgname,而
,所以是一個(gè)傳遞函數(shù)依賴。
提示/
04、第二范式因?yàn)椴糠趾瘮?shù)依賴一定是傳遞函數(shù)依賴,所以如果關(guān)系模式中不存在傳遞函數(shù)依賴,則一定不存在部分函數(shù)依賴。
包含在主鍵中的屬性稱為主屬性;不包含在主鍵中的屬性稱為非主屬性。
如果關(guān)系模式R屬于1NF,并且每個(gè)非主屬性都完全函數(shù)依賴于R的主鍵,那么稱R屬于第二范式,記作R∈2NF。
在關(guān)系模式Booksale中,除了屬性quantity對(duì)主鍵(orderid, bookid)的函數(shù)依賴是完全函數(shù)依賴以外,其他非主屬性對(duì)主鍵的函數(shù)依賴都是部分函數(shù)依賴,因?yàn)橹麈I的真子集orderid可以函數(shù)決定屬性orderdate、cstid和cstname;主鍵的另外一個(gè)真子集bookid可以函數(shù)決定屬性title、ctgcode和ctgname。即:
由于該關(guān)系模式中存在著非主屬性對(duì)主鍵的部分函數(shù)依賴,所以這個(gè)關(guān)系模式不屬于第二范式。
為了將關(guān)系模式規(guī)范到2NF,可以對(duì)關(guān)系模式做如下處理:
(1) 將那些部分依賴于主鍵的屬性從關(guān)系模式中取出,再?gòu)?fù)制它們所依賴的主屬性作為新關(guān)系模式的主鍵來(lái)構(gòu)成一個(gè)新的關(guān)系模式。
(2) 剩下的屬性構(gòu)成另一個(gè)關(guān)系模式。
例如,將屬性orderdate、cstid和cstname從原關(guān)系模式中取出,再?gòu)?fù)制它們所依賴的主屬性orderid作為新關(guān)系模式的主鍵,構(gòu)成新關(guān)系模式Orders(orderid, orderdate, cstid, cstname);將屬性title、ctgcode和ctgname從原關(guān)系模式中取出,再?gòu)?fù)制它們所依賴的主屬性bookid作為新關(guān)系模式的主鍵,構(gòu)成新關(guān)系模式Books(bookid, title, ctgcode, ctgname);原關(guān)系模式中剩余的屬性構(gòu)成一個(gè)新的關(guān)系模式OrderItems(orderid[FK],?bookid[FK], quantity)。
所以關(guān)系模式Booksale可以規(guī)范為以下三個(gè)關(guān)系模式。這三個(gè)關(guān)系模式不存在非主屬性對(duì)主鍵的部分函數(shù)依賴,所以它們都是2NF的關(guān)系模式。分解得到的這三個(gè)新的關(guān)系模式可以通過(guò)外鍵連接起來(lái)。
分解后的關(guān)系模式仍然存在數(shù)據(jù)冗余,例如在關(guān)系模式Orders中,一位顧客可以有多張訂單,所以顧客的信息會(huì)重復(fù)存儲(chǔ);在關(guān)系模式Books中,一個(gè)類別下可以有多冊(cè)圖書(shū),那么圖書(shū)類別信息會(huì)重復(fù)存儲(chǔ)。
05、第三范式如果關(guān)系模式R屬于1NF,并且每個(gè)非主屬性都不傳遞函數(shù)依賴于R的主鍵,那么稱R屬于第三范式,記作R∈3NF。
在關(guān)系模式Orders中,主鍵orderid函數(shù)決定cstid,cstid函數(shù)決定cstname,而cstid不能函數(shù)決定orderid,所以cstname對(duì)主鍵orderid的函數(shù)依賴是傳遞函數(shù)依賴,即:
由于關(guān)系模式Orders中存在著非主屬性對(duì)主鍵的傳遞函數(shù)依賴,所以這個(gè)關(guān)系模式不滿足3NF。
為了將關(guān)系模式規(guī)范到3NF,可以對(duì)關(guān)系模式做如下處理:
(1) 將那些傳遞函數(shù)依賴于主鍵的屬性從關(guān)系模式中取出,再?gòu)?fù)制它們所直接函數(shù)依賴的屬性作為新關(guān)系模式的主鍵來(lái)構(gòu)成一個(gè)新的關(guān)系模式。
(2) 剩下的屬性構(gòu)成另一個(gè)新關(guān)系模式。
例如,將屬性cstname從原關(guān)系模式中取出,再?gòu)?fù)制它所直接函數(shù)依賴的屬性cstid作為新關(guān)系模式的主鍵,構(gòu)成新關(guān)系模式Customers(cstid, cstname);原關(guān)系模式中剩余的屬性構(gòu)成一個(gè)新的關(guān)系模式Orders(orderid, orderdate, cstid[FK])。
分析關(guān)系模式Books,包含如下函數(shù)依賴:
關(guān)系模式Books同樣存在非主屬性對(duì)主鍵的傳遞函數(shù)依賴,所以該關(guān)系模式不滿足3NF。通過(guò)同樣的方法分解關(guān)系模式Books得到兩個(gè)新關(guān)系模式。最終,總共得到5個(gè)新關(guān)系模式,如下所示。具體關(guān)系以及關(guān)系中的數(shù)據(jù)如表2-22~表2-26所示。
這5個(gè)分解得到的關(guān)系模式都不存在非主屬性對(duì)主鍵的傳遞函數(shù)依賴,所以它們都是3NF的關(guān)系模式。分解得到的這5個(gè)新的關(guān)系模式可以通過(guò)外鍵連接起來(lái)。
最早被提出的關(guān)系范式是第一范式(1NF)、第二范式(2NF)和第三范式(3NF),接著由R. Boyce和E. F. Codd于1974年共同提出了Boyce-Codd范式(BCNF),這個(gè)關(guān)系范式是對(duì)3NF的增強(qiáng)定義。以上4個(gè)關(guān)系范式中除了1NF以外的3個(gè)關(guān)系范式都是基于屬性之間的函數(shù)依賴提出的。比BCNF級(jí)別更高的關(guān)系范式還包括1977年提出的第四范式(4NF)和1979年提出的第五范式(5NF),其中4NF建立在多值依賴的基礎(chǔ)上,5NF建立在連接依賴的基礎(chǔ)上。圖2-6是各個(gè)關(guān)系范式之間的關(guān)系。
■?圖2-6關(guān)系范式之間的關(guān)系
在對(duì)關(guān)系模式進(jìn)行設(shè)計(jì)的時(shí)候,并不是規(guī)范化程度越高的關(guān)系模式就越好。如果對(duì)數(shù)據(jù)庫(kù)的操作主要是查詢,而更新較少時(shí),為了提高效率,寧可保留適當(dāng)?shù)臄?shù)據(jù)冗余而不要將關(guān)系模式分解得太小,否則為了查詢數(shù)據(jù),常常要做大量的連接運(yùn)算,反而會(huì)花費(fèi)大量的時(shí)間,降低查詢的效率;當(dāng)對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)操作主要是插入、更新和刪除操作時(shí),為了避免數(shù)據(jù)操作異常的發(fā)生,應(yīng)該盡量將關(guān)系模式規(guī)范到3NF。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧