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