關系模型概念
關系模型認為所有數據都可以表示為數學上的關系,即集合中兩個元素之間的連接。
這一概念在關系型數據庫中體現為數據表。數據表中的每一行保存一條記錄稱做tuple(元組),每一列表示數據記錄的一個屬性稱做domain(域)。
每個數據都與一個記錄和一個屬性關聯,即兩者的關系。而數據表則是記錄和屬性的關系集。
Key
-
Super Key(超碼): 是一個或多個屬性的集合,可以唯一確定一條記錄。
-
Candidate Key(候選碼): 刪除candidate key中任意一個屬性都會使其失去唯一確定記錄的特性。
-
Primary Key(主碼): 從candidate key中選擇一個作為對記錄的唯一標識。
-
Foreign Key(外碼): 關系模式R的屬性A參照關系模式S的主鍵, 稱A為R中的外鍵.
Primary Key中的屬性稱為主屬性, 不在Primary Key中的屬性稱為非主屬性.
Primary Key一般起約束作用,不能重復不能為空, 防止重復(unique)或無法查詢(not null)的情況發生,稱為實體完整性約束(Entity integrity)。
Forign Key用來用數據表S來保證數據表R的完整性,R中Foreign Key屬性A參照關系S,則R.A中的值必須在S的主鍵中出現過, 稱為參照完整性約束(Referential integrity)。
函數依賴
若在一張表中,在屬性X的值確定的情況下,必定能確定屬性Y的值,那么就可以說Y函數依賴於X,寫作 X -> Y。
即在數據表中,任意兩條記錄,若它們在X屬性上的值相同,則Y屬性上的值一定相同。
函數依賴允許兩條記錄在X上的屬性值不同,而在Y上的屬性值相同的情況出現。
從函數依賴的角度來看,關系模式R的屬性集A,存在A->R等價於A為R的超碼.
完全函數依賴
完全函數依賴是針對X為多屬性集合的情況定義的,若X->Y, 不存在X的任意非空真子集X'使得X'->Y則稱:Y完全函數依賴於X。
若Y函數依賴於X,但不完全函數依賴於X則稱:Y部分函數依賴於X。
傳遞函數依賴
若Y函數依賴於X,Z函數依賴於Y,則有Z傳遞函數依賴於X。
平凡函數依賴
若屬性集Y屬於X, 則有屬性集Y函數依賴於X, 稱這種函數依賴為平凡函數依賴.
如: A -> A, AB -> A
尋找所有候選碼
根據屬性在函數依賴集中出現的位置分為幾類:
-
L屬性: 出現且只出現在依賴關系的左側
-
R屬性: 出現且只出現在依賴關系的右側
-
LR屬性: 在依賴關系左右均出現過
-
N屬性: 沒有在依賴集中出現過
L和N屬性一定是候選碼的一部分, R屬性一定不是候選碼的成員, LR屬性可能是候選碼的一部分.
算法如下:
-
首先置集合H的初始元素為所有L和N屬性.
-
集合I的初始元素所有為LR屬性, 按元素數從少到多去其子集J.
-
判斷\(R \cup J\)是否為候選碼, 若是候選碼則不再計算包含J的其它I的子集(一定有多余屬性)
-
重復執行上一步,直至檢查完所有I的子集.
檢查某個屬性集是否為候選碼,可以利用數據依賴的公理化系統中計算屬性集閉包的方法.
關系代數運算
關系代數運算是從一個關系集映射到另一個關系集的操作,包括6個基本關系代數運算。
- select選擇(σ)
在表中選擇滿足條件的記錄,保留其所有屬性形成新的表。
- project投影(π)
在表中選擇指定屬性,取所有記錄得到新表;重復的記錄只保留一個,得到最終結果。
- union並(U)
將屬性相同的兩個表中的記錄合並到同一個表中,屬性不變。
- set difference集合差(-)
在屬性相同的表r,s中選擇所有r中有且s中沒有的記錄組成新表,屬性不變。
- rename重命名(p)
對表中指定的屬性重命名。
- Cartesian product笛卡兒積(*)
任意兩個表r,s將它們的屬性合並作為新表的domian,相同的屬性進行重命名d->r.d,s.d。
表r中所有記錄與s中的元組兩兩結合,形成新表的記錄。
- division(除)
(1) 尋找R, S中的同名屬性
(2)做R中其它屬性列(X)到公共屬性的像集
(3) 判斷\(X_{i}\)的像集是否包含了S中所有Y的取值,若包含則將\(X_{i}\)加入到結果中
可以發現除法可以實現全程量詞的功能, 請參見示例2.
在應用中還有一些常用運算,它們可以由基本運算導出:
- intersection 交
- θ-Join
θ為條件表達式,表r,s中共同屬性相同且滿足θ的記錄將合並為新表的記錄。
- Natural join(自然連接)
Natural Join是θ-Join的特例,表r,s的屬性的並集作為新表的記錄,共同屬性相同的記錄合並為新表的記錄。
- Outer join (外連接)
左外連接:
r左連s,r與s的屬性的並集作為新表的屬性,並將r中所有記錄添加到新表中。s中與r共同屬性相同的記錄添加到新表中。
右外連接與全外連接:
示例1: 在下面關系模式中找出余額最多的用戶名
account(#user_id#, balance)
user(user_id, username)
上式結果命名為max_account
當然, join可以用笛卡兒積和選擇來實現.
示例2: 給出選課管理的關系模式
stu_cour(#stu_id, cour_id#)
cour(#cour_id#, teach_id)
找出選了所有teach_id = 1
的教師任教的課程的學生學號: