官术网_书友最值得收藏!

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)),同時設置主鍵,將相關數據項拆分到單條記錄中。

img

圖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的關系模式。原因是:表中的非主鍵屬性“職稱”并不直接依賴于主鍵“課程名”,而是依賴于非主鍵屬性“教師”,而“教師”依賴于主鍵“課程名”,說明該表存在非主鍵屬性“職稱”傳遞依賴于主鍵“課程名”。

img

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

img

圖2.20 R的投影分解步驟

非3NF的關系模式也會出現數據冗余和操作異常等問題。例如,教師張曉蕓開設多門課程,她的職稱也要重復出現多次,造成數據的冗余;若要對職稱進行修改,則可能會出現修改復雜、產生數據不一致等問題。

將非3NF的關系模式轉化為符合3NF的關系模式,也采用投影分解方法,將其分解為兩個或多個關系模式,從而消除非主鍵屬性對主鍵的傳遞依賴。分解過程如下。

第1步:刪除不直接依賴于主鍵的所有屬性,并以每個被依賴屬性作為主鍵新建一個關系模式。

第2步:在新建關系模式中放入所有依賴它的屬性。

【例2.19】將R(課程名,學分,教師,職稱)分解為滿足3NF的關系模式。

投影分解步驟如圖2.22所示,得到兩個滿足3NF的關系模式:R1(課程名,學分,教師)、R2(教師,職稱)。結果如圖2.21所示。

img

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

img

圖2.22 R的投影分解步驟

2.3.2 關系模型運算理論簡介

了解關系模型的數學基礎,對于理解關系模型、設計關系模式和實現應用很有幫助。本節通過實例對關系模型的數學理論基礎—關系代數進行簡要介紹。

1.關系定義

在關系模型中,無論是實體還是實體之間的聯系均由單一的結構類型,即關系(二維表)來表示。下面首先以關系代數中的集合理論引出關系的定義。

(1)域。域是一組具有相同數據類型的值的集合。例如,非負整數、整數、實數、長度小于25字節的字符串集合、{0, l}、大于0且小于100的正整數等都可以是域。

【例2.20】下列三個集合表示三個域。

D1={陳佳迪,徐瑤琪},表示學生的集合。

D2={男,女},表示性別的集合。

D3={上海,浙江,山西},表示地區的集合。

(2)笛卡兒積。為了從集合代數的角度給出關系的定義,這里引入笛卡兒積的概念。

給定一組域D1,D2, …,Dn,則這組域的笛卡兒積為:

img

從這個定義中可以看出,笛卡兒積得到的也是一個集合,該集合中的每個元素稱為一個img元組,簡稱元組。元組中的每個di稱為元組的一個分量,分別取自相應的集合Di

【例2.21】求例2.20中三個域的笛卡兒積。

D1×D2×D3={(陳佳迪,男,上海), (陳佳迪,男,浙江), (陳佳迪,男,山西), (陳佳迪,女,上海), (陳佳迪,女,浙江), (陳佳迪,女,山西), (徐瑤琪,男,上海), (徐瑤琪,男,浙江), (徐瑤琪,男,山西), (徐瑤琪,女,上海), (徐瑤琪,女,浙江), (徐瑤琪,女,山西)}。

D1×D2×D3共有12個元組,它組成了一個以元組為元素的集合,形成一個二維表(見圖2.23)。由此可見,笛卡兒積可以表示一個二維表。

img

圖2.23 笛卡兒積形成的二維表

(3)關系。笛卡兒積D1×D2×…×Dn的任意一個子集稱為D1, D2, …, Dn上的一個n元關系,通常用R(D1, D2, …, Dn)表示,這里img為關系名,img是關系的度。關系也是一個集合,它的元素為元組。關系可以直觀地用一個二維表表示,表的每行對應一個元組,表的每列對應一個域。由于域可以相同,為了加以區分,應為每列起一個名字,稱為屬性。顯然,img元關系必有n個屬性。

【例2.22】用例2.21中笛卡兒積的一個子集構造一個關系。

陳佳迪、徐瑤琪是兩個學生的姓名,他們的性別都在D2域內,地區在D3域內,從圖2.23中笛卡兒積的12個元組中必能找出符合他們實際情況的兩個元組,用二維表來表示如圖2.24所示。

在實際應用中,關系是從笛卡兒積中選取的有意義的子集。圖2.24中的兩個元組是圖2.23中笛卡兒積的一個子集,構成了名為“學生”的關系模式,記為學生(姓名,性別,地區)。其中,“學生”為關系名,“姓名”“性別”“地區”均為屬性名。

img

圖2.24 學生表

2.關系運算

關系運算是以集合為基礎的各種運算,可以支持對關系模型的操作要求,也是關系數據庫查詢語言的理論基礎。關系運算包括傳統的集合運算和面向數據庫的專門關系運算。

(1)傳統的集合運算

在傳統的集合運算中,參加運算的集合以元組(記錄)作為它的元素,其運算是從行的角度來進行的。這些運算都是二元運算,由兩個關系產生一個新的關系,主要包括并、交、差和笛卡兒積。

如果關系RS具有相同或相容的關系模式(相容指兩個關系有相同的屬性結構,且對應屬性的值域相同),則RS可進行并、交、差運算。在圖2.25中,文學社表R(見圖2.25(a))與合唱團表S(見圖2.25(b))有相同的關系模式。

1)并運算

關系RS的并運算的形式化表示為:

img

關系RS的并運算結果由屬于img和屬于S的所有元組組成,其結果關系的屬性的個數與RS相同。并運算實現了數據記錄的合并,即向表中插入數據記錄的操作。

【例2.23】文學社表R和合唱團表S的并運算。

圖2.25(d)為RS并運算的結果,包含文學社和合唱團的所有學生記錄。

2)交運算

關系RS的交運算的形式化表示為:

img

關系RS的交運算結果由既屬于R又屬于S的元組組成,其結果關系的屬性的個數與RS相同。交運算獲得兩個關系中相同的記錄。

【例2.24】文學社表R和合唱團表S的交運算。

圖2.25(e)為RS交運算的結果,僅包含既參加文學社又參加合唱團的學生記錄。

3)差運算

關系RS差運算的形式化表示為:

img

關系RS的差運算結果由屬于R但不屬于S的元組組成,其結果關系的屬性的個數與RS相同。差運算實現了從表中刪除數據記錄的操作。

【例2.25】文學社表R和合唱團表S的差運算。

圖2.25(f)為RS差運算的結果,包含只參加文學社未參加合唱團的學生記錄。

4)笛卡兒積

笛卡兒積也是二元運算,但與并、交、差運算不同,它不要求參加運算的兩個關系模式相同或相容。關系RU的笛卡兒積運算的形式化表示:

img

一個img列的關系R和一個img列的關系U的笛卡兒積是一個img列的元組的集合,元組的前img列是關系R的一個元組,后img列是關系U的一個元組。若Rk1個元組,Uk2個元組,則關系img和關系U的笛卡兒積有k1×k2個元組。笛卡兒積運算獲得兩個關系中記錄的連接。

【例2.26】文學社表R和選課表U的笛卡兒積運算。

圖2.25(c)為選課表U。圖2.25(g)為RU的笛卡兒積運算的結果,是文學社表與選課表數據記錄的連接。但有些連接數據沒有意義,因為運算實現的是不同學生的選課記錄與所有學生記錄的連接,進一步選取學號相等的元組就有實際意義了。

img

圖2.25 關系運算舉例

(2)專門的關系運算

這種運算是為關系模型而引進的特殊運算,它主要從列的角度即屬性的角度來進行運算,但有時也會對行有影響。專門的關系運算主要包括選擇、投影、連接等。

1)選擇

選擇操作是一元運算,它在關系中選擇滿足某些條件的元組,即在表中選擇滿足某些條件的記錄行。因此選擇操作得到的關系模式與原來關系模式的定義相同,只是數據是原數據的子集。選擇操作是對關系的水平分割,實現了依據條件查詢數據記錄的操作。

關系R關于選擇條件F的選擇操作記為:

img

【例2.27】文學社表R的選擇運算:找出所有男學生。

若要在文學社表中找出所有性別是“男”的學生,就可以對學生表做選擇操作,條件是:“性別等于"男"”,操作記為img。圖2.25(h)為運算結果。

2)投影

投影操作是一元運算,它在關系中選擇某些屬性,因此選擇結果的關系是原關系的子集。選擇操作是對關系的垂直分割,實現了查詢包含部分屬性的記錄集合的操作。

關系Rimg元關系,R在其分量集合A中的投影操作記為:

img

【例2.28】文學社表R的投影運算:查看成員的姓名和性別。

若只要查看文學社學生的姓名、性別,就可以對文學社表做投影操作,選擇表中的“姓名”和“性別”列,操作記為img。圖2.25(i)為運算結果。

3)連接

連接操作是二元運算,指從兩個關系的笛卡兒積中選取滿足一定條件的元組。

【例2.29】文學社表R和選課表U的連接運算。

關系R和關系U做連接操作,連接條件是img,即在圖2.25(g)的笛卡兒積中選取滿足R中“學號”屬性值和U中“學號”屬性值相等的元組,得到的結果如圖2.25(j)所示。該連接結果反映了學生及其所選課程的信息,與實際情況相符合。連接運算實現了針對多表的聯合查詢操作。

連接條件中的屬性稱為連接屬性,兩個關系中的連接屬性應該是可比的,即:是同一種數據類型的。例如,都是數字型的或都是字符型的。連接條件中的運算符為比較運算符,當此運算符取“=”時,稱為等值連接,圖2.25(j)是關系RS做等值連接后得到的結果關系。運算符也可以是=、>、>=、<、<=、<>(不等于)。

如果等值連接中連接屬性為相同屬性(或屬性組),而且在結果關系中去掉重復屬性,則此等值連接稱為自然連接。圖2.25(k)是關系RS做自然連接后得到的結果關系。自然連接是最常用的連接。

主站蜘蛛池模板: 荆州市| 积石山| 永寿县| 保山市| 绍兴市| 九龙县| 灯塔市| 枣阳市| 囊谦县| 辽中县| 老河口市| 恭城| 吉林省| 泽库县| 宜黄县| 双柏县| 自贡市| 健康| 即墨市| 天津市| 辽宁省| 海安县| 长岭县| 文安县| 娱乐| 谢通门县| 黑水县| 修水县| 如皋市| 乌什县| 开平市| 红桥区| 桐柏县| 乐清市| 昂仁县| 诸暨市| 镶黄旗| 绩溪县| 富源县| 阿克陶县| 云和县|