数据库知识点⑤
1.第三范式
定義
如果關(guān)系模式R屬于2NF,且每個(gè)非主屬性都不傳遞依賴于R的每個(gè)關(guān)系鍵,則稱R屬于第三范式(Third Normal Form),簡(jiǎn)稱3NF,記作R屬于3NF。
基本性質(zhì):
1.如果R屬于3NF,則R也是2NF。
2.如果R屬于2NF,則R不一定是3NF。
例如,我們前面由關(guān)系模式SCD分解而得到的SD和SC都為2NF,其中,SC屬于3NF,但在SD中存在著非主屬性MN對(duì)主鍵SNO傳遞依賴,SD不是3NF。對(duì)于SD,應(yīng)該進(jìn)一步進(jìn)行分解,使其轉(zhuǎn)換成3NF。
2.3NF規(guī)范化
3NF規(guī)范化是指把2NF關(guān)系模式通過(guò)投影分解轉(zhuǎn)換成3NF關(guān)系模式的集合。
和2NF的規(guī)范化時(shí)遵循的原則相同,即“一事一表”,讓一個(gè)關(guān)系只描述一個(gè)實(shí)體或者實(shí)體間的聯(lián)系。
舉例:將之前的SD表進(jìn)行再分解,使其滿足第三范式
將SD(SN,AGE,DEPT,MN)分解為S(SN,AGE,DEPT)和D(MN),如下圖所示
3.第三范式3NF與第二范式2NF相比
(a).數(shù)據(jù)冗余降低。系主任的名字存儲(chǔ)的次數(shù)與該系的學(xué)生人數(shù)無(wú)關(guān),只在關(guān)系D中存儲(chǔ)一次。
(b).不存在插入異常。當(dāng)一個(gè)新系沒(méi)有學(xué)生時(shí),該系的信息可以直接插入到關(guān)系D中,而與學(xué)生關(guān)系S無(wú)關(guān)。
(c).不存在刪除異常。要?jiǎng)h除某系的全部學(xué)生而仍然保留該系的有關(guān)信息時(shí),可以只刪除學(xué)生關(guān)系S中的相關(guān)學(xué)生記錄,而不影響系關(guān)系D中的數(shù)據(jù)。
(d)不存在更新異常。更換系主任時(shí),只需修改關(guān)系D中一個(gè)相應(yīng)元組的MN屬性值,從而不會(huì)出現(xiàn)數(shù)據(jù)的不一致現(xiàn)象。
SCD規(guī)范到3NF后,所存在的異常現(xiàn)象已經(jīng)全部消失。
4.第三范式3NF的不足
3NF只限制了非主屬性對(duì)鍵的依賴關(guān)系,而沒(méi)有限制主屬性對(duì)鍵的依賴關(guān)系。
如果發(fā)生了這種依賴,仍有可能存在數(shù)據(jù)冗余、插入異常、刪除異常和修改異常。
這時(shí),則需對(duì)3NF進(jìn)一步規(guī)范化,消除主屬性對(duì)鍵的依賴關(guān)系,為了解決這種問(wèn)題,Boyce與Codd共同提出了一個(gè)新范式的定義,這就是Boyce-Codd范式,通常簡(jiǎn)稱BCNF或BC范式。它彌補(bǔ)了3NF的不足。
5.BCNF范式
定義 如果關(guān)系模式R屬于1NF,且所有的函數(shù)依賴X→Y(Y ,X),決定因素X都包含了R的一個(gè)候選鍵,則稱R屬于BC范式(Boyce-Codd Normal Form),記作R屬于BCNF。
基本性質(zhì)
(a).滿足BCNF的關(guān)系將消除任何屬性(主屬性或非主屬性)對(duì)鍵的部分函數(shù)依賴和傳遞函數(shù)依賴。也就是說(shuō),如果R屬于BCNF,則R也是3NF。
(b)如果R屬于3NF,則R不一定是BCNF。
舉例:
設(shè)關(guān)系模式SNC(SNO,SN,CN0,SCORE),其中SNO代表學(xué)號(hào),SN代表學(xué)生姓名并假設(shè)沒(méi)有重名,CNO代表課程號(hào),SCORE代表成績(jī)。可以判定,SNC有兩個(gè)候選鍵(SNO,CNO)和(SN,CNO),其函數(shù)依賴如下:
SNO <->SN
(SNO,CNO)→SCORE
(SN,CNO)→SCORE。
唯一的非主屬性SCORE對(duì)鍵不存在部分函數(shù)依賴,也不存在傳遞函數(shù)依賴。所以SNC屬于3NF。
但是,因?yàn)镾NO <->SN,即決定因素SNO或SN不包含候選鍵,從另一個(gè)角度說(shuō),存在著主屬性對(duì)鍵的部分函數(shù)依賴: (SNO,CNO)-(p)-> SN,(SN,CNO)-(p)->SNO,所以SNC不是BCNF。
分析:
正是存在著這種主屬性對(duì)鍵的部分函數(shù)依賴關(guān)系,造成了關(guān)系SNC中存在著較大的數(shù)據(jù)冗余,學(xué)生姓名的存儲(chǔ)次數(shù)等于該生所選的課程數(shù)。從而會(huì)引起修改異常。
比如,當(dāng)要更改某個(gè)學(xué)生的姓名時(shí),則必須搜索出現(xiàn)該姓名的每個(gè)學(xué)生記錄,并對(duì)其姓名逐一修改,這樣容易造成數(shù)據(jù)的不一致問(wèn)題。
解決這一問(wèn)題的辦法仍然是通過(guò)投影分解進(jìn)一步提高SNC的范式等級(jí),將SNC規(guī)范到BCNF。
6.BCNF范式的規(guī)范化
BCNF規(guī)范化是指把3NF關(guān)系模式通過(guò)投影分解轉(zhuǎn)換成BCNF關(guān)系模式的集合。
還是上面的例子:
將SNC(SNO,SN,CNO,SCORE)規(guī)范到BCNF。
分析SNC數(shù)據(jù)冗余的原因,是因?yàn)樵谶@一個(gè)關(guān)系中存在兩個(gè)實(shí)體,一個(gè)為學(xué)生實(shí)體,屬性有SNO、SN;另一個(gè)是選課實(shí)體,屬性有SNO、CNO和SCORE。
根據(jù)分解的原則,我們可以將SNC分解成如下兩個(gè)關(guān)系:
S1(SNO,SN),描述學(xué)生實(shí)體;
S2(SNO,CNO,SCORE),描述學(xué)生與課程的聯(lián)系。
對(duì)于S1,有兩個(gè)候選鍵SNO和SN,
對(duì)于S2,主鍵為(SNO,CNO)。
在這兩個(gè)關(guān)系中,無(wú)論主屬性還是非主屬性都不存在對(duì)鍵的部分依賴和傳遞依賴,S1屬于BCNF,S2屬于BCNF。
7.讓我們看一下從1NF到BCNF的轉(zhuǎn)化過(guò)程
下圖是1NF的函數(shù)依賴關(guān)系圖(存在部分依賴以及傳遞依賴)
下圖是2NF函數(shù)依賴關(guān)系圖(消除了部分依賴但是存在傳遞依賴)
下圖是3NF函數(shù)依賴關(guān)系圖(消除了部分依賴和傳遞依賴,但是主屬性對(duì)鍵存在著部分依賴關(guān)系)
下圖是BCNF函數(shù)依賴關(guān)系圖(消除了部分依賴和傳遞依賴,以及主屬性對(duì)鍵的部分依賴關(guān)系)
8.關(guān)系模式的規(guī)范化
定義:
一個(gè)低一級(jí)范式的關(guān)系模式,通過(guò)模式分解轉(zhuǎn)化為若干個(gè)高一級(jí)范式的關(guān)系模式的集合,這種分解過(guò)程叫作關(guān)系模式的規(guī)范化(Normalization)
目的:
規(guī)范化的目的就是使結(jié)構(gòu)合理,消除存儲(chǔ)異常,使數(shù)據(jù)冗余盡量小,便于插入、刪除和更新。
原則:
規(guī)范化的基本原則就是遵從概念單一化“一事一表”的原則,即一個(gè)關(guān)系只描述一個(gè)實(shí)體或者實(shí)體間的聯(lián)系。
規(guī)范化的步驟:
(a).對(duì)1NF關(guān)系進(jìn)行投影,消除原關(guān)系中非主屬性對(duì)鍵的部分函數(shù)依賴,將1NF關(guān)系轉(zhuǎn)換成若干個(gè)2NF關(guān)系。
(b).對(duì)2NF關(guān)系進(jìn)行投影,消除原關(guān)系中非主屬性對(duì)鍵的傳遞函數(shù)依賴,將2NF關(guān)系轉(zhuǎn)換成若干個(gè)3NF關(guān)系。
(c).對(duì)3NF關(guān)系進(jìn)行投影,消除原關(guān)系中主屬性對(duì)鍵的部分函數(shù)依賴和傳遞函數(shù)依賴,也就是說(shuō)使決定因素都包含一個(gè)候選鍵。得到一組BCNF關(guān)系。
規(guī)范化的要求:
關(guān)系模式的規(guī)范化過(guò)程是通過(guò)對(duì)關(guān)系模式的投影分解來(lái)實(shí)現(xiàn)的,但是投影分解方法不是唯一的,不同的投影分解會(huì)得到不同的結(jié)果。
在這些分解方法中,只有能夠保證分解后的關(guān)系模式與原關(guān)系模式等價(jià)的方法才是有意義的。
判斷對(duì)關(guān)系模式的一個(gè)分解是否與原關(guān)系模式等價(jià)可以有三種不同的標(biāo)準(zhǔn):
1.分解要具有無(wú)損連接性。
2.分解要具有函數(shù)依賴保持性。
3.分解既要具有無(wú)損連接性,又要具有函數(shù)依賴保持性。
9.非規(guī)范化設(shè)計(jì)
使用非規(guī)范化設(shè)計(jì)原因:
(a).許多數(shù)據(jù)庫(kù)應(yīng)用強(qiáng)調(diào)性能優(yōu)先
(b).規(guī)范化設(shè)計(jì)有時(shí)會(huì)導(dǎo)致數(shù)據(jù)庫(kù)運(yùn)行效率的下降
(c).在特殊條件和要求下,適當(dāng)?shù)亟档蜕踔翏仐夑P(guān)系模式的范式,不再要求一個(gè)表只描述一個(gè)實(shí)體或者實(shí)體間的一種聯(lián)系。其主要目的在于提高數(shù)據(jù)庫(kù)的運(yùn)行效率。
何時(shí)進(jìn)行非規(guī)范化處理:
(a).大量頻繁的查詢過(guò)程所涉及的表都需要進(jìn)行連接;
(b).主要的應(yīng)用程序在執(zhí)行時(shí)要將表連接起來(lái)進(jìn)行查詢;
(c).對(duì)數(shù)據(jù)的計(jì)算需要臨時(shí)表或進(jìn)行復(fù)雜的查詢。
非規(guī)范化處理的主要技術(shù):
包括增加冗余或派生列,對(duì)表進(jìn)行合并、分割或增加重復(fù)表。
10.增加冗余列(用空間換取時(shí)間)
增加冗余列是指在多個(gè)表中具有相同的列,它常用來(lái)在查詢時(shí)避免連接操作。
舉例:
如果經(jīng)常檢索一門課的任課教師姓名,則需要做class和teacher表的連接查詢:
select classname,teachername
from class,teacher
where class.teacherno=teacher.teacherno
這樣的話就可以在class表中增加一列teacher-name就不需要連接操作了。
增加冗余列可以在查詢時(shí)避免連接操作,但它需要更多的磁盤空間,同時(shí)增加表維護(hù)的工作量。
11.增加派生列
增加派生列指增加的列來(lái)自其它表中的數(shù)據(jù),由它們計(jì)算生成。
它的作用是在查詢時(shí)減少連接操作,避免使用集函數(shù)。派生列也具有與冗余列同樣的缺點(diǎn)。
12.重新組表
重新組表指如果許多用戶需要查看兩個(gè)表連接出來(lái)的結(jié)果數(shù)據(jù),則把這兩個(gè)表重新組成一個(gè)表來(lái)減少連接而提高性能。
舉例:
用戶經(jīng)常需要同時(shí)查看課程號(hào),課程名稱,任課教師號(hào),任課教師姓名,則可把表class(classno,classname,teacherno)和表teacher(teacherno,teachername)合并成一個(gè)表class(classno,classname,teacherno,teachername)。
這種方法可以提高性能,但需要更多的磁盤空間,同時(shí)也損失了數(shù)據(jù)在概念上的獨(dú)立性。
13.對(duì)表進(jìn)行分割
表分割有兩種方式:
水平分割
垂直分割
水平分割:根據(jù)一列或多列數(shù)據(jù)的值把數(shù)據(jù)行放到兩個(gè)獨(dú)立的表中。
水平分割的使用:
(a).表很大,分割后可以降低在查詢時(shí)需要讀的數(shù)據(jù)和索引的頁(yè)數(shù),同時(shí)也降低了索引的層數(shù),提高查詢速度。
(b).表中的數(shù)據(jù)本來(lái)就有獨(dú)立性,例如表中分別記錄各個(gè)地區(qū)的數(shù)據(jù)或不同時(shí)期的數(shù)據(jù),特別是有些數(shù)據(jù)常用,而另外一些數(shù)據(jù)不常用。
(c).需要把數(shù)據(jù)存放到多個(gè)介質(zhì)上。
舉例:
法規(guī)表law就可以分成兩個(gè)表active-law和inactive-law。active-law表中的內(nèi)容是正生效的法規(guī),是經(jīng)常使用的,而inactive-law表則使已經(jīng)作廢的法規(guī),不常被查詢。
水平分割會(huì)給應(yīng)用增加復(fù)雜度,它通常在查詢時(shí)需要多個(gè)表名,查詢所有數(shù)據(jù)需要union操作。在許多數(shù)據(jù)庫(kù)應(yīng)用中,這種復(fù)雜性會(huì)超過(guò)它帶來(lái)的優(yōu)點(diǎn)。
垂直分割:把主鍵和一些列放到一個(gè)表,然后把主鍵和另外的列放到另一個(gè)表中
垂直分割的使用:
如果一個(gè)表中某些列常用,而另外一些列不常用,則可以采用垂直分割加快查詢速度。其缺點(diǎn)是需要管理冗余列,查詢所有數(shù)據(jù)需要join操作。
14.非規(guī)范化設(shè)計(jì)總結(jié)
主要優(yōu)點(diǎn):
(a).減少了查詢操作所需的連接
(b).減少了外部鍵和索引的數(shù)量
(c).可以預(yù)先進(jìn)行統(tǒng)計(jì)計(jì)算,提高了查詢時(shí)的響應(yīng)速度
主要問(wèn)題:
(a).增加了數(shù)據(jù)冗余
(b).影響數(shù)據(jù)庫(kù)的完整性
(c).降低了數(shù)據(jù)更新的速度
(d)增加了存儲(chǔ)表所占用的物理空間
?
?
上一篇數(shù)據(jù)庫(kù)知識(shí)點(diǎn)④:http://www.cnblogs.com/zpfbuaa/p/5522527.html
轉(zhuǎn)載于:https://www.cnblogs.com/zpfbuaa/p/5523163.html
總結(jié)
- 上一篇: AEAI ESB路由转换机制说明
- 下一篇: Redis和Memcached整体