1.第三範式 定義 如果關係模式R屬於2NF,且每個非主屬性都不傳遞依賴於R的每個關係鍵,則稱R屬於第三範式(Third Normal Form),簡稱3NF,記作R屬於3NF。 基本性質: 1.如果R屬於3NF,則R也是2NF。 2.如果R屬於2NF,則R不一定是3NF。 例如,我們前面由關係模式 ...
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)增加了存儲表所占用的物理空間