對關(guān)系數(shù)據(jù)庫進行查詢統(tǒng)計時,需要查詢到用戶感興趣的數(shù)據(jù),這就需要對關(guān)系及關(guān)系間進行一定的運算。本篇主要講述關(guān)系運算和關(guān)系的完整性約束,理解關(guān)系操作的含義,了解傳統(tǒng)的集合運算,掌握關(guān)系代數(shù)中基本關(guān)系運算。通過本篇的學(xué)習(xí),讀者應(yīng)該能掌握以下內(nèi)容:
● 集合的合并、交集、求差、乘積操作
● 關(guān)系運算的選擇、投影、連接操作
● 關(guān)系的完整性約束
● 關(guān)系的范式
關(guān)系運算
關(guān)系模型是目前用的最多的數(shù)據(jù)模型,具有嚴格的數(shù)學(xué)理論基礎(chǔ),其主要數(shù)學(xué)理論基礎(chǔ)就是集合運算。關(guān)系模型提供了一系列操作的定義,這些操作稱為關(guān)系代數(shù)操作。它可分為兩類,一類是集合操作;另一類是關(guān)系專用的操作。
1、集合操作
集合操作是把關(guān)系看作元組的集合來進行傳統(tǒng)的集合運算,其運算結(jié)果仍是關(guān)系,前提是參與運算的兩個元組具有相同的結(jié)構(gòu),即含有相同的屬性,且對應(yīng)屬性的值域相同。下面對傳統(tǒng)的集合運算合并、交集、求差、乘積運算進行逐一說明。
集合運算——合并
假設(shè)有A、B兩個集合
A = {1,3,5,9}, B = {2,3,5,7}
由所有屬于集合A或?qū)儆诩螧的元素組成的集合,叫做集合A與集合B的合并,也稱為集合A與集合B的并集,記作:
A U B = {1,2,3,5,7,9}
由此可以推出,設(shè)R和S是兩個關(guān)系,則R U S是合并R和S,合并后的結(jié)果仍是關(guān)系,結(jié)果表中的元組或?qū)儆赗,或?qū)儆赟,如圖2-10所示:
圖 2-10 集合的合并運算
集合運算——交集
假設(shè)有A、B兩個集合
A = {1,3,5,9}, B = {2,3,5,7}
由所有屬于集合A且屬于集合B的元素組成的集合,叫做集合A與集合B的交集,記作:
A n B = {3,5}
由此可以推出,設(shè)R和S是兩個關(guān)系,則R n S是R和S的交集,求交后的結(jié)果仍是關(guān)系,結(jié)果表中的元組屬于R且屬于S,如圖2-11所示:
圖 2-11 集合的交集運算
集合運算——求差
假設(shè)有A、B兩個集合
A = {1,3,5,9}, B = {2,3,5,7}
由所有屬于集合A且不屬于集合B的元素組成的集合,叫做集合A與集合B的差,記作:
A - B = {1,9}
由此可以推出,設(shè)R和S是兩個關(guān)系,則R - S是求R和S的差,求差后的結(jié)果仍是關(guān)系,結(jié)果表中的元組屬于R且不屬于S,如圖2-12所示:
圖 2-12 集合的求差運算
集合運算——乘積
假設(shè)有A、B兩個集合
A = {1,3,5}, B = {2,3}
用A中元素為第一元素,B中元素為第二元素構(gòu)成有序?qū)Γ羞@樣的有序?qū)M成的集合叫做A與B的乘積(笛卡爾乘積),記作:
A X B = {(1,2),(1,3),(3,2),(3,3),(5,2),(5,3)}
由此可以推出,設(shè)R和S是兩個關(guān)系,則R X S是求R和S的笛卡爾乘積,結(jié)果表是R和S的結(jié)構(gòu)之連接,即前n個屬性來自R,后m個屬性來自S,屬性個數(shù)等于n+m。結(jié)果表的值是由R中的每個元組連接S中的每個元組構(gòu)成元組的集合。如圖2-13所示:
圖 2-13 集合的乘積運算
2、專門的關(guān)系運算
專門的關(guān)系運算包括選擇、投影、連接和除四種運算。下面介紹常用的三種運算選擇、投影和連接。
選擇運算
選擇運算是單目運算,它從一個關(guān)系R中選擇出滿足給定條件的所有元組,并同R具有相同的結(jié)構(gòu)。圖2-14所示為由關(guān)系R選出編號為02的老師。
圖 2-14 專門關(guān)系運算—選擇運算
投影運算
投影運算也是單目運算,它從一個關(guān)系R所有屬性中選擇某些指定屬性,組成一個新的關(guān)系。選擇運算選取關(guān)系的某些行,而投影運算選取關(guān)系的某些列,是從一個關(guān)系出發(fā)構(gòu)造其垂直子集的運算。圖2-15所示為由關(guān)系R中選出所有老師的姓名和簡介。
圖 2-15 專門關(guān)系運算—投影運算
連接運算
連接運算屬于二目運算,是從兩個關(guān)系元組的所有組合中選取滿足一定條件的元組,由這些元組形成連接運算的結(jié)果關(guān)系,其中條件表達式涉及到兩個關(guān)系中屬性的比較,該表達式的取值為真或假。圖2-16所示為對課程表和老師表在老師編號相等的條件下進行了連接,在新的關(guān)系中僅選出名稱、姓名兩個屬性,即在新關(guān)系中再進行一次投影運算,這樣得到了所有老師編號為01的課程名稱和老師姓名。
圖 2-16 專門關(guān)系運算—連接運算
關(guān)系的完整性
關(guān)系模型的完整性主要分為以下四類。
(1)域完整性。關(guān)系模型中,每列屬性的取值應(yīng)是域所確定的值。即屬性的取值范圍應(yīng)在其值集或值域內(nèi)。例如在課程表中,名稱屬性值是漢字或英文字符串,所以不能取出數(shù)值來,同時,名稱是課程的主要特征,要求必須有課程名稱,即名稱屬性不能為空。
(2)實體完整性。關(guān)系模型中每一個表就是一個實體,在現(xiàn)實世界中,實體是可區(qū)分的,即它們具有唯一標識。實體映射到關(guān)系模型后,每個表也應(yīng)該具有唯一的標識,這個標識稱為主鍵,用于標識表中唯一的元組。主鍵不能為空,如果主鍵為空,則說明存在某個不可標識的實體,而這和唯一標識相矛盾,即不存在這樣的實體。
(3)參照完整性。實體完整性是一個表內(nèi)的約束數(shù)據(jù)庫參照完整性,參照完整性是在不同表之間或同一表的不同元組之間的約束。例如課程表中的老師編號屬性給出了老師的編號,但在課程表中并沒有老師的信息,要想得到老師的信息,就必須通過表中的老師編號到老師表中去查找。由于編號在老師表中是主鍵,這樣能夠找到唯一的一行與該老師編號相對應(yīng)。對于老師表中的編號屬性來說,通常定義是該表的外關(guān)鍵字,簡稱外鍵,同時,編號屬性也是老師表的主鍵。如圖2-17所示:
圖 2-17 老師表與課程表的參照約束
從上圖可以看出,課程表中老師編號屬性的每一個值都能在老師表中找到唯一的一行元組,即能找到唯一的老師與其對應(yīng),則稱為參照是完整的,否則,則稱為參照不完整的。
(4)用戶定義的完整性。用戶定義的完整性用于滿足用戶對數(shù)據(jù)的語義要求,是由用戶對數(shù)據(jù)庫施加的約束條件。例如,課程視頻長度不能超過30分鐘、老師必須具備專業(yè)知識等約束條件。
關(guān)系模型的規(guī)范化
關(guān)系模型的規(guī)范化是指面對一個現(xiàn)實問題,如何選擇一個比較好的關(guān)系模式集合。
當一個關(guān)系模式設(shè)計的不夠規(guī)范時,就會出現(xiàn)插入異常、刪除異常、冗余過多等問題。例如圖2-18學(xué)生選課表中,其中編號、姓名屬性是表的主鍵,在實際應(yīng)用中,該表會存在插入、刪除、冗余過多等異常。
圖 2-18 學(xué)生選課表
(1)插入異常。比如一個剛剛成立的系,但尚未招收學(xué)生,則因?qū)傩跃幪枴⑿彰麨榭眨瑢?dǎo)致系名、系主任等信息無法存入數(shù)據(jù)庫;同樣,沒被學(xué)生選修的課程也無法存入數(shù)據(jù)庫。
(2)刪除異常。如一個系的學(xué)生畢業(yè)了,刪除學(xué)生記錄時會將系主任、系名等信息一起刪除。
(3)冗余過多。如一個系的系名、系主任姓名都有與該系學(xué)生每門課的成績出現(xiàn)的次數(shù)一樣多。既浪費存儲空間又要付出很大的代價來維護數(shù)據(jù)庫的完整性。當系主任更換后,必須逐一修改該系學(xué)生選修課程的每一個元組。
從上面的例子可以看出,一個好的關(guān)系模式不應(yīng)當發(fā)生插入異常和刪除異常,且數(shù)據(jù)冗余盡可能地少。引起數(shù)據(jù)冗余及其操作異常的原因在于關(guān)系的結(jié)構(gòu)。現(xiàn)實世界中的許多事物都可以獨立存在、獨立地被標識、相互間又密切關(guān)聯(lián)。如果將多個本該是獨立存在地、具有不同標識的事物用一個關(guān)系描述,那么不可能找到這樣一個屬性集,它既是這個關(guān)系的標識,又是包含在其中的各個不同事物的標識,正是由于關(guān)系模式的屬性之間存在過多的數(shù)據(jù)依賴,從而出現(xiàn)了數(shù)據(jù)冗余和更新的異常。
數(shù)據(jù)依賴是指關(guān)系中屬性值之間的相互聯(lián)系,它是現(xiàn)實世界屬性間相互聯(lián)系的體現(xiàn),是數(shù)據(jù)之間的內(nèi)在聯(lián)系,是語義的體現(xiàn)。現(xiàn)在人們已經(jīng)提出了許多種類型的數(shù)據(jù)依賴,其中最重要的是函數(shù)依賴。
函數(shù)依賴比較容易理解,且普遍地存在于現(xiàn)實生活中。在學(xué)生選課表中,因一個編號僅對應(yīng)一個學(xué)生,一個學(xué)生只在一個系注冊學(xué)習(xí)。因而,當編號的值確定后,姓名和所在系的值也就唯一確定了。當關(guān)系模式屬性間存在這個關(guān)系時,我們就說姓名和所在系的值依賴于學(xué)號,即編號決定姓名和系名。
在學(xué)生選課表中除了姓名和系名依賴編號外數(shù)據(jù)庫參照完整性,還存在其它數(shù)據(jù)依賴,如一個系只有一個系主任,因此系名依賴于系主任;再如,每個學(xué)生學(xué)習(xí)一門課都有一個成績,因此成績依賴于學(xué)號和課程名稱。因為學(xué)生選課表中數(shù)據(jù)依賴過多,導(dǎo)致發(fā)生更新異常和數(shù)據(jù)冗余問題。
解決辦法是將關(guān)系模式分解成若干只有單一數(shù)據(jù)依賴的關(guān)系模式,因為關(guān)系模式學(xué)生選課表出現(xiàn)異常問題是由于屬性之間存在過多的數(shù)據(jù)依賴造成的,分解的目的就是減少屬性間過多的數(shù)據(jù)依賴,已期消除關(guān)系模式中出現(xiàn)的異常。學(xué)生選課表關(guān)系模式分解成如圖2-19所示的三個表。
圖 2-19 規(guī)范化后的三個關(guān)系表
學(xué)生選課表規(guī)范化后,分解為學(xué)生表、成績表、系表三個表,解決了關(guān)系模式多數(shù)據(jù)依賴的問題,每個表都是單一的數(shù)據(jù)依賴。規(guī)范化后雖然解決了數(shù)據(jù)冗余、更新異常的問題,但檢索效率明顯降低了,需要多表查詢。因此,一個關(guān)系是否要進行規(guī)范化,應(yīng)當本著具體問題具體分析的原則進行處理。事實上,如果在一個關(guān)系上主要執(zhí)行的是查詢操作,未必一定要規(guī)范化,通過適當?shù)卦黾右恍╆P(guān)系或者在應(yīng)用程序中注意到更新一致性的維護,非規(guī)范化的弊端是可以避免的。但是,如果在關(guān)系上要進行頻繁的更新操作,還是要采用規(guī)范化的方式比較好。
關(guān)系的范式
前面討論了關(guān)系模式?jīng)]有規(guī)范化所引起的異常問題,因此規(guī)范化對數(shù)據(jù)庫設(shè)計有著重要的意義。所以建立科學(xué)的,規(guī)范的數(shù)據(jù)庫是需要滿足一些約束條件的,在關(guān)系型數(shù)據(jù)庫中這些約束條件被稱為范式。根據(jù)一個關(guān)系滿足數(shù)據(jù)依賴程度的不同,人們提出了第一范式(1NF)、第二范式(2NF)、第三范式(3NF)。當然從理論上研究還有其他范式,但實際意義不大,這里不作討論。
(1)第一范式(1NF)。表中所有的屬性都是不可再分的。如學(xué)生選課表中系名和系主任就不能合并為一個屬性,因為違反了第一范式。當前所有的關(guān)系數(shù)據(jù)庫都支持第一范式,即要求表屬性都是原子屬性,即屬性的不可分性。
(2)第二范式(2NF)。要求在滿足第一范式的前提下,除去所有不完全依賴于主鍵的屬性(部分依賴)。如學(xué)生選課表中,就存在不滿足第二范式的問題,系名和系主任屬性部分依賴于編號屬性(主鍵),因此存在更新異常、數(shù)據(jù)冗余的問題。第二范式要求所有非主屬性(不屬于主鍵的屬性)都完全依賴于主鍵。
(3)第三范式(3NF)。要求關(guān)系在滿足第二范式的前提下,除去所有傳遞依賴于主鍵的屬性,即關(guān)系中不含有對主鍵的傳遞依賴。傳遞依賴就是間接依賴。例如在關(guān)系R(學(xué)號,宿舍,費用)中,費用就間接依賴于學(xué)號。