關系模型數據庫系統的數據結構簡單,表示數據及其數據之間的聯系均采用關系(二維表),同時關系模型有扎實的數學理論做基礎,使得數據的操作可以通過關系的運算來完成。
關系及關系模型
關系是數學上的一個概念,建立在日常生活中所論及的關系概念之上,例如我們通常所說的鄰里關系、朋友關系、學生與所選修的課程及該課程的成績關系等。在這里我們所論及的朋友關系涉及到了互為朋友的雙方,在數學上可表示為(張,李);鄰里關系也涉及到了互為鄰里的雙方,表示為(李家,張家);學生與所選修的課程及該課程的成績關系,涉及到學生、所選的課程以及所取得的成績,在數學上表示為(李蘭,軟件基礎,90)。(李,張)、(李家,張家)、(李蘭,軟件基礎,90)在數學上稱為元組,括號里用逗號隔開的對象,數學上稱為元組的分量。
數學上關系的概念是日常生活中關系概念的抽象,下面給出關系的簡單、直觀的概念:
1.關系
關系是以元組為元素的集合。數據庫技術中論及的關系概念應該是:關系是同類型元組的結合。
簡單說,關系就是集合,可以用大寫字母R1,R2,R來表示。
范例:學生與所選課程之間的關系R可以表示為:
R={(李蘭,軟件基礎,90),(張娜,高等數學,87),(張偉,C語言,76),…,(韶華,英語,79)}
這樣的一個關系R,在日常生活中可通常表示成一個表格的形式:
姓名 |
課程名 |
成績 |
李蘭 |
軟件基礎 |
90 |
張娜 |
高等數學 |
87 |
張偉 |
C語言 |
76 |
… |
… |
… |
韶華 |
英語 |
79 |
我們可以看到,這張表表示一個關系,表中的每一行表示一個元組,也就是關系集合的元素,表格中每列的數據表示元組的分量。
2.關系模型
從上面的例子中可以看到,數學上關系的概念可以用來描述一個二維表,而二維表就是我們現實世界中進行各種檔案管理使用的方法,其中記錄了大量的數據。這樣就用數學理論中的一個概念描述了現實世界的一個對象。關系型數據庫就是用關系描述數據的數據庫系統。
(1)二維表與關系
關系可以用來描述二維表,對應的術語是:
- 關系←→二維表;
- 元組←→二維表中的行
- 分量←→二維表中的列
(2)二維表與關系型數據庫中的數據
一個關系型數據庫中的數據對應於一個二維表,其中對應的術語是:
- 二維表←→一個數據庫中的表、一個數據視圖
- 二維表的行←→數據表中的記錄
- 二維表的列←→表記錄的字段
范例:
這里的教學管理系統的E-R模型圖,其中實體“學生”的屬性為學號,姓名、年齡、性別,分別用S#,SNAME,AGE,SEX表示,實體“課程”的屬性為課程號,課程名,授課教師,分別用C#,CNAME,TEACHER表示,實體學生用S表示,課程用C表示,學生與課程之間的關系用SC表示,SC的屬性成績用GRADE表示。
用關系描述教學管理模型的數據:
分析:在這個E-R圖中,實體有學生和課程兩個,兩個實體之間的聯系是多對多的,按照將E-R模型轉換成關系模型的轉換方法,由於學生實體與課程實體之間的聯系是多對多的,所以轉換成關系模型時,實體和聯系分別轉換為關系模式:
S(S#,SNAME,AGE,SEX)
C(C#,CNAME,TEACHER)
SC(S#,C#,GRADE)
這些關系模式集可以描述三類關系,下面是這三類關系模式的關系實例:
上面的三個關系中,關系S的關鍵字是:S#(學號),關系C的關鍵字是:C#(課程號),關系SC的關鍵字是:S#+C#(學號+課程號)。關鍵字是能唯一標識記錄的字段或字段表達式。這樣我們就將現實世界(教學管理系統)用S、C、SC三個關系模式描述清楚了。
(3)關系模型的三類完整性規則
關系描述了現實世界中的數據,這些數據以數據庫(表)的形式存儲到計算機中,根據現實世界的變化,計算機中的數據也要進行相應的改變。為了維護數據庫數據與現實世界數據的一致性,關系數據庫中的數據的建立與數據的更新必須遵守以下規則:
- 實體完整性規則:實體完整性規則要求關系中,記錄關鍵字的字段不能為空,不同記錄的關鍵字,字段值也不能相同,否則,關鍵字就失去了唯一標識記錄的作用。
- 參照完整性規則:參照完整性規則要求關系中“不引用不存在的實體。”
例如在聯系關系SC中課程號字段出現的課程號,必須在課程關系中存在,假如在關系C中找不到“小學算術”這個課程的課程號,而SC中出現了記錄:(李冰,CC01(小學算術),95),那么這條記錄就是一條錯誤的記錄,因為它違背了參照完整性規則
參照完整性規則可以理解如下:
如果屬性集K是關系模式R1的關鍵字,K也是關系模式R2的屬性,那么在關系R2中K為外鍵,在R2的關系中K的取值只允許有兩種可能,或者為空值,或者等於R1關系中某個關鍵字的值。
其中提到的外鍵是指:當關系中的某個屬性或屬性組雖然不是該關系的關鍵字或只是該關系關鍵字的一部分,但卻是另一個關系的關鍵字,則成該屬性是這個關系的外鍵,如上面提到的SC關系中的課程號不是SC的關鍵字,但課程號是關系C的關鍵字,因此課程號是SC的外鍵,在關系SC中屬性課程名的值只能為空或者為C中課程號字段中的某個值。
主鍵不能為空,並且不可以重復,外鍵可以為空
3.用戶完整性規則:這是針對某一具體數據的約束條件,由應用環境決定。用戶定義的完整性規則反映某一具體應用涉及的數據必須滿足語義的要求。系統提供定義和檢驗這類完整性的機制,以便用統一的方法處理它們,不再由應用程序承擔這項工作,例如在定義關系模式時,定義關系中的每個字段,對每個字段必須定義該字段的字段名(年齡),字段類型(整型),字段寬度(2位),小數位數(0位),經過這樣的定義,在給每條記錄的年齡字段輸入數據時,可以輸入兩位整型數據,這就是一種約束,如果我們還想進一步對錄入的數據進行約束,以減少數據錄入的錯誤,需要定義一個具體的約束條件(可以寫一條規則),把年齡限制在15歲到25歲之間(實際上這是學生的實際年齡范圍),以滿足實際數據的需要,這就是用戶完整性規則,在進行數據操作時由系統負責檢驗數據的合理性。
總結前面關於關系模型的論述,我們看到,在定義一個關系模式時,需要進行以下三個部分的定義:
1) 數據結構的定義:數據庫中的全部數據及其互相聯系都被組織成“關系”的形式,並且關系模型的基本數據結構也是關系。
2) 數據操作的定義:關系模型提供一組完備的高級關系運算,以支持數據庫的各種操作。關系運算分為關系代數和關系演算兩類。
3) 關系模型的三類完整性規則的定義:除了進行數據結構、數據操作的定義,為了確保數據的正確性,還要進行三類完整性規則的定義。
關系代數
關系是一個數學上的概念,是一類集合(以同類型元組為元素的結合),因此關系代數是以集合代數為基礎發展起來的,關系是可以進行運算的。如同數字運算的對象和結構都是數字、集合運算的對象和結果都是集合一樣,關系運算的對象和結果都是關系。關系運算可以分為兩類:
傳統的集合運算:這類運算從關系是集合的定義出發,把關系看出集合,則集合的所有運算對關系也是有效的。這類運算有:關系的並集、交集、差集、笛卡爾積。
專門的關系運算:這類運算是用來進行數據庫的查詢操作。這些運算可以把二維表進行任意的分割和組裝,隨機地由已有的二維表構造出各式各樣用戶所需要的二維表。這類運算有:投影、選擇、連接、除法運算。
1. 傳統的集合運算
傳統的集合運算是二元運算。所謂二元運算是指運算的對象為兩個,比如加法就是二元運算,進行運算的對象是兩個數;二元關系運算是指,兩個關系進行運算,結果為一個新關系。
(1)關系的並運算
關系的並運算的運算符號與集合並運算的符號相同,都是∪,關系運算中,只有兩個同類型關系的並才有意義。設R1和R2是兩個同類型的關系,它們之間的並運算表達式是:R1∪R2,其結果也是同類型的關系,其中R1∪R2的元組或者是R1的元組或者是R2的元組,記為:
R1∪R2={t|t∈R1∨t∈R2}
“∨”這個符號的意思是“或”,即t是屬於(∈)R1里面的元組,或者t是屬於R2里面的元組。所以這里的表達式的意思是R1∪R2產生了一個新的關系,這個新的關系由元組t組成,t可能是來自R1里面的元組,也可能是來自R2里面的元組。
范例:
設R1、R2為學生實體模式下的兩個關系:
則由關系並的定義得R1∪R2
(2)關系交運算
關系交運算符號與集合交運算的符號相同,都是∩,關系運算中,只有兩個同類型關系的交才有意義。設R1和R2是兩個同類型的關系,它們之間的交運算表達式是:R1∩R2,其結果也是同類型的關系,其中R1∩R2的元組是由既是R1的元組也是R2的元組構成,記為:
R1∩R2={t|t∈R1∧t∈R2}
“∧”這個符號的意思是“且”,即t既是屬於(∈)R1里面的元組,同時t也是屬於R2里面的元組。所以這里的表達式的意思是R1∩R2產生了一個新的關系,這個新的關系由元組t組成,t既是來自R1里面的元組,也是來自R2里面的元組。
范例:設R1、R2為上述范例中的學生實體模式下的兩個關系,求R1∩R2
由關系交運算的定義可得R1∩R2
(3)關系差運算
關系差運算的運算符合與集合差運算的符號相同,都是-,關系運算中,只有兩個同類型關系的差才有意義。設R1和R2是兩個同類型的關系,它們之間的差運算表達式是R1-R2,其結果也是同類型的關系,其中 R1-R2的元組是由R1的元組,而不是R2的元組構成,記為:
R1-R2={t|t∈R1∧t∉R2}
范例:設R1、R2為上述范例中的學生實體模式下的兩個關系,求R1-R2
由關系差運算的定義可得R1-R2
(4)笛卡爾積運算
笛卡爾積是關系這類集合所特有的一種運算,其運算符合是乘法運算符“×”,是一個二元關系運算,兩個運算對象可以是同類型的關系也可以是不同類型的關系,若R1是r1元元組的集合,R2是r2元元組的集合,則R1×R2是r1+r2元組的集合,R1×R2的元組(元組對應着二維表中的行)是由R1的分量(分量對應着二維表中的列)和R2的分量組成的,記為:
R1×R2={t|t=(r1,r2)∧r1∈R1∧r2∈R2}
范例:設關系R1、R2分別為學生實體和學生與課程聯系的兩個關系,求R1×R2。
由笛卡爾積的定義可得R1×R2
從上例中我們看到R1×R2是一個很大的運算,由R1、R2進行笛卡爾積運算得到的新關系是比關系R1、R2大得多的關系。這個運算的運算量大、占有的存儲空間大,並且我們看到在R1×R2關系中,四條記錄只有第一條記錄有實際意義的,而其他的三條記錄均沒有實際的意義。我們分析第一條記錄,又是一條非常有用的信息,反映了李蘭同學的所有信息包括她的學號、姓名、性別、年齡、選學的課程名以及所選課程的成績,這條記錄的信息來源於兩個關系中,是兩個關系的一種連接。
2. 專門的關系運算
專門的關系運算有選擇、投影、關系的自然連接和關系的除法,其中關系的選擇運算和投影運算是一元運算,是對一個關系進行垂直和水平分解而得到一個關系,而關系的自然連接和關系的除法是二元運算,是把兩個關系的信息根據需要組織成一個新關系,是信息的綜合,這幾種關系的運算都與記錄的查詢操作有關。
(1)選擇運算
關系的選擇運算的運算符是“δ”,關系的選擇運算是一元運算,運算的對象是關系,運算的結果也是關系,新關系是原關系的子集,記為:
δF(R)={t|t∈R∧F(t)}
在上式中δ表示的是選擇運算,F是一個條件表達式,R是進行關系運算的對象,δF(R)是選擇運算的結果,其元組首先是關系R的元組,並且這些元組要使得條件F為真,即F(t)為真,因此,選擇運算也可敘述為:在關系R中選擇滿足條件F的記錄,組成一個新的關系
范例:設關系R1是實體學生關系模式的一個關系,在關系R1中查找滿足年齡小於等於17的學生。
解決這個問題可以使用選擇運算來完成。
R=δ年齡≤17(R1)={t|t∈R1∧age≤17}
運算的結果為:
通過這個例子可以看到,關系的選擇運算可以用來在一個關系中查找滿足條件的記錄,由這些滿足條件的記錄組成的新關系就是選擇運算的結果。在這個例子中條件是學生關系中記錄的年齡字段的值小於等於17。選擇運算是對關系進行水平分割生成用戶需要的關系。
(2)投影運算
關系投影運算的運算符是“Ⅱ”,關系投影運算是一元運算,運算的對象是關系,運算的結果也是關系,新關系的元組是在原關系的元組中選出的若干個分量組成的元組,記為:
Ⅱti1,ti2,…tim(R)={t|t=(ti1,ti2,…tim)∧(t1,t2,…,tk)∈R}(其中K>im)
上式中“Ⅱ”是投影運算的運算符,R是投影運算的運算對象,(t1,t2,…,tk)是關系R的元組,(ti1,ti2,…tim)是投影運算所得到新關系的元組。
范例:設S是學生關系模式的一個關系,在某次查詢中要求查找每個學生的年齡
解決這個問題,可以使用投影操作:
R=Ⅱ姓名,年齡(S)={t|t=(姓名,年齡)∧(學號,姓名,性別,年齡)∈S}
運算結果R為:
在關系R中查找某個學生的年齡比在關系S中查找某個學生的年齡運算量要小得多。
投影運算是對關系進行垂直分割,產生用戶所需要的關系
(3)連接運算
連接運算與投影和選擇運算不同,連接運算是將兩個關系連接起來,以滿足查詢任務的要求,連接運算是二元運算。實際上,關系笛卡爾積運算就是一種連接運算,是兩個關系的最大連接。笛卡爾積運算的結果,產生了很多沒有實際意義的記錄,而連接運算是將兩個關系連接起來,獲得與用戶查詢有關的新關系。關系的連接有兩類;條件連接和自然連接