- 數(shù)據(jù)庫系統(tǒng)原理及應(yīng)用教程(第5版)
- 苗雪蘭 劉瑞新等編著
- 13218字
- 2020-09-18 17:44:20
2.2 常見的數(shù)據(jù)模型
數(shù)據(jù)庫系統(tǒng)中最常使用的數(shù)據(jù)模型是層次模型、網(wǎng)狀模型和關(guān)系模型,新興的數(shù)據(jù)模型是面向?qū)ο髷?shù)據(jù)模型和對象關(guān)系數(shù)據(jù)模型。本節(jié)較詳細(xì)地介紹經(jīng)常使用的3種數(shù)據(jù)模型的結(jié)構(gòu)特點和完整性約束條件,分析對照它們的性能,指出其優(yōu)缺點和使用場合。本節(jié)也介紹新興數(shù)據(jù)模型的概念和方法。
2.2.1 數(shù)據(jù)模型概述
數(shù)據(jù)模型具有數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)操作和數(shù)據(jù)約束條件三要素。認(rèn)識或描述一種數(shù)據(jù)模型也要從它的三要素開始。
1.數(shù)據(jù)模型的三要素
數(shù)據(jù)模型是一組嚴(yán)格定義的概念集合。這些概念精確地描述了系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)操作和數(shù)據(jù)完整性約束條件。下面就介紹這些概念。
(1)數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)是所研究的對象類型(Object Type)的集合。這些對象是數(shù)據(jù)庫的組成成分,它們包括兩類:一類是與數(shù)據(jù)類型、內(nèi)容和性質(zhì)有關(guān)的對象,例如,層次模型或網(wǎng)狀模型中的數(shù)據(jù)項和記錄,關(guān)系模型中的關(guān)系和屬性等;另一類是與數(shù)據(jù)之間聯(lián)系有關(guān)的對象,例如,在網(wǎng)狀模型中由于記錄型之間的復(fù)雜聯(lián)系,為了區(qū)分記錄型之間不同的聯(lián)系,對聯(lián)系進(jìn)行命名,命名的聯(lián)系稱之為系型(Set Type)。
在數(shù)據(jù)庫系統(tǒng)中,通常按照數(shù)據(jù)結(jié)構(gòu)的類型來命名數(shù)據(jù)模型,例如,層次結(jié)構(gòu)、網(wǎng)狀結(jié)構(gòu)和關(guān)系結(jié)構(gòu)的數(shù)據(jù)模型分別被命名為層次模型、網(wǎng)狀模型和關(guān)系模型。
(2)數(shù)據(jù)操作
數(shù)據(jù)操作是指對數(shù)據(jù)庫中各種數(shù)據(jù)對象允許執(zhí)行的操作集合。數(shù)據(jù)操作包括操作對象和有關(guān)的操作規(guī)則兩部分。數(shù)據(jù)庫中的數(shù)據(jù)操作主要有數(shù)據(jù)檢索和數(shù)據(jù)更新(即插入、刪除或修改數(shù)據(jù)的操作)兩大類操作。
數(shù)據(jù)模型必須對數(shù)據(jù)庫中的全部數(shù)據(jù)操作進(jìn)行定義,指明每項數(shù)據(jù)操作的確切含義、操作對象、操作符號、操作規(guī)則及對操作的語言約束等。數(shù)據(jù)操作是對系統(tǒng)動態(tài)特性的描述。
(3)數(shù)據(jù)約束條件
數(shù)據(jù)約束條件是一組數(shù)據(jù)完整性規(guī)則的集合。數(shù)據(jù)完整性規(guī)則是指數(shù)據(jù)模型中的數(shù)據(jù)及其聯(lián)系所具有的制約和依存規(guī)則。數(shù)據(jù)約束條件用以限定符合數(shù)據(jù)模型的數(shù)據(jù)庫狀態(tài)及狀態(tài)的變化,以保證數(shù)據(jù)庫中數(shù)據(jù)的正確、有效和相容。
每種數(shù)據(jù)模型都規(guī)定有基本的完整性約束條件,這些完整性約束條件要求所屬的數(shù)據(jù)模型都應(yīng)滿足。同理,每個數(shù)據(jù)模型還規(guī)定了特殊的完整性約束條件,以滿足具體應(yīng)用的要求。例如,在關(guān)系模型中,基本的完整性約束條件是實體完整性和參照完整性,特殊的完整性條件是用戶定義的完整性。
2.常見的數(shù)據(jù)模型
當(dāng)前,數(shù)據(jù)庫領(lǐng)域最常用的數(shù)據(jù)模型主要有3種,它們是層次模型(Hierarchical Model)、網(wǎng)狀模型(Network Model)和關(guān)系模型(Relational Model)。
層次模型和網(wǎng)狀模型統(tǒng)稱非關(guān)系模型。非關(guān)系模型的數(shù)據(jù)庫系統(tǒng)在20世紀(jì)70年代至80年代初非常流行,在當(dāng)時的數(shù)據(jù)庫產(chǎn)品中占據(jù)了主導(dǎo)地位。關(guān)系模型的數(shù)據(jù)庫系統(tǒng)在70年代開始出現(xiàn),之后發(fā)展迅速,并逐步取代了非關(guān)系模型數(shù)據(jù)庫系統(tǒng)的統(tǒng)治地位。現(xiàn)在流行的數(shù)據(jù)庫系統(tǒng)大都是基于關(guān)系模型的。
在非關(guān)系模型中,實體集用記錄表示,實體的屬性對應(yīng)記錄的數(shù)據(jù)項(或字段)。實體集之間的聯(lián)系轉(zhuǎn)換成記錄之間的兩兩聯(lián)系。非關(guān)系模型中數(shù)據(jù)結(jié)構(gòu)的單位是基本層次聯(lián)系。所謂基本層次是指兩個記錄及它們之間的一對多(包括一對一)的聯(lián)系,其結(jié)構(gòu)和表示方法如圖2-7所示。
在圖2-7中,Ri位于聯(lián)系Lij的始結(jié)點,稱為雙親結(jié)點(Parent);Rj位于聯(lián)系Lij的終結(jié)點,稱為子女結(jié)點(Child)。
圖2-7 基本層次聯(lián)系
2.2.2 層次模型
層次模型是數(shù)據(jù)庫系統(tǒng)中最早出現(xiàn)的數(shù)據(jù)模型,層次數(shù)據(jù)庫系統(tǒng)采用層次模型作為數(shù)據(jù)的組織方式。層次數(shù)據(jù)庫系統(tǒng)的典型代表是IBM公司的IMS(Information Management System)。層次模型用樹形結(jié)構(gòu)來表示各類實體及實體間的聯(lián)系。
1.層次模型的數(shù)據(jù)結(jié)構(gòu)
(1)層次模型的定義
在數(shù)據(jù)結(jié)構(gòu)中,定義滿足下面兩個條件的基本層次聯(lián)系的集合為層次模型。
1)有且僅有一個結(jié)點沒有雙親結(jié)點,這個結(jié)點稱為根結(jié)點。
2)除根結(jié)點之外的其他結(jié)點有且只有一個雙親結(jié)點。
(2)層次模型的數(shù)據(jù)表示方法
層次模型中的數(shù)據(jù)用下列方法表示。
在層次模型中,實體集使用記錄表示;記錄型包含若干個字段,字段用于描述實體的屬性;記錄值表示實體;記錄之間的聯(lián)系使用基本層次聯(lián)系表示。層次模型中的每個記錄可以定義一個排序字段,排序字段也稱為碼字段,其主要作用是確定記錄的順序。如果排序字段的值是唯一的,則它能唯一地標(biāo)識一個記錄值。
在層次模型中,使用結(jié)點表示記錄。記錄之間的聯(lián)系用結(jié)點之間的連線表示,這種聯(lián)系是父子之間的一對多的實體聯(lián)系。層次模型中的同一雙親的子女結(jié)點稱為兄弟結(jié)點(Twin或Sibling),沒有子女結(jié)點的結(jié)點稱為葉結(jié)點。圖2-8給出了一個層次模型的例子,其中,R1為根結(jié)點,R2和R3都是R1的子女結(jié)點,R2和R3為兄弟結(jié)點;R4和R5是R3的子女結(jié)點,R4和R5也為兄弟結(jié)點;R2、R4和R5為葉結(jié)點。
圖2-8 層次模型的一個示例
(3)層次模型的特點
層次模型像一棵倒立的樹,只有一個根結(jié)點,有若干個葉結(jié)點,結(jié)點的雙親是唯一的。圖2-9是一個教學(xué)院系的數(shù)據(jù)模型,該層次數(shù)據(jù)結(jié)構(gòu)中有4個記錄。
圖2-9 教學(xué)院系的數(shù)據(jù)模型
在圖2-9所示的模型中,院系記錄是根結(jié)點,它有院系編號、院系名稱和辦公地點3個數(shù)據(jù)項,其兩個子女結(jié)點是教研室和學(xué)生記錄;教研室記錄是院系的子女結(jié)點,它還是教師的雙親結(jié)點,教研室記錄由教研室編號、教研室名兩個數(shù)據(jù)項組成;學(xué)生記錄由學(xué)號、姓名和年齡3個數(shù)據(jù)項組成;教師記錄由職工號、姓名和專業(yè)方向3個數(shù)據(jù)項組成。學(xué)生與教師是葉結(jié)點,它們沒有子女結(jié)點。在該層次數(shù)據(jù)結(jié)構(gòu)中,院系與教研室、教研室與教師、院系與學(xué)生的聯(lián)系均是一對多的聯(lián)系。圖2-10是教學(xué)院系數(shù)據(jù)模型對應(yīng)的一個實例。
在圖2-10中,根記錄值為“D10,計算機系,9號樓”,它與教研室的“C01,硬件教研室”和“C02,軟件教研室”有聯(lián)系,同時,也與學(xué)生的“00001,王平,20”和“00002,李麗,20”有聯(lián)系;這4個位于子女結(jié)點的記錄值是它對應(yīng)的上層結(jié)點記錄值的屬記錄值,而它們對應(yīng)的上層記錄值是首記錄值。硬件教研室有屬記錄值“92001,王海,電器”和“92002,張錚,自動化”,軟件教研室有“92003,許明,數(shù)據(jù)庫”和“92004,陳真,人工智能”。層次結(jié)構(gòu)數(shù)據(jù)的一個實例由一個根記錄值和它的全部屬記錄值組成,全部屬記錄值包括屬記錄、屬記錄的屬記錄……直到位于葉結(jié)點的屬記錄為止。
圖2-10 教學(xué)院系數(shù)據(jù)模型對應(yīng)的一個實例
層次模型具有一個基本特點:對于任何一個給定的記錄值,只有按其路徑查看,才能顯示出它的全部意義,沒有一個子女記錄值能夠脫離雙親記錄值而獨立存在。例如,對于圖2-10中的學(xué)生記錄值(00001,王平,20),如果不指出它的雙親結(jié)點,就不知道它是哪個院系的學(xué)生。
雖然理論上認(rèn)為一個層次模型可以包含任意多的記錄和字段數(shù)據(jù),但任何實際的數(shù)據(jù)庫系統(tǒng)都會因為存儲容量或者實現(xiàn)復(fù)雜度的原因,對層次模型中包含的記錄個數(shù)和字段個數(shù)進(jìn)行限制。
2.層次模型中多對多聯(lián)系的表示
前面提到,層次模型只能表示一對多(包括一對一)的聯(lián)系,而不能直接地表示多對多的聯(lián)系。當(dāng)有多對多聯(lián)系需要在層次模型中表示時,應(yīng)采用分解的方法,即將多對多的聯(lián)系分解成一對多的聯(lián)系,使用多個一對多聯(lián)系來表示一個多對多聯(lián)系。分解方法主要有兩種:冗余結(jié)點分解法和虛擬結(jié)點分解法。
圖2-11是一個含有多對多聯(lián)系的E-R圖。圖中有學(xué)生和課程兩個實體集,它們之間的聯(lián)系為多對多類型,即一個學(xué)生可以選修多門課程,一門課程可由多個學(xué)生選修。下面用這個例子說明多對多聯(lián)系的分解方法。
圖2-11 一個多對多聯(lián)系的例子
(1)冗余結(jié)點分解法
冗余結(jié)點分解法是通過增加冗余結(jié)點的方法將多對多的聯(lián)系轉(zhuǎn)換成一對多的聯(lián)系。對于圖2-11所示的多對多聯(lián)系的實例,要設(shè)計兩組學(xué)生和課程記錄:一組表示一個學(xué)生選擇多門課程的學(xué)生與課程之間的1∶n聯(lián)系;另一組表示一門課程有多個學(xué)生選擇的課程與學(xué)生之間的1∶n聯(lián)系,其基本層次聯(lián)系如圖2-12所示。顯然,使用冗余結(jié)點分解法會使數(shù)據(jù)庫中有冗余的學(xué)生和課程記錄。
圖2-12 用冗余結(jié)點分解法表示多對多聯(lián)系
(2)虛擬結(jié)點分解法
所謂虛擬結(jié)點就是一個指引元,該指引元指向所代替的結(jié)點。虛擬結(jié)點分解法通過使用虛擬結(jié)點,將實體集間的多對多聯(lián)系分解為多個層次模型,然后用多個層次模型表示一對多聯(lián)系。將圖2-12中的冗余結(jié)點轉(zhuǎn)換為虛擬結(jié)點,可得到具有虛擬結(jié)點的基本層次聯(lián)系,如圖2-13所示。
圖2-13 用虛擬結(jié)點分解法表示多對多聯(lián)系
上面兩種方法各有所長。冗余結(jié)點分解法的優(yōu)點是結(jié)構(gòu)清晰,允許結(jié)點改變存儲位置;缺點是占用存儲空間大,有潛在的不一致性。虛擬結(jié)點分解法的優(yōu)點是占用存儲空間小,能夠避免潛在的不一致性問題;缺點是結(jié)點改變存儲位置時可能引起虛擬結(jié)點指針的改變。
3.層次模型的數(shù)據(jù)操作和完整性約束條件
層次模型的數(shù)據(jù)操作主要是數(shù)據(jù)的查詢、插入、刪除和修改。層次模型必須滿足的完整性約束條件如下。
1)在進(jìn)行插入記錄值操作時,如果沒有指明相應(yīng)的雙親記錄值(首記錄值),則不能插入子女記錄值(屬記錄值)。
例如,在圖2-9的層次數(shù)據(jù)庫中,若轉(zhuǎn)學(xué)來一個學(xué)生,但還沒有為該學(xué)生指明院系,則不能將該學(xué)生記錄插入到數(shù)據(jù)庫中。
2)進(jìn)行刪除記錄操作時,如果刪除雙親記錄值(首記錄值),則相應(yīng)的子女結(jié)點值(屬記錄值)也同時被刪除。
例如,在圖2-9的層次數(shù)據(jù)庫中,若刪除軟件教研室,則該教研室的教師數(shù)據(jù)將全部丟失;若刪除計算機系,則計算機系所有的學(xué)生和教研室將全部被刪除,相應(yīng)的所有教師也將被全部刪除。
3)進(jìn)行修改記錄操作時,應(yīng)修改所有相應(yīng)記錄,以保證數(shù)據(jù)的一致性。
例如,在圖2-12的層次模型中,若修改一個學(xué)生的年齡,則兩處學(xué)生記錄值的年齡字段都要執(zhí)行修改操作。同樣,要增加一個學(xué)生記錄值時,也要同時對兩處的學(xué)生記錄執(zhí)行插入操作,結(jié)果不僅造成操作麻煩,還特別容易引起數(shù)據(jù)不一致的問題。
4.層次模型的存儲結(jié)構(gòu)
在層次數(shù)據(jù)庫中,不但要存儲數(shù)據(jù),而且還要存儲數(shù)據(jù)之間的層次聯(lián)系。層次模型數(shù)據(jù)的存儲一般使用鄰接存儲法和鏈接存儲法實現(xiàn)。
(1)鄰接存儲法
鄰接存儲法是按照層次樹前序遍歷的順序,把所有記錄值依次鄰接存放,即通過物理空間的位置相鄰來安排(或隱含)層次順序,實現(xiàn)存儲。
例如,對于圖2-14a所示的數(shù)據(jù)模型,它的一個實例如圖2-14b所示。
圖2-14 層次數(shù)據(jù)庫及其實例
圖2-15為圖2-14所示實例按鄰接存儲法存放的實例。
圖2-15 鄰接存儲法存放的實例
(2)鏈接存儲法
鏈接存儲法是用指引元來反映數(shù)據(jù)之間的層次聯(lián)系,它主要有子女-兄弟鏈接法和層次序列鏈接法兩種方法。
1)子女-兄弟鏈接法。子女-兄弟鏈接法要求每個記錄設(shè)兩個指引元,一個指引元指向它的最左邊的子女記錄值(屬記錄值),另一個指引元指向它的最近兄弟記錄。圖2-14b所示的實例,如果用子女-兄弟鏈接法表示,其結(jié)構(gòu)如圖2-16所示。
圖2-16 子女-兄弟鏈接法
2)層次序列鏈接法。層次序列鏈接法按樹的前序穿越順序,鏈接各記錄值。圖2-14b所示的實例,如果用層次序列鏈接法表示,其結(jié)構(gòu)如圖2-17所示。
圖2-17 層次序列鏈接法
2.2.3 網(wǎng)狀模型
在現(xiàn)實世界中,許多事物之間的聯(lián)系是非層次結(jié)構(gòu)的,它們需要使用網(wǎng)狀模型表示。網(wǎng)狀數(shù)據(jù)庫系統(tǒng)是采用網(wǎng)狀模型作為數(shù)據(jù)組織方式的數(shù)據(jù)庫系統(tǒng)。網(wǎng)狀數(shù)據(jù)庫系統(tǒng)的典型代表是DBTG系統(tǒng),也稱CODASYL系統(tǒng)。它是20世紀(jì)70年代數(shù)據(jù)系統(tǒng)語言研究會CODASYL(Conference On Data System Language)下屬的數(shù)據(jù)庫任務(wù)組(Data Base Task Group,DBTG)提出的一個系統(tǒng)方案。DBTG系統(tǒng)雖然不是實際的數(shù)據(jù)庫軟件系統(tǒng),但是它提出的基本概念、方法和技術(shù),對網(wǎng)狀數(shù)據(jù)庫系統(tǒng)的研制和發(fā)展產(chǎn)生了重大的影響,后來不少的數(shù)據(jù)庫系統(tǒng)都采用了DBTG模型。例如,HP公司的IMAGE、Univac公司的DMS1100、Honeywell公司的IDS/2和Cullinet Software公司的IDMS等。
1.網(wǎng)狀模型的數(shù)據(jù)結(jié)構(gòu)
(1)網(wǎng)狀模型結(jié)構(gòu)的基本特征
滿足以下兩個條件的基本層次聯(lián)系的集合稱為網(wǎng)狀模型。
1)有一個以上的結(jié)點沒有雙親。
2)結(jié)點可以有多于一個的雙親。
圖2-18分別為網(wǎng)狀模型的3個例子。
圖2-18 網(wǎng)狀模型的例子
網(wǎng)狀模型的結(jié)構(gòu)比層次模型的結(jié)構(gòu)更具有普遍性,它允許多個結(jié)點沒有雙親,也允許結(jié)點有多于一個的雙親。此外,網(wǎng)狀模型還允許兩個結(jié)點之間有多種聯(lián)系。因而,網(wǎng)狀模型可以更直接地去描述現(xiàn)實世界。
(2)網(wǎng)狀模型的數(shù)據(jù)表示方法
1)同層次模型一樣,網(wǎng)狀模型也使用記錄和記錄值表示實體集和實體;每個結(jié)點也表示一個記錄,每個記錄可包含若干個字段。
2)網(wǎng)狀模型中的聯(lián)系用結(jié)點間的有向線段表示。每個有向線段表示一個記錄間的一對多的聯(lián)系。網(wǎng)狀模型中的聯(lián)系簡稱為系。由于網(wǎng)狀模型中的系比較復(fù)雜,兩個記錄之間可以存在多種系。一個記錄允許有多個雙親記錄,所以網(wǎng)狀模型中的系必須命名。用系名標(biāo)識不同的系。例如,圖2-18a中R3有兩個雙親記錄R1和R2,因此把R1與R3之間的聯(lián)系命名為L1,R2與R3之間的聯(lián)系命名為L2。另外,網(wǎng)狀模型中允許有復(fù)合鏈,即兩個記錄間可以有兩種以上的聯(lián)系,如圖2-18b所示。
層次模型實際上是網(wǎng)狀模型的一個特例。
2.網(wǎng)狀模型的完整性約束條件
網(wǎng)狀模型記錄間的聯(lián)系比較復(fù)雜。一般來說,它沒有層次模型那樣嚴(yán)格的完整性約束條件,但具體的網(wǎng)狀數(shù)據(jù)庫系統(tǒng)對數(shù)據(jù)操縱都加了一些限制,提供了一定的完整性約束。例如,DBTG在模式DDL中,提供了定義DBTG數(shù)據(jù)庫完整性的若干個概念和語句,分別如下。
1)支持記錄碼的概念。碼即唯一標(biāo)識記錄的數(shù)據(jù)項的集合。
2)保證一個聯(lián)系中雙親記錄和子女記錄之間是一對多的聯(lián)系。
3)可以支持雙親記錄和子女記錄之間某些約束條件。例如,有些子女記錄要求雙親記錄存在時才能插入,雙親記錄刪除時也連同刪除。
3.網(wǎng)狀模型的存儲結(jié)構(gòu)
由于網(wǎng)狀模型記錄之間的聯(lián)系比較復(fù)雜,因而如何實現(xiàn)記錄之間聯(lián)系的問題是網(wǎng)狀模型存儲結(jié)構(gòu)中的關(guān)鍵。網(wǎng)狀模型常用的存儲方法是鏈接法,它包括單向鏈接、雙向鏈接、環(huán)狀鏈接和向首鏈接等。此外,網(wǎng)狀數(shù)據(jù)模型還用其他的存儲方法,如指引元陣列法、二進(jìn)制陣列法和索引法等。
4.網(wǎng)狀模型和層次模型比較
網(wǎng)狀模型和層次模型比較,雙方各有其自身的優(yōu)缺點。
(1)層次模型的主要優(yōu)缺點
層次模型的主要優(yōu)點有:數(shù)據(jù)模型本身比較簡單;系統(tǒng)性能優(yōu)于關(guān)系模型和網(wǎng)狀模型;能夠提供良好的完整性支持。
層次模型的主要缺點有:在表示非層次性的聯(lián)系時,只能通過冗余數(shù)據(jù)(易產(chǎn)生不一致性)或創(chuàng)建非自然的數(shù)據(jù)組織(引入虛擬結(jié)點)來解決;對插入和刪除操作的限制比較多;查詢子女結(jié)點必須通過雙親結(jié)點;由于結(jié)構(gòu)嚴(yán)密,層次命令趨于程序化。
(2)網(wǎng)狀模型的主要優(yōu)缺點
網(wǎng)狀模型的主要優(yōu)點有:能夠更直接地描述現(xiàn)實世界,一個結(jié)點可以有多個雙親,允許復(fù)合鏈,具有良好的性能,存取效率比較高。
網(wǎng)狀模型的缺點主要有:結(jié)構(gòu)比較復(fù)雜,而且隨著應(yīng)用環(huán)境的擴(kuò)大,數(shù)據(jù)庫的結(jié)構(gòu)就變得越來越復(fù)雜,不利于用戶掌握;DDL和DML語言復(fù)雜,用戶不容易使用;由于記錄之間的聯(lián)系是通過存取路徑實現(xiàn)的,應(yīng)用程序在訪問數(shù)據(jù)時必須選擇適當(dāng)?shù)拇嫒÷窂剑虼耍脩舯仨毩私庀到y(tǒng)結(jié)構(gòu)的細(xì)節(jié)后才能實現(xiàn)其數(shù)據(jù)存取,程序員要為訪問數(shù)據(jù)設(shè)置存取路徑,加重了編寫應(yīng)用程序的負(fù)擔(dān)。
2.2.4 關(guān)系模型
關(guān)系模型是3種模型中最重要的一種。關(guān)系數(shù)據(jù)庫系統(tǒng)采用關(guān)系模型作為數(shù)據(jù)的組織方式,現(xiàn)在流行的數(shù)據(jù)庫系統(tǒng)大都是關(guān)系數(shù)據(jù)庫系統(tǒng)。關(guān)系模型是由美國IBM公司San Jose研究室的研究員E.F.Codd于1970年首次提出的。自20世紀(jì)80年代以來,計算機廠商新推出的數(shù)據(jù)庫管理系統(tǒng)幾乎都是支持關(guān)系模型的,非關(guān)系模型的產(chǎn)品也大都加上了關(guān)系接口。
1.關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)
關(guān)系模型建立在嚴(yán)格的數(shù)學(xué)概念的基礎(chǔ)上。在關(guān)系模型中,數(shù)據(jù)的邏輯結(jié)構(gòu)是一張二維表,它由行和列組成。
(1)關(guān)系模型中的主要術(shù)語
1)關(guān)系:一個關(guān)系(Relation)對應(yīng)通常所說的一張二維表。表2-2就是一個關(guān)系。
表2-2 學(xué)生學(xué)籍表
2)元組:表中的一行稱為一個元組(Tuple),許多系統(tǒng)中把元組稱為記錄。
3)屬性:表中的一列稱為一個屬性(Attribute)。一個表中往往會有多個屬性,為了區(qū)分屬性,要給每一個列起一個屬性名。同一個表中的屬性應(yīng)具有不同的屬性名。
4)碼:表中的某個屬性或?qū)傩越M,它們的值可以唯一地確定一個元組,且屬性組中不含多余的屬性,這樣的屬性或?qū)傩越M稱為關(guān)系的碼(Key)。
例如,在表2-2中,學(xué)號可以唯一地確定一個學(xué)生,因而學(xué)號是學(xué)生學(xué)籍表的碼。
5)域:屬性的取值范圍稱為域(Domain)。例如,大學(xué)生年齡屬性的域是(16~35),性別的域是(男,女)。
6)分量:元組中的一個屬性值稱為分量(Element)。
7)關(guān)系模式:關(guān)系的型稱為關(guān)系模式(Relation Schema),關(guān)系模式是對關(guān)系的描述。關(guān)系模式一般的表示是:關(guān)系名(屬性1,屬性2,…,屬性n)。
例如,學(xué)生學(xué)籍表關(guān)系可描述為:學(xué)生學(xué)籍(學(xué)號,姓名,性別,年齡,所在系)。
(2)關(guān)系模型中的數(shù)據(jù)全部用關(guān)系表示
在關(guān)系模型中,實體集及實體間的聯(lián)系都是用關(guān)系來表示的。
例如,關(guān)系模型中,學(xué)生、課程、學(xué)生與課程之間的聯(lián)系可表示為:
關(guān)系模型要求關(guān)系必須是規(guī)范化的。所謂關(guān)系規(guī)范化是指關(guān)系模式要滿足一定的規(guī)范條件。關(guān)系的規(guī)范條件很多,但首要條件是關(guān)系的每一個分量必須是不可分的數(shù)據(jù)項。
2.關(guān)系操作和關(guān)系的完整性約束條件
關(guān)系操作主要包括數(shù)據(jù)查詢、插入、刪除和修改。關(guān)系中的數(shù)據(jù)操作是集合操作,無論操作的原始數(shù)據(jù)、中間數(shù)據(jù)或結(jié)果數(shù)據(jù)都是若干元組的集合,而不是單記錄的操作方式。此外,關(guān)系操作語言都是高度非過程的語言,用戶在操作時,只要指出“干什么”或“找什么”,而不必詳細(xì)說明“怎么干”或“怎么找”。由于關(guān)系模型把存取路徑向用戶隱蔽起來,使得數(shù)據(jù)的獨立性大大地提高了;由于關(guān)系語言的高度非過程化,使得用戶對關(guān)系的操作變得容易,提高了系統(tǒng)的效率。
關(guān)系的完整性約束條件包括實體完整性、參照完整性和用戶定義的完整性。
3.關(guān)系模型的存儲結(jié)構(gòu)
在關(guān)系數(shù)據(jù)庫的物理組織中,關(guān)系以文件形式存儲。一些小型的關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)采用直接利用操作系統(tǒng)文件的方式實現(xiàn)關(guān)系存儲,一個關(guān)系對應(yīng)一個數(shù)據(jù)文件。為了提高系統(tǒng)性能,許多關(guān)系數(shù)據(jù)庫管理系統(tǒng)采用自己設(shè)計的文件結(jié)構(gòu)、文件格式和數(shù)據(jù)存取機制進(jìn)行關(guān)系存儲,以保證數(shù)據(jù)的物理獨立性和邏輯獨立性,更有效地保證數(shù)據(jù)的安全性和完整性。
4.關(guān)系模型與非關(guān)系模型比較
與非關(guān)系模型相比,關(guān)系模型具有下列特點。
(1)關(guān)系模型建立在嚴(yán)格的數(shù)學(xué)基礎(chǔ)之上
關(guān)系及其系統(tǒng)的設(shè)計和優(yōu)化有數(shù)學(xué)理論指導(dǎo),因而容易實現(xiàn)且性能好。
(2)關(guān)系模型的概念單一,容易理解
關(guān)系數(shù)據(jù)庫中,無論實體還是聯(lián)系,無論是操作的原始數(shù)據(jù)、中間數(shù)據(jù)還是結(jié)果數(shù)據(jù),都用關(guān)系表示。這種概念單一的數(shù)據(jù)結(jié)構(gòu),使數(shù)據(jù)操作方法統(tǒng)一,也使用戶易懂易用。
(3)關(guān)系模型的存取路徑對用戶隱蔽
用戶根據(jù)數(shù)據(jù)的邏輯模式和子模式進(jìn)行數(shù)據(jù)操作,而不必關(guān)心數(shù)據(jù)的物理模式情況,無論計算機專業(yè)人員還是非計算機專業(yè)人員使用起來都很方便,數(shù)據(jù)的獨立性和安全保密性都較好。
(4)關(guān)系模型中的數(shù)據(jù)聯(lián)系是靠數(shù)據(jù)冗余實現(xiàn)的
關(guān)系數(shù)據(jù)庫中不可能完全消除數(shù)據(jù)冗余。由于數(shù)據(jù)冗余,使得關(guān)系的空間效率和時間效率都較低。
基于關(guān)系模型的優(yōu)點,關(guān)系數(shù)據(jù)模型自誕生以后發(fā)展迅速,深受用戶的喜愛;而計算機硬件的飛速發(fā)展,更大容量、更高速度的計算機會對關(guān)系模型的缺點給予一定的補償。因而,關(guān)系數(shù)據(jù)庫始終保持其主流數(shù)據(jù)庫的地位。
2.2.5 面向?qū)ο髷?shù)據(jù)模型
面向?qū)ο髷?shù)據(jù)庫系統(tǒng)支持面向?qū)ο髷?shù)據(jù)模型(簡稱OO模型)。一個面向?qū)ο蟮臄?shù)據(jù)庫系統(tǒng)是一個持久的、可共享的對象庫的存儲和管理者;而一個對象庫是由一個面向?qū)ο髷?shù)據(jù)模型所定義的對象集合體。
1.面向?qū)ο髷?shù)據(jù)模型的基本概念
一個面向?qū)ο髷?shù)據(jù)模型是用面向?qū)ο笥^點來描述現(xiàn)實世界實體(對象)的邏輯組織、對象間限制、聯(lián)系的模型。一系列面向?qū)ο蠛诵母拍顦?gòu)成了面向?qū)ο髷?shù)據(jù)模型的基礎(chǔ)。面向?qū)ο髷?shù)據(jù)模型的核心概念如下。
(1)對象與對象標(biāo)識
現(xiàn)實世界的任一實體都被統(tǒng)一地模型化為一個對象(Object),每一個對象有一個唯一的標(biāo)識,稱為對象標(biāo)識OID(Object Identifier)。對象是現(xiàn)實世界中實體的模型化,它與記錄、元組相似,但遠(yuǎn)比它們復(fù)雜。
(2)封裝
每一個對象是其狀態(tài)與行為的封裝(Encapsulation),其中狀態(tài)是該對象一系列屬性值的集合,而行為是在對象狀態(tài)上操作方法的集合。
(3)類
共享同一屬性結(jié)合和方法集合的所有對象組合在一起構(gòu)成了一個對象類(Class,簡稱類),一個對象是某一類的一個實例(instance)。例如,學(xué)生是一個類,具體某一個學(xué)生,如王英是學(xué)生類中的一個對象。在數(shù)據(jù)庫系統(tǒng)中有“型”和“值”的概念,而在OODB中,“型”就是類,對象是某一類的“值”。類屬性的定義域可以為基本類,如字符串、整數(shù)和布爾型,也可以為一般類,即包含屬性和方法的類。一個類的屬性也可以定義為這個類自身。
(4)類層次
一個系統(tǒng)中所有類組成的一個有根的有向無環(huán)圖稱為類層次(Class hierarchy)。如同面向?qū)ο蟪绦蛟O(shè)計一樣,在面向?qū)ο髷?shù)據(jù)模型中,可以定義一個類(如C1)的子類(C2),類C1稱為類C2的父類(或超類)。子類還可以再定義子類,例如,C2可以再定義子類C3。這樣面向?qū)ο髷?shù)據(jù)模式的一組類就形成一個有限的層次結(jié)構(gòu),這就是類層次。一個類可以有多個超類,有的是直接的,有的是間接的。例如,C2是C3的直接超類,C1是C3的間接超類。一個類可以繼承它的所有超類(包括直接超類和間接超類)的屬性和方法。
(5)消息
在面向?qū)ο髷?shù)據(jù)庫中,對象是封裝的。對象之間的通信是通過消息(Message)傳遞來實現(xiàn)的。即消息從外部傳遞給對象,存取和調(diào)用對象中的屬性和方法,在內(nèi)部執(zhí)行要求的操作,操作的結(jié)果仍以消息的形式返回。
2.對象結(jié)構(gòu)與對象標(biāo)識
(1)對象結(jié)構(gòu)
對象是由一組數(shù)據(jù)結(jié)構(gòu)和在這組數(shù)據(jù)結(jié)構(gòu)上的操作程序代碼封裝起來的基本單位。對象之間的界面由一組消息構(gòu)成。一個對象通常包括以下幾個部分。
1)屬性集合。
所有屬性構(gòu)成了對象數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。屬性描述對象的狀態(tài)、組成和特性。對象的某一屬性可以是單值或多值的,也可以是一個對象。如果對象的某一屬性還是對象,對象就形成了嵌套,這種嵌套可以繼續(xù),從而組成各種復(fù)雜對象。
2)方法集合。
方法用于描述對象的行為特性。方法的定義包括方法的接口和方法的實現(xiàn)兩部分:方法的接口用以說明方法的名稱、參數(shù)和結(jié)果返回值的類型,也稱之為調(diào)用說明;方法的實現(xiàn)是一段程序代碼,用以實現(xiàn)方法的功能,即對象操作的算法。
3)消息集合。
消息是對象向外提供的界面,消息由對象接收并響應(yīng)。消息是指對象之間操作請求的傳遞,它并不管對象內(nèi)部是如何處理的。
(2)對象標(biāo)識
面向?qū)ο髷?shù)據(jù)庫中的每個對象都有一個唯一的、不變的標(biāo)識,即對象標(biāo)識(OID)。對象通常與實際領(lǐng)域的實體對應(yīng),在現(xiàn)實世界中,實體中的屬性值可能隨著時間的推移會發(fā)生改變,但是每個實體的標(biāo)識始終保持不變。相應(yīng)的,對象的部分(或全部)屬性、對象的方法會隨著時間的推移發(fā)生變化,但對象標(biāo)識不會改變。兩個對象即使屬性值和方法都完全相同,但如果它們的對象標(biāo)識不同,則認(rèn)為兩個對象不同,只是它們的值相同而已。對象標(biāo)識的概念比程序設(shè)計語言或傳統(tǒng)數(shù)據(jù)模型中所用到的標(biāo)識概念更強。
下面是常用的幾種對象標(biāo)識。
1)值標(biāo)識。
值標(biāo)識是用值來表示的。關(guān)系數(shù)據(jù)庫中使用的就是值標(biāo)識,在關(guān)系數(shù)據(jù)庫中,碼值是一個關(guān)系的元組唯一標(biāo)識。例如,學(xué)號“980001”唯一標(biāo)識了計算機系的學(xué)生張三。
2)名標(biāo)識。
名標(biāo)識是用一個名字來表示標(biāo)識。例如,程序變量使用的就是名標(biāo)識,程序中的每個變量被賦予一個名字,變量名唯一地標(biāo)識每個變量。
3)內(nèi)標(biāo)識。
上面兩種標(biāo)識是由用戶建立的,內(nèi)標(biāo)識是建立在數(shù)據(jù)模型或程序設(shè)計語言中,不要求用戶給出標(biāo)識。面向?qū)ο髷?shù)據(jù)庫系統(tǒng)使用的就是內(nèi)標(biāo)識。
不同標(biāo)識其持久性程度是不同的。若標(biāo)識只能在程序或查詢的執(zhí)行期間保持不變,則稱該標(biāo)識具有程序內(nèi)持久性。例如,程序設(shè)計語言中的變量名和SQL語句的元組標(biāo)識符,就是具有程序內(nèi)持久性的標(biāo)識。若標(biāo)識在從一個程序的執(zhí)行到另一個程序的執(zhí)行期間能保持不變,則稱該標(biāo)識具有程序間持久性。例如,在SQL語言中的關(guān)系名是具有程序間持久性的標(biāo)識。若表示不僅在程序執(zhí)行過程中而且在數(shù)據(jù)的重組重構(gòu)過程中一直保持不變,則稱該標(biāo)識具有永久持久性。例如,面向?qū)ο髷?shù)據(jù)庫系統(tǒng)中對象標(biāo)識具有永久持久性,而SQL語言中的關(guān)系名不具有永久持久性,因為數(shù)據(jù)的重構(gòu)可能修改關(guān)系名。
對象表示具有永久持久性的含義是,一個對象一經(jīng)產(chǎn)生,系統(tǒng)就給它賦予一個在全系統(tǒng)中唯一的對象標(biāo)識符,直到它被刪除。對象標(biāo)識是由系統(tǒng)統(tǒng)一分配的,用戶不能對對象標(biāo)識符進(jìn)行修改。對象標(biāo)識是穩(wěn)定的,它不會因為對象中某個值的修改而改變。
面向?qū)ο蟮臄?shù)據(jù)庫系統(tǒng)在邏輯上和物理上從面向記錄(或元組)上升為面向?qū)ο蟆⒚嫦蚩删哂袕?fù)雜結(jié)構(gòu)的一個邏輯整體。它允許用自然的方法并結(jié)合數(shù)據(jù)抽象機制在結(jié)構(gòu)和行為上對復(fù)雜對象建立模型,從而大幅度提高管理效率,降低用戶使用復(fù)雜度,并為版本管理、動態(tài)模式修改等功能的實現(xiàn)創(chuàng)造了條件。
3.封裝
封裝是面向?qū)ο髷?shù)據(jù)模型的一個非常關(guān)鍵的概念。每一個對象是其狀態(tài)與行為的封裝。對象的通信只能通過消息,這是OO模型的主要特征之一。
(1)封裝可以提高數(shù)據(jù)的獨立性
由于對象的實現(xiàn)與對象應(yīng)用相互隔離,這樣當(dāng)對操作的實現(xiàn)算法和數(shù)據(jù)結(jié)構(gòu)進(jìn)行修改時就不會影響接口,因而也就不必修改使用它們的應(yīng)用。由于封裝,對用戶而言對象的實現(xiàn)是不可見的,這就隱蔽了在實現(xiàn)中使用的數(shù)據(jù)結(jié)構(gòu)與程序代碼等細(xì)節(jié)。
(2)封裝可以提高應(yīng)用程序的可靠性
由于對象封裝后成為一個自含的單元,對象只接受已定義好的操作,其他程序不能直接訪問對象中的屬性,從而提高了程序的可靠性。
(3)封裝會影響到數(shù)據(jù)查詢功能
對象封裝后也帶來了另一個問題,即如果用戶要查詢某個對象的屬性值,就必須通過調(diào)用方法,而不能像關(guān)系數(shù)據(jù)庫系統(tǒng)那樣進(jìn)行即席的(隨機的)、按內(nèi)容的查詢,這就不夠方便靈活,失去了關(guān)系數(shù)據(jù)庫的重要優(yōu)點,因此在面向?qū)ο髷?shù)據(jù)庫中必須在對象封裝方面做必要的修改或妥協(xié)。
4.類的概念
在面向?qū)ο髷?shù)據(jù)庫中,相似對象的集合稱為類。類的一個實例稱為一個對象。一個類所有對象的定義是相同的,不同對象的區(qū)別在于屬性的取值不同。類和關(guān)系模式非常相似,類的屬性類似關(guān)系模式的屬性,對象類似元組。實際上,類本身也可以看作是一個對象,稱為類對象(Class Object)。面向?qū)ο髷?shù)據(jù)模式是類的集合。
面向?qū)ο髷?shù)據(jù)模式中存在著多種相似但有所不同的類。例如,構(gòu)造一個有關(guān)學(xué)校應(yīng)用的面向?qū)ο髷?shù)據(jù)庫,教工和學(xué)生是其中的兩個類。這兩個類有一些屬性是相同的,如兩者都有身份證號、姓名、年齡、性別和住址等屬性,也有一些相同的方法。當(dāng)然,兩者也有自己特殊的屬性,如學(xué)生有學(xué)號、專業(yè)和年級等屬性,而教工有工齡、工資、單位和電話號碼等屬性,有自己獨特的方法。用戶希望統(tǒng)一定義教員和學(xué)生的公共屬性、方法和消息部分,分別定義各自的特殊屬性、方法和消息部分。面向?qū)ο蟮臄?shù)據(jù)模型提供的類層次結(jié)構(gòu)可以實現(xiàn)上述要求。
5.類的層次結(jié)構(gòu)
在面向?qū)ο髷?shù)據(jù)模式中,一組類可形成一個類層次。一個面向?qū)ο髷?shù)據(jù)模式可能有多個層次。在一個類層次中,一個類繼承它的所有超類的全部屬性、方法和消息。
例如,教工和學(xué)生可以分別定義成教工類和學(xué)生類,而教工類和學(xué)生類又都屬于人這個類;教工又可定義教師、行政人員兩個子類,學(xué)生類又可以定義本科生和研究生兩個子類。圖2-19表示了學(xué)校數(shù)據(jù)庫的類層次關(guān)系。
需要指出的是,一個類可以從一個或多個已有的類中導(dǎo)出。
圖2-19 學(xué)校數(shù)據(jù)庫的類層次結(jié)構(gòu)圖
6.類的繼承性
繼承(Inherit)是面向?qū)ο髷?shù)據(jù)庫的重要特征。如果一個子類只能繼承一個超類的特性(包括屬性、方法和消息),這種繼承稱為單繼承;如果一個子類能繼承多個超類的特性,這種繼承稱為多重繼承。單繼承是因為子類是從一個類導(dǎo)出的,它只能繼承這個類的特性;而多重繼承是因為一個子類是從多個類導(dǎo)出的,它可以繼承這多個類的所有特性。例如,本科生是從學(xué)生這個類導(dǎo)出的,因而它只繼承了學(xué)生的所有特性,是單繼承。在學(xué)校中還有在職研究生,他們既是教工又是學(xué)生,所以在職研究生既繼承了教工的特性又繼承了學(xué)生的特性,它具有多重繼承性。
繼承性有以下兩個優(yōu)點。
1)繼承性是建模的有力工具,提供了對現(xiàn)實世界簡明而精確的描述。
2)繼承性提供了信息重用機制。
由于子類可以繼承超類的特性,因此可以避免許多重復(fù)定義。當(dāng)然子類還可以定義自己的屬性、方法和消息。子類對父類既有繼承又有發(fā)展,繼承的部分就是重用的部分。
7.滯后聯(lián)編
子類可以定義自己特殊的屬性、方法和消息,但是當(dāng)子類定義的方法與父類中的方法相同時,即發(fā)生同名沖突時,應(yīng)用程序中的同名操作該執(zhí)行哪種操作呢?究竟是執(zhí)行父類中的操作還是子類中的操作呢?面向?qū)ο蟮臄?shù)據(jù)庫管理系統(tǒng)采用滯后聯(lián)編(Late Binding)技術(shù)來解決這種沖突。具體方法為:系統(tǒng)不是在編譯時就把操作名聯(lián)編到程序上,而是在運行時根據(jù)實際請求中的對象類型和操作來選擇相應(yīng)的程序,把操作名與它聯(lián)編上(即把操作名轉(zhuǎn)換成該程序的地址)。
假設(shè)在前面的學(xué)校數(shù)據(jù)庫系統(tǒng)中,在學(xué)生類中定義了一個操作“打印”,主要功能是打印學(xué)生的基本信息。而在研究生子類中,也定義了一個操作“打印”,這個操作不但打印學(xué)生的基本信息,還需要打印研究成果等研究生特有的信息。這樣,在父類(學(xué)生)和子類(研究生)中都有一個“打印”操作,但是實際上這兩個操作是不同的。在面向?qū)ο蟮臄?shù)據(jù)庫管理系統(tǒng)中,采用滯后聯(lián)編的方法來解決操作名相同而內(nèi)容不同的問題,即在編譯時并不把“打印”操作聯(lián)編到應(yīng)用程序上,而是在應(yīng)用程序執(zhí)行時根據(jù)實際的對象類型和操作選擇相應(yīng)的程序。如果對象是學(xué)生就選擇學(xué)生類的打印方法類執(zhí)行,如果對象是研究生就選擇研究生類的打印方法來執(zhí)行。
8.對象的嵌套
在面向?qū)ο髷?shù)據(jù)模式中,對象的屬性不但可以是單值的或值的集合,還可以是一個對象。由于對象的屬性也是一個對象,這樣就形成了一種嵌套的層次結(jié)構(gòu)。
圖2-20所示的是一個對象嵌套實例。圖中,工作單位的個人檔案包括姓名、性別、出生日期、籍貫、政治面貌和主要社會關(guān)系等屬性。這些屬性中,姓名和籍貫的數(shù)據(jù)類型是字符串;性別的數(shù)據(jù)類型是邏輯型的;出生日期是日期型的;而社會關(guān)系則是一個對象,包括父親、母親和配偶等屬性;而父親、母親和配偶等屬性又是對象,它們的屬性又包括姓名、年齡、工作單位和政治面貌等。
圖2-20 個人檔案的嵌套層次圖
對象嵌套形成的層次結(jié)構(gòu)和類層次結(jié)構(gòu)形成了橫向和縱向的復(fù)雜結(jié)構(gòu)。不僅各種類之間具有層次結(jié)構(gòu),而且一個類內(nèi)部也具有嵌套層次結(jié)構(gòu),這種結(jié)構(gòu)不同于關(guān)系模式的平面結(jié)構(gòu),而是更能準(zhǔn)確地反映現(xiàn)實世界的各種事物。
2.2.6 對象關(guān)系數(shù)據(jù)模型
對象關(guān)系數(shù)據(jù)模型是關(guān)系模型的擴(kuò)展,是面向?qū)ο髷?shù)據(jù)模型與關(guān)系模型結(jié)合的產(chǎn)物。對象關(guān)系數(shù)據(jù)模型是一種新型的數(shù)據(jù)模型,目前許多數(shù)據(jù)庫管理系統(tǒng)都支持它。
1.對象關(guān)系數(shù)據(jù)模型的概念
對象關(guān)系數(shù)據(jù)模型使用二維表表示數(shù)據(jù),它包括關(guān)系表和對象表兩種。關(guān)系表屬于關(guān)系模型,關(guān)系的屬性對應(yīng)于表的列,關(guān)系的元組對應(yīng)于表的行,關(guān)系模型不支持方法。對象表屬于面向?qū)ο髷?shù)據(jù)模型,支持面向?qū)ο蟮幕竟δ埽瑢ο蟮念惓橄髮?yīng)二維表,類的實例(對象)對應(yīng)于表中的行,類的屬性對應(yīng)于表的列,通過對象可調(diào)用方法。
對象表不再強調(diào)表結(jié)構(gòu)一定要滿足關(guān)系范式,取消了許多應(yīng)用限制,擴(kuò)展了關(guān)系模型的數(shù)據(jù)類型,增加了用戶自定義的數(shù)據(jù)類型,更加靈活方便。
2.對象表的數(shù)據(jù)類型和表結(jié)構(gòu)特點
對象表通過用戶自定義數(shù)據(jù)類型,支持?jǐn)?shù)據(jù)使用記錄類型(對象類型)、數(shù)組類型和嵌入表類型,其表結(jié)構(gòu)和設(shè)計方法與關(guān)系表有較大的變化。
(1)對象表的屬性支持復(fù)合數(shù)據(jù)類型
關(guān)系表強調(diào)屬性數(shù)據(jù)只能是不可分割的簡單數(shù)據(jù)項,復(fù)合數(shù)據(jù)是不允許出現(xiàn)的。對象表的數(shù)據(jù)可以是基本項,也可以是組合數(shù)據(jù)項。
例如,要表示學(xué)生信息,屬性有“姓名”“學(xué)號”“年齡”“班級”和“家庭住址”,還有“隸屬關(guān)系、姓名、單位、聯(lián)系電話”等家庭情況信息。用關(guān)系表示學(xué)生信息時,需要將家庭信息拆成一個個單一的基本項,與其他屬性并列表示;如果改用對象表存儲學(xué)生信息,可以將家庭信息定義成一個記錄類型(對象類型),保持了原有屬性的內(nèi)在關(guān)系。
表2-3中,分別列出了使用對象表和關(guān)系表表示學(xué)生信息時的表結(jié)構(gòu),很容易看出含記錄類型的對象表的結(jié)構(gòu)特點。
表2-3 使用對象表和關(guān)系表表示學(xué)生信息時的表結(jié)構(gòu) 學(xué)生信息的關(guān)系表結(jié)構(gòu)
學(xué)生信息的對象表結(jié)構(gòu)
(2)對象表的屬性支持可變長數(shù)組類型
關(guān)系表的屬性不支持?jǐn)?shù)組類型,更不支持可變長的數(shù)組類型。在數(shù)據(jù)庫設(shè)計時,對于一些數(shù)據(jù)個數(shù)不確定的信息,關(guān)系表只能使用獨立新建表的方法來解決,這不僅破壞了數(shù)據(jù)的整體性,還增加了數(shù)據(jù)查詢和處理的難度。由于對象表增加了數(shù)組類型,用戶可以使用可變長的數(shù)組類型保存記錄中數(shù)據(jù)個數(shù)不一樣的屬性數(shù)據(jù),用更自然、更符合客觀情況的方式存儲數(shù)據(jù),易于理解、處理和應(yīng)用。
例如,要存儲學(xué)生-選課信息,包括“學(xué)號”“姓名”“班級”“年齡”“選課名”及“成績”項,由于每個學(xué)生實際選課的門數(shù)不一樣,不能用固定的空間表示。使用關(guān)系表存儲學(xué)生-選課信息時,數(shù)據(jù)庫中需要學(xué)生表和選課表兩個二維表,它們之間需要通過外碼連接。如果改用對象表存儲學(xué)生-選課信息,可以使用二維變長數(shù)組類型表示“選課名”及“成績”,一個二維表就能滿足使用要求。
表2-4中,列出了學(xué)生-選課信息使用變長數(shù)組類型的對象表結(jié)構(gòu),同時也列出了關(guān)系表的結(jié)構(gòu),供大家對照分析。
表2-4 學(xué)生-選課的對象表與關(guān)系表結(jié)構(gòu) 學(xué)生-選課的關(guān)系表
學(xué)生-選課的對象表
(3)對象表的屬性支持嵌入表數(shù)據(jù)類型
對象表中的屬性,不僅可以是復(fù)合數(shù)據(jù)、數(shù)組數(shù)據(jù)等帶結(jié)構(gòu)的數(shù)據(jù),還可以是嵌套表,信息結(jié)構(gòu)更復(fù)雜、更豐富。嵌套表有行和列,表的長短與具體元組有關(guān)。例如,學(xué)生-選課表中的選課數(shù)據(jù)也可以采用嵌套表數(shù)據(jù)類型表示,如圖2-21所示。
圖2-21 學(xué)生-選課的對象表中有嵌入表的圖例
- Ansible Configuration Management
- Project 2007項目管理實用詳解
- 物聯(lián)網(wǎng)與云計算
- AWS Administration Cookbook
- 可編程序控制器應(yīng)用實訓(xùn)(三菱機型)
- 大學(xué)C/C++語言程序設(shè)計基礎(chǔ)
- HTML5 Canvas Cookbook
- 基于企業(yè)網(wǎng)站的顧客感知服務(wù)質(zhì)量評價理論模型與實證研究
- Dreamweaver CS6中文版多功能教材
- 自動化生產(chǎn)線安裝與調(diào)試(三菱FX系列)(第二版)
- Learning ServiceNow
- 3ds Max造型表現(xiàn)藝術(shù)
- 人工智能:智能人機交互
- 計算機應(yīng)用基礎(chǔ)實訓(xùn)(職業(yè)模塊)
- 工業(yè)機器人集成應(yīng)用