2.3 關系數據庫的基礎理論
2.3.1 關系模式規范化
關系模式設計要以關系模式規范化理論為指導,從而減少數據庫中的數據冗余,避免異常操作和避免數據不一致。
關系模式規范化理論包括一系列范式(Normal Forms,NF)。高一級范式所需要的條件包含了低一級范式所需要的條件:如果一個關系模式需要符合第三范式,則其必須符合第一范式和第二范式。關系模式的規范化就是將一個低一級范式的關系模式,通過模式分解轉換為高一級范式的過程。對于大部分關系數據庫設計來說,符合第三范式就可以了。如圖2.12所示的“e學習”系統數據庫的所有關系模式都符合第三范式。
1.第一范式(1NF)
如果關系模式中的每個分量都是不可分的,則其符合1NF。1NF是關系模式的最低要求。
將非1NF關系模式規范化為1NF,需要對列中有分量的屬性進行合并或分割,以保證每個字段都不可分;對行中存在的多個數據值通過擴展主鍵的方法進行記錄分割,以唯一標識一條記錄。
【例2.17】生源表的正確描述。
圖2.18(a)中的生源表出現了“表中有表”的現象,它有兩點不符合1NF的要求:第一,“地區”字段有“省”和“市”兩個分量值;第二,首條記錄的“姓名”字段有多個值。解決的方法是,把地區分成省、市兩列(見圖2.18(b))或合并為一列(見圖2.18(c)),同時設置主鍵,將相關數據項拆分到單條記錄中。

圖2.18 生源表
2.第二范式(2NF)
如果一個關系模式符合1NF,且所有非主鍵屬性都完全依賴于主鍵,則其符合2NF。
2NF適用于有復合主鍵的關系模式。復合主鍵即由兩個或多個屬性組成的主鍵。主鍵為單屬性且滿足1NF的關系模式一定滿足2NF。
如圖2.19所示的關系模式R(學號,姓名,課程名,學分,類別,成績),主鍵為(學號,課程名)。非主鍵屬性“姓名”只依賴于復合主鍵的部分屬性“學號”,而“學分”和“類別”只依賴于“課程名”,不完全依賴于主鍵。因此,關系模式R不滿足2NF。
非2NF的關系模式會引起數據冗余、數據不一致和操作復雜等問題。例如,一門課的學分在多條記錄中重復存儲,修改學分要修改所有相關記錄,不僅操作復雜,而且稍有不慎,可能所有記錄無法保持一致的學分。
將非2NF的關系模式轉化為符合2NF的關系模式,一般采用投影分解的方法,將其分解為兩個或多個關系模式,從而消除非主鍵屬性對主鍵的部分依賴。分解過程如下。
第1步:用主鍵屬性集合的每個子集分別作為主鍵構成一個關系模式。
第2步:將每個屬性分配到它所依賴的最小主鍵對應的關系模式中。
第3步:去掉只由主鍵的子集構成的關系模式。
【例2.18】將R(學號,姓名,課程名,學分,類別,成績)規范化為2NF關系模式。
投影分解步驟如圖2.20所示,得到三個滿足2NF的關系模式:R1(學號,姓名)、R2(課程名,學分,類別)、R3(學號,課程名,成績)。結果如圖2.19所示。
3.第三范式(3NF)
如果一個關系模式符合2NF,且表中任意非主鍵屬性都不傳遞依賴于主鍵,則其符合3NF。
如圖2.21所示的關系模式R(課程名,學分,教師,職稱)是一個非3NF的關系模式。原因是:表中的非主鍵屬性“職稱”并不直接依賴于主鍵“課程名”,而是依賴于非主鍵屬性“教師”,而“教師”依賴于主鍵“課程名”,說明該表存在非主鍵屬性“職稱”傳遞依賴于主鍵“課程名”。

圖2.19 R分解為三個2NF關系模式

圖2.20 R的投影分解步驟
非3NF的關系模式也會出現數據冗余和操作異常等問題。例如,教師張曉蕓開設多門課程,她的職稱也要重復出現多次,造成數據的冗余;若要對職稱進行修改,則可能會出現修改復雜、產生數據不一致等問題。
將非3NF的關系模式轉化為符合3NF的關系模式,也采用投影分解方法,將其分解為兩個或多個關系模式,從而消除非主鍵屬性對主鍵的傳遞依賴。分解過程如下。
第1步:刪除不直接依賴于主鍵的所有屬性,并以每個被依賴屬性作為主鍵新建一個關系模式。
第2步:在新建關系模式中放入所有依賴它的屬性。
【例2.19】將R(課程名,學分,教師,職稱)分解為滿足3NF的關系模式。
投影分解步驟如圖2.22所示,得到兩個滿足3NF的關系模式:R1(課程名,學分,教師)、R2(教師,職稱)。結果如圖2.21所示。

圖2.21 R分解為兩個3NF關系模式

圖2.22 R的投影分解步驟
2.3.2 關系模型運算理論簡介
了解關系模型的數學基礎,對于理解關系模型、設計關系模式和實現應用很有幫助。本節通過實例對關系模型的數學理論基礎—關系代數進行簡要介紹。
1.關系定義
在關系模型中,無論是實體還是實體之間的聯系均由單一的結構類型,即關系(二維表)來表示。下面首先以關系代數中的集合理論引出關系的定義。
(1)域。域是一組具有相同數據類型的值的集合。例如,非負整數、整數、實數、長度小于25字節的字符串集合、{0, l}、大于0且小于100的正整數等都可以是域。
【例2.20】下列三個集合表示三個域。
D1={陳佳迪,徐瑤琪},表示學生的集合。
D2={男,女},表示性別的集合。
D3={上海,浙江,山西},表示地區的集合。
(2)笛卡兒積。為了從集合代數的角度給出關系的定義,這里引入笛卡兒積的概念。
給定一組域D1,D2, …,Dn,則這組域的笛卡兒積為:

從這個定義中可以看出,笛卡兒積得到的也是一個集合,該集合中的每個元素稱為一個元組,簡稱元組。元組中的每個di稱為元組的一個分量,分別取自相應的集合Di。
【例2.21】求例2.20中三個域的笛卡兒積。
D1×D2×D3={(陳佳迪,男,上海), (陳佳迪,男,浙江), (陳佳迪,男,山西), (陳佳迪,女,上海), (陳佳迪,女,浙江), (陳佳迪,女,山西), (徐瑤琪,男,上海), (徐瑤琪,男,浙江), (徐瑤琪,男,山西), (徐瑤琪,女,上海), (徐瑤琪,女,浙江), (徐瑤琪,女,山西)}。
D1×D2×D3共有12個元組,它組成了一個以元組為元素的集合,形成一個二維表(見圖2.23)。由此可見,笛卡兒積可以表示一個二維表。

圖2.23 笛卡兒積形成的二維表
(3)關系。笛卡兒積D1×D2×…×Dn的任意一個子集稱為D1, D2, …, Dn上的一個n元關系,通常用R(D1, D2, …, Dn)表示,這里為關系名,
是關系的度。關系也是一個集合,它的元素為元組。關系可以直觀地用一個二維表表示,表的每行對應一個元組,表的每列對應一個域。由于域可以相同,為了加以區分,應為每列起一個名字,稱為屬性。顯然,
元關系必有n個屬性。
【例2.22】用例2.21中笛卡兒積的一個子集構造一個關系。
陳佳迪、徐瑤琪是兩個學生的姓名,他們的性別都在D2域內,地區在D3域內,從圖2.23中笛卡兒積的12個元組中必能找出符合他們實際情況的兩個元組,用二維表來表示如圖2.24所示。
在實際應用中,關系是從笛卡兒積中選取的有意義的子集。圖2.24中的兩個元組是圖2.23中笛卡兒積的一個子集,構成了名為“學生”的關系模式,記為學生(姓名,性別,地區)。其中,“學生”為關系名,“姓名”“性別”“地區”均為屬性名。

圖2.24 學生表
2.關系運算
關系運算是以集合為基礎的各種運算,可以支持對關系模型的操作要求,也是關系數據庫查詢語言的理論基礎。關系運算包括傳統的集合運算和面向數據庫的專門關系運算。
(1)傳統的集合運算
在傳統的集合運算中,參加運算的集合以元組(記錄)作為它的元素,其運算是從行的角度來進行的。這些運算都是二元運算,由兩個關系產生一個新的關系,主要包括并、交、差和笛卡兒積。
如果關系R和S具有相同或相容的關系模式(相容指兩個關系有相同的屬性結構,且對應屬性的值域相同),則R和S可進行并、交、差運算。在圖2.25中,文學社表R(見圖2.25(a))與合唱團表S(見圖2.25(b))有相同的關系模式。
1)并運算
關系R和S的并運算的形式化表示為:

關系R和S的并運算結果由屬于和屬于S的所有元組組成,其結果關系的屬性的個數與R或S相同。并運算實現了數據記錄的合并,即向表中插入數據記錄的操作。
【例2.23】文學社表R和合唱團表S的并運算。
圖2.25(d)為R和S并運算的結果,包含文學社和合唱團的所有學生記錄。
2)交運算
關系R和S的交運算的形式化表示為:

關系R和S的交運算結果由既屬于R又屬于S的元組組成,其結果關系的屬性的個數與R或S相同。交運算獲得兩個關系中相同的記錄。
【例2.24】文學社表R和合唱團表S的交運算。
圖2.25(e)為R和S交運算的結果,僅包含既參加文學社又參加合唱團的學生記錄。
3)差運算
關系R和S差運算的形式化表示為:

關系R和S的差運算結果由屬于R但不屬于S的元組組成,其結果關系的屬性的個數與R或S相同。差運算實現了從表中刪除數據記錄的操作。
【例2.25】文學社表R和合唱團表S的差運算。
圖2.25(f)為R和S差運算的結果,包含只參加文學社未參加合唱團的學生記錄。
4)笛卡兒積
笛卡兒積也是二元運算,但與并、交、差運算不同,它不要求參加運算的兩個關系模式相同或相容。關系R和U的笛卡兒積運算的形式化表示:

一個列的關系R和一個
列的關系U的笛卡兒積是一個
列的元組的集合,元組的前
列是關系R的一個元組,后
列是關系U的一個元組。若R有k1個元組,U有k2個元組,則關系
和關系U的笛卡兒積有k1×k2個元組。笛卡兒積運算獲得兩個關系中記錄的連接。
【例2.26】文學社表R和選課表U的笛卡兒積運算。
圖2.25(c)為選課表U。圖2.25(g)為R和U的笛卡兒積運算的結果,是文學社表與選課表數據記錄的連接。但有些連接數據沒有意義,因為運算實現的是不同學生的選課記錄與所有學生記錄的連接,進一步選取學號相等的元組就有實際意義了。

圖2.25 關系運算舉例
(2)專門的關系運算
這種運算是為關系模型而引進的特殊運算,它主要從列的角度即屬性的角度來進行運算,但有時也會對行有影響。專門的關系運算主要包括選擇、投影、連接等。
1)選擇
選擇操作是一元運算,它在關系中選擇滿足某些條件的元組,即在表中選擇滿足某些條件的記錄行。因此選擇操作得到的關系模式與原來關系模式的定義相同,只是數據是原數據的子集。選擇操作是對關系的水平分割,實現了依據條件查詢數據記錄的操作。
關系R關于選擇條件F的選擇操作記為:

【例2.27】文學社表R的選擇運算:找出所有男學生。
若要在文學社表中找出所有性別是“男”的學生,就可以對學生表做選擇操作,條件是:“性別等于"男"”,操作記為。圖2.25(h)為運算結果。
2)投影
投影操作是一元運算,它在關系中選擇某些屬性,因此選擇結果的關系是原關系的子集。選擇操作是對關系的垂直分割,實現了查詢包含部分屬性的記錄集合的操作。
關系R是元關系,R在其分量集合A中的投影操作記為:

【例2.28】文學社表R的投影運算:查看成員的姓名和性別。
若只要查看文學社學生的姓名、性別,就可以對文學社表做投影操作,選擇表中的“姓名”和“性別”列,操作記為。圖2.25(i)為運算結果。
3)連接
連接操作是二元運算,指從兩個關系的笛卡兒積中選取滿足一定條件的元組。
【例2.29】文學社表R和選課表U的連接運算。
關系R和關系U做連接操作,連接條件是,即在圖2.25(g)的笛卡兒積中選取滿足R中“學號”屬性值和U中“學號”屬性值相等的元組,得到的結果如圖2.25(j)所示。該連接結果反映了學生及其所選課程的信息,與實際情況相符合。連接運算實現了針對多表的聯合查詢操作。
連接條件中的屬性稱為連接屬性,兩個關系中的連接屬性應該是可比的,即:是同一種數據類型的。例如,都是數字型的或都是字符型的。連接條件中的運算符為比較運算符,當此運算符取“=”時,稱為等值連接,圖2.25(j)是關系R和S做等值連接后得到的結果關系。運算符也可以是=、>、>=、<、<=、<>(不等于)。
如果等值連接中連接屬性為相同屬性(或屬性組),而且在結果關系中去掉重復屬性,則此等值連接稱為自然連接。圖2.25(k)是關系R和S做自然連接后得到的結果關系。自然連接是最常用的連接。
- 達夢數據庫編程指南
- 劍破冰山:Oracle開發藝術
- Developing Mobile Games with Moai SDK
- Voice Application Development for Android
- 計算機信息技術基礎實驗與習題
- 企業級數據與AI項目成功之道
- Chef Essentials
- Access數據庫開發從入門到精通
- Delphi High Performance
- Learning Ansible
- Artificial Intelligence for Big Data
- SQL Server 2012 數據庫教程(第3版)
- SQL Server 數據庫教程(2008版)
- Tableau商業分析從新手到高手(視頻版)
- 數據時代的品牌智造