數據模型由數據結構、數據操作和數據完整性約束三部分組成,這三部分也稱為關系數據模型三要素。下面就從這三個方面介紹關系數據模型。
2.1.1 數據結構
關系模型源于數學,它使用二維表來組織數據,而這個二維表在關系數據庫中就稱為關系。關系數據庫可以說是表或者關系的集合。
表2-1和表2-2分别為“學生”關系和“選課”關系示例。
2.1.2 數據操作
關系模型給出了關系操作的能力。關系模型的操作包括:
1.傳統的關系運算:并(union)、交(intersection)、差(difference)、笛卡兒乘積(Cartesian product);
2.專門的關系運算:選擇(select)、投影(project)、連接(join)等;
3.有關的數據操作:查詢(query)、插入(insert)、删除(delete)和更改(update)。
關系模型的數據操作主要包括4種:查詢、插入、删除和更改。
2.1.3 數據完整性約束
在數據庫中數據的完整性是指保證數據正确性的特征。數據完整性由一組完整性規則定義,在關系模型中一般将數據完整性分為三類,即實體完整性、參照完整性和用戶定義的完整性。
2.2 關系模型的基本術語關系模型源于數學,它有自己嚴格的定義和一些固有的術語。
1.關系
通俗地講,關系(relation)就是二維表,二維表的名字就是關系的名字,表2-1中的關系名就是“學生”。
2.屬性
二維表中的每一列稱為一個屬性(或字段),每個屬性(attribute)都有一個名字,稱為屬性名。二維表中對應某一列的值稱為屬性值;二維表中列的個數稱為關系的元數。如果一個二維表有n列,則稱其為n元關系。如表2-1所示的“學生”關系有學号、姓名、年齡、性别、所在系5個屬性,是一個五元關系。
3.值域
二維表中屬性的取值範圍稱為值域(domain)。例如,在表2-1中,“年齡”列的取值為大于0的整數,“性别”列的取值為“男”和“女”兩個值,這些都是列的值域。
4.元組
二維表中的一行數據稱為一個元組(tuple),即記錄值,表2-1“學生”關系中的元組有:
(202111101,李勇,21,男,計算機系)
(202111102,劉晨,20,男,計算機系)
(202111103,王敏,20,女,計算機系)
(202121101,張立,20,男,信息管理系)
(202121102,吳賓,19,女,信息管理系)
5.分量
元組中的每一個屬性值稱為元組的一個分量(component),n元關系的每個元組有n個分量。例如,對于元組(202111101,李勇,21,男,計算機系)有5個分量,對應“學号”屬性的分量是“202111101”、對應“姓名”屬性的分量是“李勇”、對應“年齡”屬性的分量是“21”、對應“性别”屬性的分量是“男”,對應“所在系”屬性的分量是“計算機系”。
6.關系模式
二維表的結構稱為關系模式(relation schema),或者說關系模式就是二維表的表框架或表頭結構。設有關系名為R,屬性分别為A1,A2,…,An,則關系模式可以表示為:
R(A1,A2,…,An)
每個Ai(i=1,…,n)還包括該屬性到值域的映像,即屬性的取值範圍。例如,如表2-1所示關系的關系模式為:
學生(學号,姓名,年齡,性别,所在系)
如果将關系模式理解為數據類型,則關系就是該數據類型的一個具體值。
7.候選鍵
如果一個屬性或屬性集的值能夠唯一标識一個關系的元組而又不包含多餘的屬性,則稱該屬性或屬性集為候選鍵(candidate key)。候選鍵又稱為候選關鍵字或候選碼。在一個關系上可以有多個候選鍵。例如,對于“學生”關系,假設增加了“身份證号”屬性,則“身份證号”也可以作為“學生”關系的候選鍵。
8.主鍵
主鍵(primary key)也稱為主碼或主關鍵字,是表中的屬性或屬性組,用于确定唯一元組。主鍵可以由一個屬性組成,也可以由多個屬性共同組成。例如,表2-1的“學生”關系中,“學号”是主鍵,因為“學号”的一個取值可以确定唯一學生。而表2-2的“選課”關系中,主鍵就由“學号”和“課程号”共同組成。因為一個學生可以選修多門課程,而且一門課程也可以有多個學生選修,因此,隻有将“學号”和“課程号”組合起來才能共同确定一行記錄。我們稱由多個屬性共同組成的主鍵為複合主鍵。當某個關系的主鍵是由多個屬性共同組成時,需要用括号将這些屬性括起來,表示共同作為主鍵。如表2-2所示的“選課”關系的主鍵是(學号,課程号)。
主鍵實際是從候選鍵中指定的,當一個關系中僅有一個候選鍵時,則主鍵同候選鍵;當一個關系中有多個候選鍵時,可以指定某個候選鍵作為主鍵。
9.主屬性和非主屬性
包含在任一候選鍵中的屬性稱為主屬性(primary attribute)。不包含在任一候選鍵中的屬性稱為非主屬性(nonprimary attribute)。
關系中的術語很多可以與現實生活中的表格所使用的術語相對應,如表2-3所示。
關系模型中的數據完整性規則是對關系的某種約束條件,它的完整性約束主要包括三大類:實體完整性、參照完整性和用戶定義的完整性。
2.3.1 實體完整性
實體完整性是保證關系中的每個元組都是可識别的和唯一的。實體完整性是指關系數據庫中所有的表都必須有主鍵,而且表中不允許存在如下記錄:
1.無主鍵值的記錄。
2.主鍵值相同的記錄。
2.3.2 參照完整性
參照完整性也稱為引用完整性。參照完整性就是用于描述實體之間的聯系的。
參照完整性用于描述多個實體或關系之間的關聯關系。
“外鍵”
定義:設F是關系R的一個或一組屬性,如果F與關系S的主鍵K相對應,則稱F是關系R的外鍵(foreign Key),并稱關系R為參照關系(referencing relation),關系S為被參照關系(referenced relation)或目的關系(target relation)。關系R和關系S不一定是不同的關系。
外鍵并不要求與被參照的主鍵同名。但在實際應用中,為了便于識别,當外鍵與被參照的主鍵屬于不同的關系時,通常是給它們取相同的名字。
參照完整性規則就是定義外鍵與被參照的主鍵之間的引用規則。
對于外鍵,一般應符合如下要求:
1. 或者值為空。
2. 或者等于其所參照的關系中的某個元組的主鍵值。
主鍵要求必須是非空且不重複的,但外鍵無此要求。外鍵可以有重複值。
2.3.3 用戶定義的完整性
用戶定義的完整性也稱為域完整性或語義完整性。用戶定義的完整性就是針對某一具體應用領域定義的數據約束條件。用戶定義的完整性主要就是指明關系中屬性的取值範圍,也就是屬性的域,這樣可以限制關系中屬性的取值類型及取值範圍,防止屬性的值與應用語義矛盾。
2.4 關系代數關系代數是一種純理論語言,它定義了一些操作,運用這些操作可以從一個或多個關系中得到另一個關系,而不改變源關系。因此,關系代數的操作數和操作結果都是關系,而且一個操作的輸出可以是另一個操作的輸入。關系代數同算術運算一樣,可以出現一個套一個的表達式。這種性質稱為閉包(closure)。關系在關系代數下是封閉的,正如數字在算術操作下是封閉的一樣。
關系代數的運算對象是關系,運算結果也是關系。與一般的運算一樣,運算對象、運算符和運算結果是關系代數的三大要素。
關系代數的運算可分為以下兩大類:
1. 傳統的集合運算。這類運算完全把關系看成是元組的集合。傳統的集合運算包括集合的笛卡兒積、并、交和差運算。
2. 專門的關系運算。這類運算除把關系看作元組的集合外,還通過運算表達了查詢的要求。專門的關系運算主要包括選擇、投影和連接。
關系代數中的運算符可分為4類:傳統的集合運算符、專門的關系運算符、比較運算符和邏輯運算符。表2-7列出了主要的關系運算符,其中比較運算符和邏輯運算符是配合專門的關系運算符來構造表達式的。
2.4.1 傳統的集合運算
傳統的集合運算是二目運算,設關系R和S均是n元關系,且相應的屬性值取自同一個值域,則可以定義三種運算:并運算(∪)、交運算(∩)和差運算(-)。笛卡兒積并不要求參與運算的兩個關系的對應屬性取自相同的域。
以圖2-4(a)和2-4(b)所示的兩個關系為例,說明這三種傳統的集合運算。
圖2-4 描述顧客信息的兩個關系
1.并運算
設關系R與關系S均是n目關系,關系R與關系S的并記為
R∪S={t | t∈R ∨ t∈S }
其結果仍是n目關系,由屬于R或屬于S的元組組成,但不包含重複的元組。其示意圖如圖2-5(a)所示。
圖2-5 并、交、差運算示意圖
圖2-6(a)顯示了圖2-4(a)和圖2-4(b)兩個關系的并運算結果。
圖2-6 集合的并、交、差運算示意圖
2.交運算
設關系R與關系S均是n目關系,則關系R與關系S的交記為
R∩S={t | t∈R ∧ t∈S }
其結果仍是n目關系,由屬于R并且也屬于S的元組組成,其示意圖如圖2-5(b)所示。
圖2-6(b)顯示了圖2-4(a)和2-4(b)兩個關系的交運算結果。
3.差運算
設關系R與關系S均是n目關系,則關系R與關系S的差記為
R-S={t | t∈R ∧ t∉S }
其結果仍是n目關系,由屬于R并且不屬于S的元組組成,其示意圖如圖2-5(c)所示。
圖2-6(c)顯示了圖2-4(a)和2-4(b)兩個關系的差運算結果。
4.笛卡兒積
笛卡兒積不要求參加運算的兩個關系具有相同的目。
m目的關系R和n目的關系S的笛卡兒積是一個(m+n)目的元組的集合。元組的前m列是關系R的一個元組,後n列是關系S的一個元組。若R有K1個元組,S有K2個元組,則關系R和關系S的笛卡兒積有K1×K2個元組,記作
R×S={tr^ts | tr∈R ∧ ts∈S }
tr^ts表示由兩個元組tr和ts前後有序連接而成的一個元組。
任取元組tr和ts,當且僅當tr屬于R且ts屬于S時,tr和ts的有序連接即為R×S的一個元組。
實際操作時,可從R的第一個元組開始,依次與S的每一個元組組合,然後,對R的下一個元組進行同樣的操作,直至R的最後一個元組也進行同樣的操作為止,即可得到R×S的全部元組。
如圖2-7所示為兩個關系的笛卡兒積操作示意圖。
圖2-7 兩個關系的笛卡兒積操作示意圖
2.4.2 專門的關系運算
專門的關系運算包括選擇、投影、連接、除等運算,其中選擇和投影為一元操作,連接和除為二元操作。我們這裡隻介紹選擇、投影和連接運算。
下面我們以表2-8~表2-10的三個關系為例,介紹選擇、投影和連接運算的含義。表2-8~表2-10所示的三個關系的屬性含義如下:
Student:Sno(學号),Sname(姓名),Ssex(性别),Sage(年齡),Sdept(所在系)。
Course:Cno(課程号),Cname(課程名),Credit(學分),Semester(開課學期),Pcno(直接先修課)。
SC:Sno(學号),Cno(課程号),Grade(成績)。
1. 選擇
選擇(selection)運算是從指定的關系中選擇滿足給定條件(用邏輯表達式表達)的元組而組成一個新的關系。選擇運算示意圖如圖2-8所示。
圖2-8 選擇運算示意圖
選擇運算表示為
σF(R)={r | r∈R ∧ F(r)=‘真’ }
其中,σ是選擇運算符,R是關系名,r是元組,F是邏輯表達式,取邏輯“真”值或“假”值。
例1. 對照表2-8所示的Student關系,查詢計算機系學生信息。
關系代數表達式為
σSdept=‘計算機系’ (Student)
結果如表2-11所示。
2. 投影
投影(projection)運算是從關系R中選擇若幹屬性,并用這些屬性組成一個新的關系。如圖2-9顯示了投影運算示意圖。
圖2-9 投影運算示意圖
投影運算表示為
∏A(R) = { r.A | r∈R }
其中,∏是投影運算符,R是關系名,A是被投影的屬性或屬性組。r.A表示r元組中相應于屬性(集)A的分量,也可以表示為r[A]。
投影運算一般由兩個步驟完成:
(1)選擇指定的屬性,形成一個可能含有重複數據行的新關系;
(2)删除重複行,形成結果關系。
例2.對表2-8所示的Student關系,在Sname和Sdept兩個列上進行投影運算,可以表示為
∏sname,sdept(Student)
結果如表2-12所示。
3. 連接
連接(join)運算用來連接相互之間有聯系的兩個關系,從而産生一個新的關系。這個過程由連接屬性(字段)來實現。一般情況下連接屬性是出現在不同關系中的語義相同的屬性。
常用的連接運算有:θ連接、等值連接(θ連接的特例)、自然連接和外連接,其中最重要也是最常用的是等值連接和自然連接。
θ連接運算一般表示為
其中A和B分别是關系R和S上語義相同的屬性或屬性組,θ是比較運算符。連接運算從R和S的笛卡兒積R×S中選擇(R關系)在A屬性組上的值與(S關系)在B屬性組上值滿足比較運算符θ的元組。
當θ為“=”時的連接為等值連接,它是從關系R與關系S的笛卡兒積中選取A、B屬性組值相等的那些元組,即
自然連接是一種特殊的等值連接,它要求兩個關系中進行比較的分量必須是相同的屬性或屬性組,并且在連接結果中去掉重複的屬性列,使公共屬性列隻保留一個。即若關系R和S具有相同的屬性組A,則自然連接可記作:
一般的連接運算是從行的角度進行運算,但自然連接還需要去掉重複的列,所以是同時從行和列的角度進行運算。
自然連接與等值連接的差别為:
(1)自然連接要求相等的分量必須有相同的屬性名,等值連接則不要求;
(2)自然連接要求把結果中重複的屬性去掉,等值連接卻不這樣做。
2.5 關系規範化理論2.5.1 函數依賴
1. 基本概念
函數對我們來說已經是非常熟悉的概念,對公式:
Y = f ( X )
自然也不會陌生,但是大家熟悉的是X和Y之間數量上的對應關系,也就是給定一個X值,都會有一個Y值和它對應,也可以說,X函數決定Y,或Y函數依賴于X。在數據庫中,函數依賴注重的是語義上的關系,例如:
省= f (城市)
隻要給定一個具體的城市值,就會有唯一省值和它對應,如“武漢市”在“湖北省”,這裡“城市”是自變量X,“省”是因變量或函數值Y。并且把X函數決定Y,或Y函數依賴于X表示為
X→Y
由以上說明可以寫出較直觀的函數依賴定義:
設有關系模式R(A1,A2,…,An),X和Y為{A1,A2,…,An}的子集,如果對于R中的任意一個X值,都隻有一個Y值與之對應,則稱X函數決定Y,或Y函數依賴于X。
2. 術語和符号
下面給出我們用到的一些術語和符号。設有關系模式R(A1,A2,…,An),X和Y均為{A1, A2, … , An}的子集
(1) 如果X→Y,但Y不包含于X,則稱X→Y是非平凡的函數依賴。如不作特别說明,我們總是讨論非平凡函數依賴。
(2) 如果X→Y,則稱X為決定因子。
(3)如果X→Y,并且對于X的任意一個真子集X’都有X’
Y,則稱Y完全函數依賴于X,記作X
Y;如果X’→Y成立,則稱Y部分函數依賴于X,記作X
Y。
(4) 如果X→Y、Y→Z,則稱Z傳遞函數依賴于X。
3. 讨論函數依賴的必要性
讨論屬性之間的函數依賴有什麼必要呢?讓我們通過例子看一下。
設有描述學生選課及住宿情況的關系模式:
S-L-C( Sno,Sdept,Sloc,Cno,Grade)
其中,各屬性的含義分别為:學号、學生所在系、學生所住宿舍樓号、課程号和考試成績。假設一個系的學生都住在一個宿舍樓裡。該關系模式的主鍵為(Sno,Cno)。
看一下這個關系模式存在什麼問題?假設該表有如表2-17所示的數據。
從這個表中我們可以看到如下問題:
(1)數據冗餘。
(2)數據更新。
(3)數據插入。
(4)數據删除。
類似的各種問題我們統稱為操作異常。
解決上述各種問題的方法就是進行模式分解,即把一個關系模式分解成兩個或多個關系模式,在分解的過程中消除那些“不良”的函數依賴,從而獲得好的關系模式。
2.5.2 關系規範化
關系數據庫中的關系要滿足一定的要求,滿足不同程度要求的為不同的範式。滿足最低要求的為第一範式,簡稱1NF(First Normal Form)。在第一範式中進一步滿足一些要求的為第二範式,簡稱2NF,依此類推,還有3NF、BCNF、4NF和5NF。
1. 第一範式
定義:不包含非原子項屬性的關系是第一範式的關系。
2. 第二範式
定義:如果關系模式R∈1NF,并且R中的每個非主屬性都完全函數依賴于主鍵,則R∈2NF。
可以用模式分解的方法将非2NF的關系模式分解為2NF的關系模式。
消除部分函數依賴的分解步驟為:
(1) 對于組成主鍵的屬性集合的每一個子集,用它作為主鍵構成一個關系模式。
(2) 對每個關系模式,将依賴于此主鍵的屬性放置到此關系模式中。
(3) 去掉隻由主鍵的子集構成的關系模式。
3. 第三範式
定義:如果關系模式R∈2NF,并且所有非主屬性都不傳遞函數依賴于主鍵,則R∈3NF。
消除傳遞函數依賴的分解步驟為:
(1)對于不是候選鍵的每個決定因子,從表中删去依賴于它的所有屬性。
(2)新建一個關系模式,新關系模式包含在原關系模式中所有依賴于該決定因子的屬性。
(3)将決定因子作為新關系模式的主鍵。
由于3NF關系模式中不存在非主屬性對主鍵的部分函數依賴和傳遞函數依賴,因而消除了很大一部分數據冗餘和更新異常,因此在通常的數據庫設計中,一般要求将關系模式分解到3NF即可。
2.5.3 關系模式的分解準則
關系規範化的方法是進行模式分解,但分解後産生的關系模式應與原關系模式等價,即模式分解必須遵守一定的準則,不能表面上消除了操作異常現象,卻留下了其他的問題。模式分解要滿足:
● 模式分解具有無損連接性。
● 模式分解能夠保持函數依賴。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!