天天看點

《資料庫基礎及實踐技術——SQL Server 2008》一1.3 資料和資料模型

本節介紹如何了解現實世界、如何将之“資訊化”以及如何描述現實世界的資訊結構等内容。

資料

為了了解世界、研究世界和交流資訊,人們需要描述各種事物。用自然語言來描述雖然很直接,但過于煩瑣,不便于形式化,而且也不利于用計算機來表達。為此,人們常常隻抽取那些感興趣的事物特征或屬性,作為事物的描述。例如,一個學生可以用如下記錄來描述:(張三,9912101,1981,計算機,應用軟體),單憑這樣一條記錄人們一般不容易知道其準确含義,但如果對其加以準确解釋,就可以得到如下資訊:張三是9912101班的學生,1981年出生,是計算機系應用軟體專業的。這種對事物描述的符号記錄稱為資料。資料有一定的格式,例如,性别是一個漢字的字元。這些格式的規定是資料的文法,而資料的含義是資料的語義。人們通過解釋、推論、歸納、分析和綜合等方法,從資料所獲得的有意義的内容稱為資訊。是以,資料是資訊存在的一種形式,隻有通過解釋或處理才能成為有用的資訊。

資料模型

模型,特别是具體的模型,人們并不陌生。一張地圖、一組建築設計沙盤、一架航模飛機等都是具體的模型。一眼望去,會使人聯想到現實生活中的事物。模型是現實世界特征的模拟和抽象。資料模型(data model)也是一種模型,它是對現實世界中的資料特征的抽象。

資料庫是企業或部門相關資料的集合,它不僅要反映資料本身的内容,而且要反映資料之間的聯系。由于不可能用計算機直接處理現實世界中的具體事物,是以,必須把現實世界中的具體事物轉換成計算機能夠處理的對象。在資料庫中用資料模型這個工具來抽象、表示和處理現實世界中的資料和資訊。通俗地講,資料模型就是對現實世界資料的模拟。

對資料庫中資料的組織都是基于某種資料模型的,是以,了解資料模型的基本概念是學習資料庫的基礎。

資料模型一般應滿足3個方面的要求:第一個方面是可以比較真實地模拟現實世界;第二個方面是容易被人們了解;第三個方面是便于在計算機中實作。用一種模型來很好地滿足這3個方面的要求是比較困難的。在資料庫系統中針對不同的使用對象和應用目的,采用不同的資料模型。

不同的資料模型實際上是提供給我們模型化資料和資訊的不同工具。根據模型應用目的的不同,可以将這些模型劃分為兩大類,它們屬于兩個不同的層次。

一類是概念層資料模型,也稱為概念模型或資訊模型,該模型從資料的應用語義視角來抽取模型并按使用者的觀點來對資料和資訊進行模組化。這類模型主要用在資料庫設計階段,它與具體的資料庫管理系統無關。另一類是組織層資料模型,也稱為組織模型,該模型從資料的組織層來描述資料。所謂組織層就是指用什麼樣的資料結構來組織資料。資料庫發展到現在主要包括如下幾種組織模型(或稱做組織方式):層次模型(用樹形結構組織資料)、網狀模型(用圖形結構組織資料)、關系模型(用簡單二維表結構組織資料)以及對象-關系模型(用複雜的表格以及其他結構組織資料)。組織層資料模型主要是以計算機系統的觀點對資料進行模組化,它與所使用的資料庫管理系統的種類有關,主要用于dbms的實作。

組織層資料模型是資料庫系統的核心和基礎。各個廠商開發的資料庫管理系統都基于某種組織層資料模型。

為了把現實世界中的具體事物抽象、組織為某一具體dbms支援的資料模型,人們通常首先将現實世界抽象為資訊世界,然後再将資訊世界轉換為機器世界,即首先把現實世界中的客觀對象抽象為某一種資訊結構,這種資訊結構并不依賴于具體的計算機系統,而且也不與具體的dbms相關,而是概念級的模型,也就是我們前面所說的概念層資料模型,然後再把概念層資料模型轉換為dbms支援的組織層資料模型。注意,從現實世界到概念層資料模型使用的是“抽象”技術,從概念層資料模型到組織層模型使用的是“轉換”,也就是說,先有概念層資料模型,然後再到組織層資料模型。從概念層資料模型到組織層資料模型的轉換應該是比較直接和簡單的,是以,使用合适的概念層資料模型就顯得比較重要。上述過程如圖1-4所示。

《資料庫基礎及實踐技術——SQL Server 2008》一1.3 資料和資料模型

資料一般包括如下兩個特征:

靜态特征。資料的靜态特征包括資料的基本結構、資料間的聯系以及對資料取值範圍的限制。例如,1.1.1節中給出的學生管理的例子,學生基本資訊包含:學号、姓名、性别、出生日期、所在系、專業、所在班、特長、家庭住址,這些都是學生所具有的基本特征,是學生資料的基本結構。再看資料之間的聯系,學生選課資訊包括:學号、課程号和考試成績,學生選課資訊中的學号與學生基本資訊中的學号就有一種參照的關系,即學生選課資訊中的學号所能取的值必須在學生基本資訊中的學号取值範圍之内,因為隻有這樣學生選課資訊中所描述的學生選課情況才是有意義的(不允許記錄一個根本就不存在的學生的選課情況),這就是資料之間的聯系。下面再看一下資料取值範圍的限制。我們知道人的性别一項的取值隻能是“男”或“女”、考試成績一般在0~100分之間等,這些都是對某個列的資料取值範圍進行了限制,目的是在資料庫中存儲正确的、有意義的資料,這就是對資料取值範圍的限制。

動态特征。資料的動态特征是指對資料可以進行的操作以及操作規則。對資料庫資料的操作主要有查詢資料和更改資料,更改資料一般又包括對資料的插入、删除和修改。

我們将對資料的靜态特征和動态特征的描述稱為資料模型三要素,即在描述資料時要包括資料的基本結構、資料的限制條件(這兩個屬于靜态特征)和定義在資料上的操作(屬于動态特征)。

一般來講,資料模型是嚴格定義的一組概念的集合,這些概念準确地描述了系統的靜态特征、動态特征和完整性限制條件。是以,資料模型一般由資料結構、資料操作和資料完整性限制三部分組成,這三部分就稱為資料模型的三要素。

資料結構

資料的結構是所研究的對象類型的集合,這些對象是資料庫的組成部分。資料結構包括兩類,一類是與資料類型、内容、性質有關的對象,比如關系模型中的域、屬性和關系等;另一類是與資料之間聯系有關的資訊,它從資料組織層表達資料記錄與字段的結構。

資料結構是刻畫資料模型最重要的方面。是以,在資料庫系統中,人們通常按照資料結構的類型來命名資料模型。如層次結構、網狀結構和關系結構的資料模型分别命名為層次模型、網狀模型和關系模型。

資料結構是對資料的靜态特征的描述。

資料操作

資料操作是指對資料庫中的各種對象(型)的執行個體(值)允許執行的操作的集合,包括操作及有關的操作規則。它描述的是系統的資訊更改與使用,包括以下兩個方面。

資料查詢:在資料集合中提取使用者感興趣的内容,不改變資料結構與資料值。

資料更改:包括插入、删除和修改資料,此類操作改變資料的值。

資料模型必須定義這些操作的确切含義、操作符号、操作規則以及實作操作的語言。資料操作是對資料的動态特征的描述。

資料完整性限制

資料完整性限制是一組完整性規則的集合。完整性規則是給定的資料模型中資料及其聯系所具有的制約和依存規則,用以保證資料的正确、有效和相容,使資料庫中的資料值與現實情況相符。例如,學生選課表中的學号與學生基本資訊表中的學号之間的制約關系、人的年齡應該在0~200之間的取值限制等。

基本概念

從圖1-4可以看出,概念層資料模型實際上是現實世界到機器世界的一個中間層次。

概念層資料模型是抽象現實系統中有應用價值的元素及其聯系,反映現實系統中有應用價值的資訊結構,不依賴于資料的組織層結構。

概念層資料模型用于資訊世界的模組化,是現實世界到資訊世界的第一層抽象,是資料庫設計人員進行資料庫設計的工具,也是資料庫設計人員和使用者之間進行交流的工具,是以,該模型一方面應該具有較強的語義表達能力,能夠友善、直接地表達應用中的各種語義知識;另一方面還應該簡單、清晰、易于使用者了解和便于向機器世界的轉換。

概念層資料模型是面向使用者、面向現實世界的資料模型,它與具體的dbms無關。采用概念層資料模型,設計人員可以在設計的開始把主要精力放在了解現實世界上,而把涉及dbms的一些技術性問題推遲到設計階段去考慮。

常用的概念層資料模型有實體–聯系(entity-relationship,e-r)模型和語義對象模型。下面我們隻介紹實體–聯系模型。

實體–聯系模型

由于直接将現實世界資訊按具體的資料組織模型進行組織,必須同時考慮很多因素,設計工作非常複雜,并且效果也不是很理想,是以需要一種方法來對現實世界的資訊結構進行描述。事實上已經有了一些這方面的方法,我們要介紹的是p. p. s.chen于1976年提出的實體–聯系方法,即通常說的e-r方法或實體–聯系方法。這種方法簡單、實用,得到了非常普遍的應用,也是目前描述資訊結構比較常用的方法。

實體–聯系方法使用的工具稱做e-r圖,它所描述的現實世界的資訊結構稱為企業模式(enterprise schema),也把這種描述結果稱為e-r模型。

實體–聯系方法試圖定義許多資料分類對象,然後資料庫設計人員就可以通過直覺的識别方法将資料項歸類到已知的類别中。

實體–聯系方法主要涉及3個概念:實體、屬性和聯系。

(1)實體(entity)

資料是用來描述現實世界的,而描述的對象是形形色色的,有具體的,也有抽象的;有實體存在的,也有概念性的。例如,學生、課程等都是具體的對象,足球比賽可看成是抽象的對象。

實體是具有相同性質并且彼此之間可以互相區分的現實世界對象的集合。

例如,“學生”是一個實體,這個實體中的每個學生都有學号、姓名、性别、出生日期等相同的屬性。

在關系資料庫中,一般一個實體被映射成一個關系表,表中的一行對應一個可區分的現實世界對象(這些對象組成了實體),稱為實體執行個體(entity instance)。例如,“學生”實體中的每個學生都是“學生”實體的一個執行個體。

注意:有些書籍中使用實體集和實體類型來表示我們所說的實體,用實體來表示我們所說的實體執行個體。

在e-r圖中用矩形框表示具體的實體,把實體名寫在框内。

(2)屬性(attribute)

每個實體都具有一定的特征或性質,這樣人們才能根據實體的特征來區分一個個執行個體。比如學生的學号、姓名、性别等都是學生實體具有的特征。将實體所具有的特征稱為它的屬性。

屬性是描述實體或者聯系(在下文有說明)的性質的資料項。

在實體中,屬于一個實體的所有執行個體都具有共同的性質,這些性質就是實體的屬性。例如,“學生”實體的學号、姓名、性别、出生日期、所在系等性質就是“學生”實體的屬性。

每個實體都有一個辨別符(或叫實體的碼),辨別符是實體中的一個屬性或者一個屬性集合,每個實體執行個體在辨別符上具有不同的值。辨別符用于區分實體中的每個不同的執行個體,這個概念類似于後面介紹的關系中的候選碼的概念。例如,“學生”實體的辨別符是學生的“學号”。

在e-r圖中用圓角矩形框表示屬性,框内寫上屬性名。當實體所包含的屬性比較多時,為了簡潔,我們在e-r圖中經常省略對屬性的描述,而在其他地方将屬性單獨羅列出來。

(3)聯系

在現實世界中,事物内部以及事物之間是有聯系的,這些聯系在資訊世界反映為實體内部的聯系和實體之間的聯系。實體内部的聯系通常是指組成實體的各屬性之間的聯系,實體之間的聯系通常是指不同實體之間的聯系。例如,在“職工”實體中,假設有屬性“職工号”和“部門經理号”,通常情況下,“部門經理号”與“職工号”之間有一種關聯關系,即部門經理号的取值受職工号取值的限制(因為部門經理也是職工,也有職工号),這就是實體内部的聯系。而“學生”實體(設有以下屬性:學号、姓名、性别、所在系、班号)和“班級”實體(設有以下屬性:班号、班主任、班級人數)之間也有聯系,這個聯系是“學生”實體中的“班号”必須是“班級”實體中已經存在的班号,這種聯系就是實體之間的聯系。

聯系是資料之間的關聯集合,是客觀存在的應用語義鍊。聯系用菱形框表示,框内寫上聯系名,并用連線将有關的實體連接配接起來。

兩個實體之間的聯系可以分為如下3類:

一對一聯系(1 : 1)。如果實體a中的每個執行個體在實體b中至多有一個(也可以沒有)執行個體與之關聯,反之亦然,則稱實體a與實體b具有一對一聯系,記為1 : 1。一對一聯系示意圖如圖1-5a所示。

《資料庫基礎及實踐技術——SQL Server 2008》一1.3 資料和資料模型

例如,部門和經理(假設一個部門隻有一個經理,一個人隻擔任一個部門的經理)、系和系主任(假設一個系隻有一個系主任,一個人隻擔任一個系的主任),它們都是一對一聯系。部門和經理之間的一對一聯系如圖1-6a所示。

一對多聯系(1 : n)。如果實體a中的每個執行個體在實體b中有n(n≥0)個執行個體與之關聯,而實體b中每個執行個體在實體a中隻有一個執行個體與之關聯,則稱實體a與實體b是一對多聯系,記為1 : n。一對多聯系示意圖如圖1-5b所示。

例如,一個部門有若幹個職工,而一個職工隻在一個部門工作,則部門和職工之間就是一對多聯系(如圖1-6b所示)。又如,假設一個系有多名教師,而一個教師隻在一個系工作,則系和教師之間也是一對多聯系。

多對多聯系(m : n)。如果對于實體a中的每個執行個體,實體b中有n(n≥0)個執行個體與之關聯,而對于實體b中的每個執行個體,在實體a中也有m(m≥0)個執行個體與之關聯,則稱實體a與實體b的聯系是多對多聯系,記為m : n。多對多聯系示意圖如圖1-5c所示。

例如,在學生和課程之間,一個學生可以選修多門課程,一門課程也可以有多個學生選修,是以學生和課程之間是多對多的聯系,如圖1-6c所示。

《資料庫基礎及實踐技術——SQL Server 2008》一1.3 資料和資料模型

實際上,一對一聯系是一對多聯系的特例,而一對多聯系又是多對多聯系的特例。

e-r模型不僅能描述兩個實體之間的聯系,而且還能描述兩個以上實體之間的聯系。比如有顧客、商品、銷售人員3個實體,并且有以下語義:每個顧客可以從多個銷售人員那裡購買多種商品,每種商品可由多個銷售人員賣給多個顧客,每個銷售人員可以将多種商品賣給多個顧客。描述顧客、商品和銷售人員之間的銷售和購買關系的e-r圖如圖1-7所示,這裡将聯系命名為“購買”。

《資料庫基礎及實踐技術——SQL Server 2008》一1.3 資料和資料模型

聯系也可以有自己的附加屬性。例如,在圖1-6c的“選課”聯系中,可以有考試日期、考試成績等屬性。

組織層資料模型是從資料的組織方式的角度來描述資訊,目前,在資料庫領域中最常用的組織層資料模型主要有4種,分别是層次模型、網狀模型、關系模型和面向對象模型。組織層資料模型是按存儲資料的邏輯結構來命名的,例如,層次模型采用的是樹形結構。目前使用最普遍的是關系資料模型。關系資料模型技術從20世紀70年代開始到現在已經發展得非常成熟,是以,我們重點介紹關系資料模型。

關系資料模型(下面簡稱關系模型)是目前最重要的資料模型之一。關系資料庫就是采用關系模型作為資料的組織方式。20世紀80年代以來,計算機廠商推出的資料庫管理系統幾乎都支援關系模型,非關系系統的産品也大都加上了關系接口。

下面從資料模型的三要素角度來介紹關系模型的特點。

關系模型的資料結構

關系模型源于數學,它把資料看成是二維表中的元素,而這個二維表就是關系。

關系系統要求讓使用者所感覺的資料庫就是一張張表。在關系系統中,表是邏輯結構而不是實體結構。實際上,系統在實體層可以使用任何有效的存儲結構來存儲資料,如有序檔案、索引、哈希表、指針等。是以,表是對實體存儲資料的一種抽象表示—對很多存儲細節的抽象,如存儲記錄的位置、記錄的順序、資料值的表示,以及記錄的通路結構(如索引)等,對使用者來說都是不可見的。

表1-1所示的是學生基本資訊的關系模型形式。

《資料庫基礎及實踐技術——SQL Server 2008》一1.3 資料和資料模型

用關系表示實體以及實體之間聯系的模型稱為關系模型。下面介紹關系模型中的一些基本術語。

(1)關系

關系就是二維表,它滿足如下條件:

關系表中的每一列都是不可再分的基本屬性。如表1-2所示的表就不是關系表,因為“出生日期”列不是基本屬性,它包含了子屬性“年”、“月”、“日”。

表中各屬性不能重名。

表中的行、列次序并不重要,即交換列的前後順序,如在表1-1中,将“性别”放在“年齡”的前面,不影響其表達的語義。

《資料庫基礎及實踐技術——SQL Server 2008》一1.3 資料和資料模型

(2)元組

表中的每一行資料稱為一個元組,它相當于一個記錄值。例如,表1-1所示的學生關系中的元組有:

(0811101,王小東,18,男,計算機)

(0811102,張小麗,18,女,計算機)

(0821101,李海,19,男,資訊管理)

(0821103,趙耀,19,男,資訊管理)

(3)屬性

二維表中的每個列稱為一個屬性(或稱做字段),每個屬性有一個名字,稱為屬性名。二維表中對應某一列的值稱為屬性值;二維表中列的個數稱為關系的元數。如果一個二維表有n個列,則稱其為n元關系。表1-1所示的學生關系有學号、姓名、年齡、性别、所在系5個屬性,是一個五元關系。

在資料庫中有兩套标準術語,一套用的是表、行、列;而另一套用關系(對應表)、元組(對應行)、屬性(對應列)。

(4)值域

屬性的取值範圍稱為值域。例如,如果大學生的年齡假設是14~40之間的整數,則屬性“年齡”的值域就是[14..40],而人的性别隻能是“男”或“女”,是以,屬性“性别”的值域就是{男,女}。

(5)關系模式

二維表的結構稱為關系模式,或者說,關系模式就是二維表的表架構或表頭結構。設有某關系,名為r,屬性分别為a1,a2,…,an,則關系模式可以表示為:r(a1,a2,…,an)。

例如,表1-1所示關系的關系模式為:學生(學号,姓名,年齡,性别,所在系)。

如果将關系模式了解為資料類型,則關系就是該資料類型的一個具體值。

(6)關系資料庫

對應于一個關系模型的所有關系的集合稱為關系資料庫。

(7)候選鍵

如果一個屬性或屬性集的值能夠唯一辨別一個關系的元組而又不包含多餘的屬性,則稱該屬性或屬性集為候選鍵。候選鍵也稱為候選碼或候選關鍵字。一個關系的候選鍵可以不唯一。

(8)主鍵

主鍵(primary key)也稱為主碼或主關鍵字,是表中的屬性或屬性組,用于唯一地确定一個元組。主鍵可以由一個屬性組成,也可以由多個屬性共同組成。例如,表1-1所示的學生關系中,學号就是其主鍵,因為學号的一個取值可以唯一地确定一個學生。而表1-3所示的選課關系的主鍵就由學号和課程号共同組成,因為一個學生可以選修多門課程,而且一門課程也可以有多個學生選修,是以,隻有将學号和課程号組合起來才能共同确定一行記錄。我們稱由多個屬性共同組成的主鍵為複合主鍵。當某個關系的主鍵是由多個屬性共同組成時,需要用括号将這些屬性括起來,表示共同作為主鍵。例如,表1-3中選課關系的主鍵是:(學号,課程号)。

《資料庫基礎及實踐技術——SQL Server 2008》一1.3 資料和資料模型

注意,我們不能根據關系表在某時刻存儲的内容來決定其主鍵,這樣做是不可靠的,這樣做隻能是猜測。表的主鍵與其實際的應用語義有關、與表的設計者的意圖有關。例如,對于表1-3,如果允許一個學生對同一門課程有多次考試(例如,對考試不及格的情況,一般都允許有多次考試),則選擇(學号,課程号)作為主鍵顯然就不夠了。對于這種情況,可以在表中添加一個新列:考試次數。現在學生選課表就包含學号、課程号、成績和考試次數4個屬性。對于允許一個學生對同一門課程有多次考試的情況,其主鍵為:(學号,課程号,考試次數)。為什麼不可以不添加“考試次數”列,而讓(學号,課程号,成績)作為該關系的主鍵,請讀者自己思考。

有時一個關系中可能存在多個可以作為主鍵的屬性,比如,對于“學生”關系,假設增加了“身份證号”屬性,則“身份證号”屬性也可以作為學生關系的主鍵。如果關系中存在多個可以作為主鍵的屬性,則稱這些屬性為候選鍵屬性,相應的鍵為候選鍵。從候選鍵中選取哪一個作為主鍵都可以,是以,主鍵是從候選鍵中選取出來的。

(9)主屬性和非主屬性

包含在任一候選鍵中的屬性稱為主屬性。不包含在任一候選鍵中的屬性稱為非主屬性。

例如,學生選課關系中,學号和課程号為主屬性,成績為非主屬性。

關系模型的資料操作

關系模型的操作對象是集合,而不是行,也就是操作的對象以及操作的結果都是完整的表(是包含行集的表,而不隻是單行,當然,隻包含一行資料的表是合法的,空表或不包含任何資料行的表也是合法的)。而非關系型資料庫系統中典型的操作是一次一行或一次一個記錄。是以,集合處理能力是關系系統差別于其他系統的一個重要特征。

關系模型的資料操作主要包括4種:查詢、插入、删除和修改。關系資料庫中的資訊隻有一種表示方式,那就是表中的行、列位置有明确的值。這種表示是關系系統中唯一可行的方式(當然,這裡指的是邏輯層)。特别地,關系資料庫中沒有連接配接一個表到另一個表的指針。在表1-1和表1-3中,表1-1的學生基本資訊的第一行資料與表1-3的學生選課資訊的第一行有聯系(當然也與第二行和第三行有聯系),因為學生0811101選了課程。但在關系資料庫中這種聯系不是通過指針來實作的,而是通過學生基本資訊表“學号”列的值與學生選課表“學号”列的值實作聯系的(學号值相等)。但在非關系系統中,這些資訊一般由指針來表示,這種指針對使用者來說是可見的。

需要注意的是,當我們說關系資料庫中沒有指針時,并不是指在實體層沒有指針,實際上,在關系資料庫的實體層也使用指針,但所有這些實體層的存儲細節對使用者來說都是不可見的。

關系模型的資料完整性限制

資料完整性是指資料庫中存儲的資料是有意義的或正确的。關系模型中的資料完整性規則是對關系的某種限制條件。它的資料完整性限制主要包括三大類:實體完整性、參照完整性和使用者定義的完整性。

(1)實體完整性

實體完整性指的是關系資料庫中所有的表都必須有主鍵,而且表中不允許存在如下的記錄:

無主鍵值的記錄

主鍵值相同的記錄

因為若記錄沒有主鍵值,則此記錄在表中一定是無意義的。前面介紹過,關系模型中的每一行記錄都對應客觀存在的一個執行個體或一個事實。例如,一個學号唯一地确定了一個學生。如果表中存在沒有學号的學生記錄,則此學生一定不屬于正常管理的學生。另外,如果表中存在主鍵值相等的兩個或多個記錄,則這兩個或多個記錄會對應同一個執行個體。這會出現兩種情況,第一,若表中的其他屬性值也完全相同,則這些記錄就是重複的記錄,存儲重複的記錄是無意義的;第二,若其他屬性值不完全相同則會出現語義沖突,比如同一個學生(學号相同),而其名字不同或性别不同,顯然不可能。

在關系資料庫中主鍵的屬性不能取空值。關系資料庫中的空值是特殊的标量常數,它代表未定義的(不适用的)或者有意義但目前還處于未知狀态的值。例如,當向表1-3所示的學生選課表中插入一行記錄時,在學生還沒有考試之前,其成績是不确定的,是以此列上的值為空。資料庫中的空值用“null”表示。

(2)參照完整性

參照完整性有時也稱為引用完整性。現實世界中的實體之間往往存在着某種聯系,在關系模型中,實體以及實體之間的聯系在關系資料庫中都用關系來表示,這樣就自然存在着關系(實體)與關系(實體)之間的引用關系。參照完整性就是描述實體之間聯系的。

參照完整性一般是指多個實體或關系表之間的關聯關系。如在表1-3中,學生選課表中的學生必須受限于表1-1的學生基本資訊表中已有的學生,我們不能在學生選課表中描述一個根本就不存在的學生的選課情況,也就是學生選課表中學号的取值必須在學生基本資訊表的學号的取值範圍内。這種一個表中某列的取值受另一個表的某列的取值範圍限制的特點稱為參照完整性。在關系資料庫中用外鍵(foreign key,有時也稱為外碼或外部關鍵字)來實作參照完整性。例如,我們隻要将學生選課表中的“學号”定義為引用學生基本資訊表中的“學号”的外鍵,就可以保證選課表中的“學号”的取值在學生基本資訊表中的已有“學号”範圍内。

外鍵一般出現在聯系所對應的關系中,用于表示兩個或多個實體之間的關聯關系。外鍵實際上是表中的一個(或多個)屬性,它引用某個其他表(特殊情況下,也可以是外鍵所在的表)的主鍵,當然,也可以是候選碼,但多數情況下是主鍵。

下面再看幾個指定外鍵的例子。

【例1-1】“學生”關系模式和“專業”關系模式所包含的屬性如下,其中主鍵用下劃線辨別。

學生(學号,姓名,性别,專業号,出生日期)

專業(專業号,專業名)

這兩個關系之間存在着引用關系,即“學生”關系中的“專業号”引用了“專業”關系中的“專業号”,顯然,“學生”關系中“專業号”的值必須是确實存在的專業的專業号。也就是說,“學生”關系中的“專業号”參照了“專業”關系中的“專業号”,即“學生”關系中的“專業号”是引用了“專業”關系中的“專業号”的外鍵。

【例1-2】學生、課程以及學生與課程之間的選課情況可以用如下3個關系模式表示:

課程(課程号,課程名,學分)

選課(學号,課程号,成績)

在這3個關系模式中,“選課”中的“學号”必須是“學生”中已有的學生,是以“選課”中的“學号”引用了“學生”中的“學号”。同樣“選課”中的“課程号”也必須是“課程”中已有的課程,即“選課”中的“課程号”引用了“課程”中的“課程号”。是以,“選課”中的“學号”是引用了“學生”中“學号”的外鍵,而“選課”中的“課程号”是引用了“課程”中“課程号”的外鍵。

主鍵要求必須是非空且不重複的,但外鍵無此要求。外鍵可以有重複值,這點我們從表1-3可以看出。外鍵也可以取空值,例如,職工與其所在的部門可以用如下兩個關系模式表示:

職工(職工号,職工名,部門号,工資級别)

部門(部門号,部門名)

其中,“職工”中的“部門号”是引用“部門”中“部門号”的外鍵,如果某個新來職工還沒有被配置設定到具體的部門,則其“部門号”就為空值;如果這個職工已經被配置設定到了某個部門,則其部門号就有了确定的值(非空值)。

另外,外鍵不一定要與被引用列同名,隻要它們的語義相同即可。例如,對于例1-1中的學生關系模式,如果将該關系模式中的“專業号”改為“所學專業”也是可以的,隻要“所學專業”屬性的語義與專業關系模式中的“專業号”語義相同,且取值域相同即可。

(3)使用者定義的完整性

使用者定義的完整性也稱為域完整性或語義完整性。任何關系資料庫系統都應該支援實體完整性和參照完整性,除此之外,不同的資料庫應用系統根據其應用環境的不同,往往還需要一些特殊的限制條件,使用者定義的完整性就是針對某一具體應用領域定義的資料限制條件,它反映某一具體應用所涉及的資料必須要滿足應用語義的要求。

使用者定義的完整性實際上就是指明關系中屬性的取值範圍,也就是屬性的域,即限制關系中的屬性的取值類型及取值範圍,防止屬性的值與應用語義沖突。例如,學生的考試成績的取值範圍為0~100,或取{優、良、中、及格、不及格}。又如,假設有工作表(工作編号,工作性質,最低工資,最高工資),則應該限制其中的“最低工資”要小于或等于“最高工資”。

e-r模型向關系模型的轉換要解決的問題是如何将實體以及實體間的聯系轉換為關系模式,如何确定這些關系模式的屬性和鍵。

關系模型的邏輯結構是一組關系模式的集合。e-r圖由實體、實體的屬性以及實體之間的聯系三部分組成,是以将e-r圖轉換為關系模型實際上就是将實體、實體的屬性以及實體間的聯系轉換為關系模式,轉換的一般規則為:

一個實體轉換為一個關系模式。實體的屬性就是關系的屬性,實體的辨別符就是關系的主鍵。

對于實體間的聯系有以下不同的情況:

1)一個1∶1聯系可以轉換為一個獨立的關系模式,也可以與任意一端所對應的關系模式合并。

如果轉換為一個獨立的關系模式,則與該聯系相連的各實體的碼以及聯系本身的屬性均轉換為關系的屬性,每個實體的碼均是該關系模式的主鍵,同時也是引用各自實體的外鍵。

如果是與聯系的任意一端實體所對應的關系模式合并,則需要在該關系模式的屬性中加入另一個實體的碼和聯系本身的屬性,同時新加入的實體的碼為此關系模式中引用另一個實體的外鍵。

2)一個1∶n聯系可以轉換為一個獨立的關系模式,也可以與n端所對應的關系模式合并。

如果轉換為一個獨立的關系模式,則與該聯系相連的各實體的碼以及聯系本身的屬性均轉換為關系模式的屬性,而關系模式的主鍵為n端實體的碼,同時n端實體的碼為此新關系模式中引用n端實體的外鍵,1端實體的碼作為引用1端實體的外鍵。

如果是與n端所對應的關系模式合并,則需要在n端對應的關系模式的屬性中加入1端實體的碼以及聯系本身的屬性,同時1端實體的碼在n端實體中作為引用1端實體的外鍵。

3)一個m∶n聯系轉換為一個獨立的關系模式,與該聯系相連的各實體的碼以及聯系本身的屬性均轉換為該關系模式的屬性,新關系模式的主鍵包含各實體的碼,同時新關系模式中各實體的碼為引用各自實體的外鍵。

3個或3個以上實體間的一個多元聯系可以轉換為一個關系模式。與該多元聯系相連的各實體的碼以及聯系本身的屬性均轉換為此關系模式的屬性,而此關系模式的碼包含各實體的碼,同時新關系模式中的各實體的碼為引用各自實體的外鍵。

具有相同主鍵的關系模式可以合并。

【例1-3】1∶1聯系示例。設有描述部門和經理關系的e-r圖如圖1-8所示,将其轉換為合适的關系模式。

解:對于1∶1聯系,可以有下列兩種轉換方法。

1)将聯系與某一端實體的關系模式合并,則轉換後的結果為:

經理(經理号,經理名,電話)

其中“經理号”為主鍵。

部門(部門号,部門名,經理号)

其中“部門号”為主鍵,“經理号”為引用“經理”關系模式的外鍵。

或者:

經理(經理号,部門号,經理名,電話)

其中“經理号”為主鍵,“部門号”為引用“部門”關系模式的外鍵。

其中“部門号”為主鍵。

2)将聯系轉換為一個獨立的關系模式,則轉換後的結果為:

部門_經理(經理号,部門号)

其中“經理号”和“部門号”為候選鍵,同時也為引用“部門”和“經理”關系模式的外鍵。

在1∶1聯系中一般不将聯系單獨設計為一個關系模式,因為這樣轉換出來的關系模式個數比較多,對應的表的個數也多,而查詢時涉及的表個數越多,查詢效率就越低。

【例1-4】1∶n聯系示例。設有描述部門和職工關系的e-r圖如圖1-9所示,将其轉換為合适的關系模式。

解:對于1∶n聯系,可以有下列兩種轉換方法。

1)如果将聯系與n端實體的關系模式合并,則轉換成如下兩個關系模式:

職工(職工号,部門号,職工名,性别)

其中“職工号”為主鍵,“部門号”為引用“部門”關系模式的外鍵。

2)如果将聯系作為一個獨立的關系模式,則轉換為如下3個關系模式:

職工(職工号,職工名,性别)

其中“職工号”為主鍵。

部門_職工(部門号,職工号)

其中“職工号”為主鍵,同時也為引用“職工”關系模式的外鍵,“部門号”為引用“部門”關系模式的外鍵。

同1∶1聯系轉換為關系模式的原因一樣,對于1∶n聯系,通常也不将聯系轉換為一個獨立的關系模式。

【例1-5】m∶n聯系示例。設有描述教師、課程和教師授課關系的e-r圖,如圖1-10所示,将其轉換為合适的關系模式。

解:對于m∶n聯系,必須将聯系轉換為一個獨立的關系模式。該e-r圖轉換後的結果為:

教師(教師号,教師名,職稱)

其中“教師号”為主鍵。

其中“課程号”為主鍵。

授課(教師号,課程号,授課時數)

其中(教師号,課程号)為主鍵,同時也為引用“教師”和“課程”關系模式的外鍵。