書名: 數據庫系統原理及MySQL應用教程(第2版)作者名: 李輝等編著本章字數: 6592字更新時間: 2020-10-15 17:32:30
2.6 關系模型
在1970年,IBM公司研究員E. F. Codd博士發表題為“大型共享數據庫的關系模型”的論文,文中首次提出了數據庫的關系模型。后來又多次發表多篇文章,進一步完善了關系模型,使關系模型成為關系數據庫最重要的理論基礎。在關系模型中,最基本的概念就是關系。
關系模型是數據庫使用的一種典型數據模型。在關系模型中,其數據結構為具有一定特征的二維表。在關系數據庫中,數據以關系表形式存儲實體數據,關系是一個由行和列組成的二維表。
2.6.1 關系數據結構
在關系模型中,無論是實體集,還是實體集之間的聯系均由單一的關系表示。在關系模型中,只有關系這一種單一的數據結構,從用戶的角度來說關系模型的邏輯結構就是一張二維表。其中關于數據庫結構的數據稱為元數據。比如表名、列名、表和列的屬性等都是元數據。
1.關系中基本術語
(1)元組(Tuple)
元組也稱記錄,關系表中的每行對應一個元組,組成元組的元素稱為分量。數據庫中的一個實體或實體之間的一個聯系均使用一個元組來表示。
例如,在表2-3中有3個元組,分別對應3個學生,“史丹妮,女,會計”是一個元組,由3個分量組成。
表2-3 元組

(2)屬性(Attribute)
關系中的每列對應一個域。由于域可以相同,因此為了加以區分,必須給每列一個命名,這個命名就稱為屬性。N目關系必有n個屬性。
屬性具有型和值兩層含義:型是指字段名和屬性值域;值是指屬性具體的取值。
關系中的字段名具有標識列的作用,所以在同一個關系中的字段名(列名)不能相同。一個關系中通常有個多個屬性,屬性用于表示實體的特征。
(3)候選碼(Candidate key)
若關系中的某一屬性或屬性組的值能唯一地標識一個元組,則稱該屬性或屬性組為候選碼(Candidate key)。
(4)主碼(Primary key)
若一個關系中有多個候選碼,則選定其中一個為主碼(也可以稱為主鍵、主關鍵字)。
例如,假設關系中沒有重名的學生,則學生的“姓名”就是該Student關系的主碼;若在Student關系中增加學生的“學號”屬性,則Student關系的候選碼為“姓名”和“學號”兩個,應當選擇“學號”屬性作為主碼。當包含兩個或更多個的鍵稱為復合碼(鍵)。
主碼不僅可以標識唯一的行,還可以建立與別的表之間的聯系。
主碼作用如下:
● 唯一標識關系的每行;
● 作為關聯表的外鍵,鏈接兩個表;
● 使用主碼值來組織關系的存儲;
● 使用主碼索引快速檢索數據。
主碼選擇的注意事項如下。
1)建議取值簡單的關鍵字為主碼。比如學生表中的“學號”和“身份證號”,建議選擇“學號”作為主碼。
2)在設計數據庫表時,復合主鍵會給表的維護帶來不便,因此不建議使用復合主鍵。
3)數據庫開發人員如果不能從已有的字段(或者字段組合)中選擇一個主碼,那么可以向數據庫添加一個沒有實際意義的字段作為該表的主碼。可以避免“復合主鍵”情況的發生,同時可以確保數據庫表滿足第二范式的要求(范式概念稍后介紹)。
4)數據庫開發人員如果向數據庫表中添加一個沒有實際意義的字段作為該表的主鍵,即代理鍵。建議該主鍵的值由數據庫管理系統(例如MySQL)或者應用程序自動生成,避免人工錄入時人為操作產生的錯誤。
鍵的主要類型如下。
1)超鍵:在一個關系中,能唯一標識元組的屬性或屬性集稱為關系的超鍵。
2)候選鍵:如果一個屬性集能唯一標識元組,且又不含有多余的屬性,那么這個屬性集稱為關系的候選鍵。
3)主鍵:如果一個關系中有多個候選鍵,則選擇其中的一個鍵為關系的主鍵。用主鍵可以實現關系定義中“表中任意兩行(元組)不能相同”的約束。
例如,在一個圖書管理系統中,可將圖書明細表中的圖書編號列假設是唯一的,因為圖書館管理員是通過該編號對圖書進行操作的。因此,把圖書編號作為主鍵是最佳的選擇,而如果使用圖書名稱列作為主鍵則會存在問題。為此,最好創建一個單獨的鍵將其明確地指定為主鍵,這種唯一標識符在現實生活中很普遍,例如,身份證號、牌照號、訂單號和航班號等。
(5)全碼(All-key)
在最簡單的情況下,候選碼只包含一個屬性;在最極端的情況下,關系模式的所有屬性都是這個關系模式的候選碼,稱為全碼。全碼是候選碼的特例。例如,設有以下關系:學生選課(學號,課程)其中的“學號”和“課程”相互獨立,屬性間不存在依賴關系,它的碼就是全碼。
(6)主屬性(Prime attribute)和非主屬性(Non-prime attribute)
在關系中,候選碼中的屬性稱為主屬性,不包含在任何候選碼中的屬性稱為非主屬性。
(7)代理鍵
代理鍵是具有DBMS分配的唯一標識符,該標識符已經作為主鍵添加到表中。每次創建行時由DBMS分配代理鍵的唯一值,通常是較短的數字,該值永遠不變。該值對于用戶沒有任何意義。MySQL數據庫使用AUTO INCREMENT函數自動分配代理鍵的數值。在AUTO INCRE-MENT中,起始值可以是任意值(默認為1),但增量總是1。
2.數據庫中關系的類型
關系數據庫中的關系可以有3種類型:基本關系(通常又稱為基本表或基表)、查詢表和視圖表。
基本表是實際存在的表,它是實際存儲數據的邏輯表示。
查詢表是查詢結果表或查詢中生成的臨時表。
視圖表是由基本表或其他視圖表導出的表,是虛表,不對應實際存儲的數據。
3.關系的性質
1)關系中的元組存儲了某個實體或實體某個部分的數據。
2)關系中元組的位置具有順序無關性,即元組的順序可以任意交換。
3)同一屬性的數據具有同質性,即每一列中的分量是同一類型的數據,它們來自同一個域。
4)同一關系的字段名具有不可重復性,即同一關系中不同屬性的數據可出自同一個域,但不同的屬性要給予不同的字段名。
5)關系具有元組無冗余性,即關系中的任意兩個元組不能完全相同。
6)關系中列的位置具有順序無關性,即列的次序可以任意交換、重新組織。
7)關系中每個分量必須取原子值,即每個分量都必須是不可分的數據項。
關系模型要求關系必須是規范化的,即要求關系模式必須滿足一定的規范條件,這些規范條件中最基本的一條就是關系的每個分量必須是一個不可分的數據項。
4.關系模式
在數據庫中要區分型和值。在關系數據庫中,關系模式是型,關系是值。關系模式是對關系的描述。那么應該描述哪幾個方面呢?
首先,關系是一張二維表,表的每一行對應一個元組,每一列對應一個屬性。一個元組就是該關系所涉及的屬性集的笛卡兒積中的一個元素。關系是元組的集合,因此關系模式必須指出這個元組集合的結構,即它由哪些屬性構成,這些屬性來自哪些域,以及屬性與域之間的映像關系。
其次,一個關系通常是由賦予它的元組語義來確定的。元組語義實質上是一個n目謂詞(n是屬性集中屬性的個數),凡使該n目謂詞為真的笛卡兒積中的元素的全體就構成了該關系模式的關系。
現實世界隨著時間在不斷地變化,因而在不同的時刻,關系模式的關系也會有所變化。但是,現實世界的許多已有事實限定了關系模式所有可能的關系必須滿足一定的完整性約束條件,這些約束或者通過對屬性取值范圍的限定,例如,學生的性別只能取值為“男”或“女”,或者通過屬性值間的相互關聯(主要體現于值的相等與否)反映出來。關系模式應當刻畫出這些完整性約束條件,因此一個關系模式應當是一個5元組。
關系的描述稱為關系模式(Relation Schema),它可以形式化地表示為R(U,D,Dom,F)。
其中,R:關系名;U:組成該關系的屬性的集合;D:屬性組U中的屬性所來自的域;Dom:屬性向域的映像集合;F:為屬性間數據依賴關系的集合。關系模式通常可以簡記為R(U)或R(A1,A2,…,An)。其中R為關系名,A1,A2,…,An為字段名。而域名及屬性向域的映像常直接稱為屬性的類型及長度。
關系模式是關系的框架或結構。關系是按關系模式組合的表格,關系既包括結構也包括其數據。因此,關系是關系模式在某一時刻的狀態或內容。關系模式是靜態的、穩定的,而關系的數據是動態的、隨時間不斷變化的,因為關系操作在不斷地更新著數據庫中的數據。但在實際應用中,人們通常把關系模式和關系都稱為關系,這不難以區別。
關系數據庫中關于表的三組術語的對應關系如表2-4所示。
表2-4 對應關系

經常有人會混著用上述術語,讀者應知道它們的對應關系。
5.關系數據庫
在關系數據庫中,實體集以及實體間的聯系都是用關系來表示的。在某一應用領域中,所有實體集及實體之間的聯系所形成的關系的集合就構成了一個關系數據庫。關系數據庫也有型和值的區別。關系數據庫的型稱為關系數據庫的模式,它是對關系數據庫的描述,包括若干域的定義以及在這些域上定義的若干關系模式。關系數據庫的值是這些關系模式在某一時刻對應關系的集合,也就是說關系數據庫的數據。
2.6.2 關系操作
關系模型與其他數據模型相比,最具特色的是關系操作語言。關系操作語言靈活、方便,表達能力和功能都非常強大。
1.關系操作的基本內容
關系操作包括數據查詢、數據維護和數據控制三大功能。
1)數據查詢指數據檢索、統計、排序、分組以及用戶對信息的需求等功能。
2)數據維護指數據添加、刪除、修改等數據自身更新的功能。
3)數據控制是為了保證數據的安全性和完整性而采用的數據存取控制及并發控制等功能。
關系操作的數據查詢和數據維護功能使用關系代數中的8種操作來表示,即并(Union)、差(Difference)、交(Intersection)、廣義的笛卡兒積(Extended Cartesian Product)、選擇(Select)、投影(Project)、連接(Join)和除(Divide)。其中選擇、投影、并、差、笛卡爾積是5種基本操作。其他操作可以由基本操作導出。
2.關系操作語言的種類
在關系模型中,關系數據庫操作通常是用代數方法或邏輯方法實現,分別稱為關系代數和關系演算。
關系操作語言可以分為3類。
1)關系代數語言,是用對關系的運算來表達查詢要求的語言。ISBL(Information System Base Language)是關系代數語言的代表,是由IBM United Kingdom研究中心研制的。
2)關系演算語言,是用查詢得到的元組應滿足的謂詞條件來表達查詢要求的語言。可以分為元組關系演算語言和域關系演算語言兩種。
3)具有關系代數和關系演算雙重特點的語言。結構化查詢語言(Structure Query Language,SQL)是介于關系代數和關系演算之間的語言,它包括數據定義、數據操作和數據控制3種功能,具有語言簡潔、易學易用的特點,是關系數據庫的標準語言。
這些語言都具有的特點是:語言具有完備的表達能力;是非過程化的集合操作語言;功能強;能夠嵌入高級語言來使用。
2.6.3 關系的完整性
關系模型的完整性規則是對關系的某種約束條件。
關系模型允許定義3類完整性約束:實體完整性、參照完整性和用戶自定義的完整性。
其中實體完整性和參照完整性是關系模型必須滿足的完整性約束條件,稱為兩個不變性,應該由關系系統自動支持;用戶自定義的完整性是應用領域需要遵循的約束條件,體現了具體領域中的語義約束。
1.實體完整性(Entity Integrity)
實體完整性規則:若屬性A是基本關系R的主屬性,則屬性A不能取空值。
例如,學生關系“學生(學號,姓名,性別,專業號,年齡)”中,“學號”為主碼,則“學號”不能取空值。
實體完整性規則規定基本關系的主碼不能取空值,若主碼由多個屬性組成,則所有這些屬性都不可以取空值。
例如,學生選課關系“選修(學號,課程號,成績)”中,“學號、課程號”為主碼,則“學號”和“課程號”兩個屬性都不能取空值。
對于實體完整性規則說明如下。
1)實體完整性規則是針對基本關系而言的。一個基本表通常對應信息世界的一個實體集,例如學生關系對應于學生的集合。
2)信息世界中的實體是可區分的,即它們具有某種唯一性標識。
3)關系模型中以主碼作為唯一性標識。
4)主碼中的屬性即主屬性不能取空值。所謂空值就是“不知道”或“不確定”的值,如果主屬性取空值,就說明存在某個不可標識的實體,即存在不可區分的實體,這與第2點相矛盾,因此這個規則稱為實體完整性規則。
2.參照完整性(Referential Integrity)
在實際中,實體之間往往存在著某種聯系,在關系模型中實體及實體間的聯系都是用關系來描述的,這樣就自然存在著關系與關系間的引用。先來看下面3個例子。
【例2-1】學生關系和專業關系表示如下,其中主碼用下劃線標識:
學生(學號,姓名,性別,專業號,年齡)
專業(專業號,專業名)
這兩個關系之間存在著屬性的引用,即學生關系引用了專業關系的主碼“專業號”。
顯然,學生關系中的“專業號”值必須是確實存在的專業的專業號,即專業關系中有該專業的記錄,也就是說,學生關系中的某個屬性的取值需要參照專業關系的屬性來取值。
【例2-2】學生、課程、學生與課程之間的多對多聯系選修可以用如下3個關系表示:
學生(學號,姓名,性別,專業號,年齡)
課程(課程號,課程名,學分)
選修(學號,課程號,成績)
這3個關系之間也存在著屬性的引用,即選修關系引用了學生關系的主碼“學號”和課程關系的主碼“課程號”。同樣,選修關系中的“學號”值必須是確實存在的學生的學號,即學生關系中有該學生的記錄;選修關系中的“課程號”值也必須是確實存在的課程的課程號,即課程關系中有該課程的記錄。也就是說,選修關系中某些屬性的取值需要參照其他關系的屬性來取值。不僅兩個或兩個以上的關系間可以存在引用關系,同一關系內部屬性間也可能存在引用關系。
【例2-3】在關系“學生(學號,姓名,性別,專業號,年齡,班長)”中,“學號”屬性是主碼,“班長”屬性表示該學生所在班級的班長的學號,它引用了本關系“學號”屬性,即“班長”必須是確實存在的學生的學號。
設F是基本關系R的一個或一組屬性,但不是關系R的主碼。如果F與基本關系S的主碼Ks相對應,則稱F是基本關系R的外碼(Foreign Key),并稱基本關系R為參照關系(Referencing Relation),基本關系S為被參照關系(Referenced Relation)或目標關系(Target Relation)。關系R和關系S有可能是同一關系。
注意:主碼(主鍵)與外碼(外鍵)的列名不一定相同,唯一的要求是它們的值的域必須相同。
顯然,被參照關系S的主碼Ks和參照關系R的外碼F必須定義在同一個(或一組)域上。
在例2-1中,學生關系的“專業號”屬性與專業關系的主碼“專業號”相對應,因此“專業號”屬性是學生關系的外碼。這里專業關系是被參照關系,學生關系為參照關系。
在例2-2中,選修關系的“學號”屬性與學生關系的主碼“學號”相對應,“課程號”屬性與課程關系的主碼“課程號”相對應,因此“學號”和“課程號”屬性是選修關系的外碼。這里學生關系和課程關系均為被參照關系,選修關系為參照關系。
在例2-3中,“班長”屬性與本身的主碼“學號”屬性相對應,因此“班長”是外碼。學生關系既是參照關系也是被參照關系。需要指出的是,外碼并不一定要與相應的主碼同名。但在實際應用中,為了便于識別,當外碼與相應的主碼屬于不同關系時,則給它們取相同的名字。參照完整性規則就是定義外碼與主碼之間的引用規則。
參照完整性規則:若屬性(或屬性組)F是基本關系R的外碼,它與基本關系S的主碼Ks相對應(基本關系R和S有可能是同一關系),則對于R中每個元組在F上的值必須為以下值之一。
1)取空值(F的每個屬性值均為空值)。
2)等于S中某個元組的主碼值。
在例2-1中學生關系中每個元組的“專業號”屬性只能取下面兩類值。
1)空值,表示尚未給該學生分配專業。
2)非空值,這時該值必須是專業關系中某個元組的“專業號”值,表示該學生不可能分配到一個不存在的專業中,即被參照關系“專業”中一定存在一個元組,它的主碼值等于該參照關系“學生”中的外碼值。
在例2-2中按照參照完整性規則,“學號”和“課程號”屬性也可以取兩類值:空值或被參照關系中已經存在的值。但由于“學號”和“課程號”是選修關系中的主屬性,按照實體完整性規則,它們均不能取空值,所以選修關系中的“學號”和“課程號”屬性實際上只能取相應被參照關系中已經存在的主碼值。
在參照完整性規則中,關系R與關系S可以是同一個關系。在例2-3中,按照參照完整性規則,“班長”屬性可以取兩類值。
1)空值,表示該學生所在班級尚未選出班長。
2)非空值,該值必須是本關系中某個元組的學號值。
3.用戶定義的完整性(User-defined Integrity)
任何關系數據庫系統都應該支持實體完整性和參照完整性。除此之外,不同的關系數據庫系統根據其應用環境的不同,還需要支持一些特殊的約束條件,用戶定義的完整性就是針對某一具體關系數據庫的約束條件,它反映某一具體應用所涉及的數據必須滿足的語義要求。例如某個屬性必須取唯一值,屬性值之間應滿足一定的關系,某屬性的取值范圍在一定區間內等。關系模型應提供定義和檢驗這類完整性的機制,以便用統一的系統方法處理它們,而不需要由應用程序承擔這一功能。關系數據庫DBMS可以為用戶實現如下自定義完整性約束。
1)定義域的數據類型和取值范圍。
2)定義屬性的數據類型和取值范圍。
3)定義屬性的默認值。
4)定義屬性是否允許空值。
5)定義屬性取值的唯一性。
6)定義屬性間的數據依賴性。
- Practical Data Analysis Cookbook
- Visual Basic .NET程序設計(第3版)
- Delphi程序設計基礎:教程、實驗、習題
- HoloLens Beginner's Guide
- 高級C/C++編譯技術(典藏版)
- SQL Server 2016數據庫應用與開發習題解答與上機指導
- Scala編程實戰(原書第2版)
- Julia高性能科學計算(第2版)
- Yii Project Blueprints
- Android應用開發深入學習實錄
- JavaScript+jQuery網頁特效設計任務驅動教程
- WildFly Cookbook
- AI自動化測試:技術原理、平臺搭建與工程實踐
- Responsive Web Design with jQuery
- Game Programming using Qt 5 Beginner's Guide