數(shù)據(jù)庫管理系統(tǒng)的用戶最終關(guān)心的是某個現(xiàn)實(shí)世界中的企業(yè),在數(shù)據(jù)庫管理系統(tǒng)中存儲的數(shù)據(jù)描述了該企業(yè)的方方面面。比如,在一個大學(xué)里,有學(xué)生、教師、課程等實(shí)體。在大學(xué)數(shù)據(jù)庫中的數(shù)據(jù)描述了這些實(shí)體及其之間的關(guān)系。
一個數(shù)據(jù)模型就是一個由高級數(shù)據(jù)描述結(jié)構(gòu)組成的集合,隱藏了許多底層的存儲細(xì)節(jié)。數(shù)據(jù)庫管理系統(tǒng)允許用戶使用數(shù)據(jù)模型的術(shù)語來定義要存儲的數(shù)據(jù)。本書重點(diǎn)介紹的是關(guān)系數(shù)據(jù)模型,它是今天許多數(shù)據(jù)庫管理系統(tǒng)的基礎(chǔ)。
雖然數(shù)據(jù)模型隱藏了很多細(xì)節(jié),但是跟用戶如何看待蘊(yùn)含的企業(yè)相比,數(shù)據(jù)模型還是更接近數(shù)據(jù)庫管理系統(tǒng)如何存儲數(shù)據(jù)。
一個語義數(shù)據(jù)模型是一個更抽象的高級數(shù)據(jù)模型,使得用戶能夠更容易地構(gòu)想出一個良好的有關(guān)企業(yè)數(shù)據(jù)的初始描述。
這些模型包含了許多對描述企業(yè)實(shí)際場景有幫助的結(jié)構(gòu)。數(shù)據(jù)庫管理系統(tǒng)并不打算直接支持所有的結(jié)構(gòu),它是圍繞僅有幾個基礎(chǔ)結(jié)構(gòu)的數(shù)據(jù)模型構(gòu)建的,比如關(guān)系模型。
使用語義模型描述的數(shù)據(jù)庫設(shè)計可以作為一個很好的開始,并在接下來被轉(zhuǎn)換成使用數(shù)據(jù)庫管理系統(tǒng)實(shí)際支持的數(shù)據(jù)模型描述的數(shù)據(jù)庫設(shè)計。
一個廣泛使用的語義模型是實(shí)體-關(guān)系模型,允許我們圖形化描述實(shí)體及其之間的關(guān)系,詳情請看第2章。
1.5.1 關(guān)系數(shù)據(jù)模型
本小節(jié)簡單介紹了關(guān)系模型。
在關(guān)系模型中,核心的數(shù)據(jù)描述結(jié)構(gòu)是關(guān)系,關(guān)系可被認(rèn)為是一個由記錄組成的集合。
一個schema就是使用數(shù)據(jù)模型提供的術(shù)語對數(shù)據(jù)進(jìn)行的一個描述。
在關(guān)系模型中,一個關(guān)系的schema描述了關(guān)系的名字、每個字段的名字、每個字段的類型。比如,在一個大學(xué)數(shù)據(jù)庫中的學(xué)生信息可能存儲在一個有如下schema的關(guān)系中:
Student(sid:string,name:string,login :string,age:integer,gpa:real)
上述schema說的是在Student關(guān)系中的每個記錄有5個字段,且指出了每個字段的名字和類型。
在Student關(guān)系中的每一行是一條描述了一個學(xué)生的記錄。注意,雖然這份描述是不完整的,但是對一個大學(xué)數(shù)據(jù)庫的潛在應(yīng)用已經(jīng)足夠了。每行遵守了Student關(guān)系的schema。因此,可以認(rèn)為schema是描述一個學(xué)生的模板。
通過應(yīng)用在一個關(guān)系中的每個記錄必須要滿足的完整性約束,我們可以更精確地描述多個學(xué)生組成的集合。比如,我們可以要求:每個學(xué)生必須有唯一的sid。注意到,簡單地向Student關(guān)系中添加一個字段是不能實(shí)現(xiàn)前述要求的。對一個字段的值的唯一性描述會提升數(shù)據(jù)描述的精確性??捎玫拿枋鐾暾约s束的結(jié)構(gòu)是一個數(shù)據(jù)模型中很重要的方面。
其他的數(shù)據(jù)模型
除了關(guān)系模型外,還有分層模型、網(wǎng)絡(luò)模型、面向?qū)ο髷?shù)據(jù)模型、對象關(guān)系數(shù)據(jù)模型。雖然有許多數(shù)據(jù)庫使用層級和網(wǎng)絡(luò)模型,基于面向?qū)ο笈c對象關(guān)系模型的數(shù)據(jù)庫系統(tǒng)在市場上不斷獲得認(rèn)可,但是占主導(dǎo)位置的模型依然是關(guān)系模型。
在這本書中,我們的重點(diǎn)是關(guān)系模型,因?yàn)樗膹V泛使用和重要性。確實(shí),對象-關(guān)系模型正在努力地整合關(guān)系模型和面向?qū)ο蟮幕咎卣?,理解關(guān)系模型對理解對象關(guān)系概念是必須的,詳情請看第23章。
1.5.2 分層抽象
在數(shù)據(jù)庫管理系統(tǒng)中,通過三個抽象層來描述數(shù)據(jù)。數(shù)據(jù)庫描述是由在每個抽象層上的一個schema組成的。這3個抽象層依次是概念層、物理層、外部層。
使用數(shù)據(jù)定義語言DDL來定義外部schema和概念schema。我們將在第3章中討論SQL的DDL。雖然所有數(shù)據(jù)庫管理系統(tǒng)都支持命令來描述物理schema,但是這些命令不是SQL語言標(biāo)準(zhǔn)的一部分。有關(guān)概念schema、外部schema、物理schema的信息被保存在系統(tǒng)目錄中,詳情請看12.1節(jié)。本節(jié)剩余部分討論3個抽象層。
概念schema
概念schema是用數(shù)據(jù)庫管理系統(tǒng)的數(shù)據(jù)模型術(shù)語來描述被存儲的數(shù)據(jù)。
在關(guān)系數(shù)據(jù)庫系統(tǒng)中,概念schema描述了在數(shù)據(jù)庫中存儲的所有關(guān)系。在我們簡單的大學(xué)示例中,這些關(guān)系包括了有關(guān)實(shí)體的信息,比如學(xué)生和教師等實(shí)體,以及實(shí)體之間的關(guān)系,比如學(xué)生注冊課程等關(guān)系。如前面所示,使用Student關(guān)系中的記錄來描述所有學(xué)生的實(shí)體。實(shí)際上,每個由實(shí)體組成的集合以及每個由關(guān)系組成的集合都可用一個關(guān)系來描述,得到了如下所示的概念schema:
選擇關(guān)系及其字段并不是那么的顯然,獲取一個良好的概念schema的過程就是概念數(shù)據(jù)庫設(shè)計,詳情請看第2、19章。
物理schema
物理schema描述了額外的存儲細(xì)節(jié)。從本質(zhì)上看,物理schema總結(jié)了在概念schema中描述的數(shù)據(jù)是如何被保存在諸如硬盤等二級存儲設(shè)備中的。
我們必須決定使用什么樣的文件組織來存儲關(guān)系。為了加速數(shù)據(jù)檢索操作,我們必須創(chuàng)建索引這類額外的數(shù)據(jù)結(jié)構(gòu)。
大學(xué)數(shù)據(jù)庫的物理schema示例如下所示:
- 在無序的記錄文件中存儲所有的關(guān)系。注意,在數(shù)據(jù)庫管理系統(tǒng)中的文件要么是由記錄組成的集合,要么是有頁組成的集合,不是像在操作系統(tǒng)中由字符組成的字符串的那樣。
- 在Students、Faculty、Courses等關(guān)系的第一列、Faculty的sal列、Rooms上的capacity列上創(chuàng)建索引。
基于對如何訪問數(shù)據(jù)的理解,做出有關(guān)物理schema的決定。達(dá)到一個良好的物理schema的過程就是物理數(shù)據(jù)庫設(shè)計,詳情請看第20章。
外部schema
外部schema也是用數(shù)據(jù)庫管理系統(tǒng)的數(shù)據(jù)模型來描述的,允許數(shù)據(jù)被獨(dú)立的用戶或者用戶群自定義訪問。
任何一個給定的數(shù)據(jù)庫有且只有一個概念schema和一個物理schema,因?yàn)殡m然它僅有一個存儲的關(guān)系集,但是它可能有多個為特定用戶群組自定義的外部schema。
每個外部schema是由一個或者多個視圖及來自概念schema的關(guān)系組成的集合。
從概念上講,一個視圖就是一個關(guān)系,但是在數(shù)據(jù)庫管理系統(tǒng)中不存儲它的記錄。視圖的記錄是使用視圖的定義、通過存儲在DBMS中的關(guān)系計算出來的。詳情請看第3章、第25章。
終端用戶的需求指導(dǎo)著外部shema的設(shè)計。比如,假設(shè)要找出所有教課的教師姓名以及課程注冊人數(shù)。可定義如下視圖:
Courseinfo(rid:string, fname:string, enrollment:integer)
用戶把視圖看做是關(guān)系,對視圖中的記錄提出問題。視圖中的記錄不是被顯式地被存儲,是被按需計算出來的。因?yàn)槟芨鶕?jù)來自概念schema的關(guān)系中計算出Courseinfo,且額外存儲Courseinfo是多余的,所以概念schema中不包括Courseinfo。這樣的冗余不僅浪費(fèi)空間,而且會導(dǎo)致不一致。比如,有可能出現(xiàn):向Enrolled關(guān)系中插入一條記錄表明某個學(xué)生注冊了某門課,但是沒有增加Courseinfo中的enrollment字段的值。
1.5.3 數(shù)據(jù)獨(dú)立性
使用DBMS的一個非常重要的優(yōu)點(diǎn)是它提供了數(shù)據(jù)獨(dú)立性,即應(yīng)用程序不受數(shù)據(jù)結(jié)構(gòu)和存儲方式變化的影響。
通過使用3層數(shù)據(jù)抽象可以實(shí)現(xiàn)數(shù)據(jù)獨(dú)立性,尤其是概念shecma和外部schema為數(shù)據(jù)獨(dú)立性提供了明顯的好處。
從原理上看,在外部shema(視圖關(guān)系)中的關(guān)系是按需從概念schema的關(guān)系中生成。如果底層的數(shù)據(jù)被重新組織了,即概念schema發(fā)生了變化,則可以修改視圖關(guān)系的定義來使得:可以向之前一樣來計算同樣的視圖關(guān)系。
比如,在我們的大學(xué)數(shù)據(jù)庫中的Faculty關(guān)系被如下兩個關(guān)系取代:
Faculty_public(fid:string, fname:string, office:integer)
Faculty_private(fid:string, sal:real)
從直覺上看,有關(guān)教師的一些保密信息被放到了一張單獨(dú)的表里,并增加了有關(guān)office的信息。Courseinfo視圖關(guān)系可以用Faculty_public和Faculty_private來重新定義,以便一個查詢Courseinfo的用戶可跟之前一樣得到相同的答案。
因此,用戶是被屏蔽了數(shù)據(jù)的邏輯結(jié)構(gòu)的改變,或者選擇存儲哪些關(guān)系的改變。這種性質(zhì)就是邏輯數(shù)據(jù)獨(dú)立性。
接著,概念schema向用戶屏蔽了物理存儲細(xì)節(jié)的改變,比如數(shù)據(jù)在硬盤上如何放置、文件結(jié)構(gòu)、索引的選擇等細(xì)節(jié),這種性質(zhì)就是物理數(shù)據(jù)獨(dú)立性。只要概念schema保持一樣,則我們就可以改變存儲細(xì)節(jié)而不用改變應(yīng)用。