官术网_书友最值得收藏!

2.2 常見的數據模型

數據庫系統中最常使用的數據模型是層次模型、網狀模型和關系模型,新興的數據模型是面向對象數據模型和對象關系數據模型。本節較詳細地介紹常用的3種數據模型的結構特點和完整性約束條件,分析對照它們的性能,指出其優缺點和使用場合。另外本節也介紹新興數據模型的概念和方法。

2.2.1 數據模型概述

數據模型具有數據結構、數據操作和完整性約束條件三要素。認識或描述一種數據模型也要從它的三要素開始。

1.數據模型的三要素

數據模型是一組嚴格定義的概念集合。這些概念精確地描述了系統的數據結構、數據操作和數據完整性約束條件。下面就介紹這些概念。

(1)數據結構

數據結構是所研究的對象類型(Object Type)的集合。這些對象是數據庫的組成成分,它們包括兩類:一類是與數據類型、內容、性質有關的對象,例如層次模型或網狀模型中的數據項和記錄,關系模型中的關系和屬性等;另一類是與數據之間聯系有關的對象,例如,在網狀模型中由于記錄型之間的復雜聯系,為了區分記錄型之間不同的聯系,對聯系進行命名,命名的聯系稱為系型(Set Type)。

在數據庫系統中,通常按照數據結構的類型來命名數據模型,例如層次結構、網狀結構和關系結構的數據模型分別被命名為層次模型、網狀模型和關系模型。

(2)數據操作

數據操作是指對數據庫中各種數據對象允許執行的操作集合。數據操作包括操作對象和有關的操作規則兩部分。數據庫中的數據操作主要有數據檢索和數據更新(即插入、刪除或修改數據的操作)兩大類操作。

數據模型必須對數據庫中的全部數據操作進行定義,指明每項數據操作的確切含義、操作對象、操作符號、操作規則以及對操作的語言約束等。數據操作是對系統動態特性的描述。

(3)數據約束條件

數據約束條件是一組數據完整性規則的集合。數據完整性規則是指數據模型中的數據及其聯系所具有的制約和依存規則。數據約束條件用以限定符合數據模型的數據庫狀態以及狀態的變化,以保證數據庫中數據的正確、有效和相容。

每種數據模型都規定有基本的完整性約束條件,這些完整性約束條件要求所屬的數據模型都應滿足。同理,每個數據模型還規定了特殊的完整性約束條件,以滿足具體應用的要求。例如,在關系模型中,基本的完整性約束條件是實體完整性和參照完整性,特殊的完整性條件是用戶定義的完整性。

2.常見的數據模型

當前,數據庫領域最常用的數據模型主要有3種,它們是層次模型(Hierarchical Model)、網狀模型(Network Model)和關系模型(Relational Model)。

層次模型和網狀模型統稱非關系模型。非關系模型的數據庫系統在20世紀70年代至80年代初非常流行,在當時的數據庫產品中占據了主導地位。關系模型的數據庫系統在20世紀70年代開始出現,之后發展迅速,并逐步取代了非關系模型數據庫系統的統治地位。現在流行的數據庫系統大都是基于關系模型的。

在非關系模型中,實體集用記錄表示,實體的屬性對應記錄的數據項(或字段)。實體集之間的聯系轉換成記錄之間的兩兩聯系。非關系模型中數據結構的單位是基本層次聯系。所謂基本層次是指兩個記錄及它們之間的一對多(包括一對一)的聯系,其結構和表示方法如圖2-7所示。

圖2-7 基本層次聯系

圖2-7中:Ri位于聯系Lij的始結點,稱為雙親結點(Parent);Rj位于聯系Lij的終結點,稱為子女結點(Child)。

2.2.2 層次數據模型

層次模型是數據庫系統中最早出現的數據模型,層次數據庫系統采用層次模型作為數據的組織方式。層次數據庫系統的典型代表是IBM公司的IMS(Information Management System)數據庫管理系統。層次模型用樹型結構來表示各類實體以及實體間的聯系。

1.層次模型的數據結構

(1)層次模型的定義

在數據結構中,定義滿足下面兩個條件的基本層次聯系的集合為層次模型。

1)有且僅有一個結點沒有雙親結點,這個結點稱為根結點。

2)除根結點之外的其他結點有且只有一個雙親結點。

(2)層次模型的數據表示方法

層次模型中的數據用下列方法表示。

在層次模型中:實體集使用記錄表示;記錄型包含若干個字段,字段用于描述實體的屬性;記錄值表示實體;記錄之間的聯系使用基本層次聯系表示。層次模型中的每個記錄可以定義一個排序字段,排序字段也稱為碼字段,其主要作用是確定記錄的順序。如果排序字段的值是唯一的,則它能唯一地標識一個記錄值。

在層次模型中,使用結點表示記錄。記錄之間的聯系用結點之間的連線表示,這種聯系是父子之間的一對多的實體聯系。層次模型中的同一雙親的子女結點稱為兄弟結點(Twin或Sibling),沒有子女結點的結點稱為葉結點。圖2-8給出了一個層次模型的例子。圖2-8中,R1為根結點,R2和R3都是R1的子女結點,R2和R3為兄弟結點;R4和R5是R3的子女結點,R4和R5也為兄弟結點;R2、R4和R5為葉結點。

圖2-8 層次模型的一個示例

(3)層次模型的特點

層次模型像一棵倒立的樹,只有一個根結點,有若干個葉結點,結點的雙親是唯一的。圖2-9是一個教學院系的數據結構,該層次數據結構中有4個記錄。

圖2-9 教學院系的數據模型

如圖2-9所示:院系記錄是根結點,它有院系編號、院系名稱和辦公地點3個數據項,其兩個子女結點是教研室和學生記錄;教研室記錄是院系的子女結點,它還是教師的雙親結點,教研室記錄由教研室編號、教研室名兩個數據項組成;學生記錄由學號、姓名、年齡3個數據項組成;教師記錄由職工號、姓名和專業方向3個數據項組成。學生與教師是葉結點,它們沒有子女結點。在該層次數據結構中,院系與教研室、教研室與教師、院系與學生的聯系均是一對多的聯系。圖2-10是教學院系數據庫的一個實例。

圖2-10 教學院系數據庫的一個實例

圖中表示:根記錄值為“D10,計算機系,9號樓”,它與教研室的“C01,硬件教研室”和“C02,軟件教研室”有聯系,同時,也與學生的“00001,王平,20”和“00002,李麗,20”有聯系。這4個位于子女結點的記錄值是它對應的上層結點記錄值的屬記錄值,而它們對應的上層記錄值是首記錄值。圖2-10中還表示,硬件教研室有屬記錄值“92001,王海,電器”和“92002,張錚,自動化”,軟件教研室有“92003,許明,數據庫”和“92004,陳真,人工智能”。層次結構數據的一個實例由一個根記錄值和它的全部屬記錄值組成,全部屬記錄值包括屬記錄、屬記錄的屬記錄、…、直到位于葉結點的屬記錄為止。

層次模型具有一個基本特點:對于任何一個給定的記錄值,只有按其路徑查看,才能顯示出它的全部意義,沒有一個子女記錄值能夠脫離雙親記錄值而獨立存在。例如對于圖2-10中的學生記錄值(00001,王平,20),如果不指出它的雙親結點,就不知道它是哪個院系的學生。

雖然理論上認為一個層次模型可以包含任意多的記錄和字段數據,但任何實際的數據庫系統都會因為存儲容量或者實現復雜度的原因,對層次模型中包含的記錄個數和字段個數進行限制。

2.層次模型中多對多聯系的表示

前面提到,層次模型只能表示一對多(包括一對一)的聯系,不能直接地表示多對多的聯系。當有多對多聯系需要在層次模型中表示時,應采用分解的方法,即將多對多的聯系分解成一對多的聯系,使用多個一對多聯系來表示一個多對多聯系。分解方法主要有兩種:冗余結點法和虛擬結點法。

圖2-11是一個含有多對多聯系的E-R圖。圖中有學生和課程兩個實體集,它們的聯系為多對多類型,即一個學生可以選修多門課程,一門課程可由多個學生選修。下面用這個例子說明多對多聯系的分解方法。

圖2-11 一個多對多聯系的例子

(1)冗余結點分解法

冗余結點分解法通過增加冗余結點的方法將多對多的聯系轉換成一對多的聯系。對于圖2-11所示的多對多聯系的實例,要設計兩組學生和課程記錄:一組表示一個學生選擇多門課程的學生與課程之間的1:n聯系;另一組表示一門課程有多個學生選擇的課程與學生之間的1:n聯系,其基本層次聯系如圖2-12所示。顯然,使用冗余結點分解法會使數據庫中有冗余的學生和課程記錄。

圖2-12 用冗余結點法表示多對多聯系

(2)虛擬結點分解法

所謂虛擬結點,就是一個指引元,該指引元指向所代替的結點。虛擬結點分解法通過使用虛擬結點,將實體集間的多對多聯系分解為多個層次模型,然后用多個層次模型表示一對多聯系。將圖2-12中的冗余結點轉換為虛擬結點,可得到具有虛擬結點的基本層次聯系,如圖2-13所示。

圖2-13 用虛擬結點法表示多對多聯系

上面兩種方法各有所長。冗余結點法的優點是結構清晰,允許結點改變存儲位置;缺點是占用存儲空間大,有潛在的不一致性。虛擬結點法的優點是占用存儲空間小,能夠避免潛在的不一致性問題;缺點是結點改變存儲位置時可能引起虛擬結點指針的改變。

3.層次模型的數據操作和完整性約束條件

層次模型的數據操作主要是數據的查詢、插入、刪除和修改。層次模型必須滿足的完整性約束條件如下。

1)在進行插入記錄值操作時,如果沒有指明相應的雙親記錄值(首記錄值),則不能插入子女記錄值(屬記錄值)。

例如在圖2-9的層次數據庫中,若轉學來一個學生,但還沒有為該學生指明院系,則不能將該學生記錄插入到數據庫中。

2)進行刪除記錄操作時,如果刪除雙親記錄值(首記錄值),則相應的子女結點值(屬記錄值)也同時被刪除。

例如在圖2-9的層次數據庫中,若刪除軟件教研室,則該教研室的教師數據將全部丟失;若刪除計算機系,則計算機系所有的學生和教研室將全部被刪除,相應的所有教師也將被全部刪除。

3)進行修改記錄操作時,應修改所有相應記錄,以保證數據的一致性。

例如,在圖2-12的層次模型中,若修改一個學生的年齡,則兩處學生記錄值的年齡字段都要執行修改操作。同樣,要增加一個學生記錄值時,也要同時對兩處的學生記錄執行插入操作,結果不僅造成操作麻煩,還特別容易引起數據不一致問題。

4.層次模型的存儲結構

在層次數據庫中,不但要存儲數據,而且還要存儲數據之間的層次聯系。層次模型數據的存儲一般使用鄰接存儲法和鏈接存儲法實現。

(1)鄰接存儲法

鄰接存儲法是按照層次樹前序遍歷的順序,把所有記錄值依次鄰接存放,即通過物理空間的位置相鄰來安排(或隱含)層次順序,實現存儲。

例如對于圖2-14a的數據模型,它的一個實例如圖2-14b所示。

圖2-14 層次數據庫及其實例

圖2-15為圖2-14實例按鄰接法存放的存儲結構圖。

圖2-15 鄰接法存儲結構的實例

(2)鏈接存儲法

鏈接存儲法是用指引元來反映數據之間的層次聯系,它主要有子女-兄弟鏈接法和層次序列鏈接法兩種方法。

1)子女-兄弟鏈接法。子女-兄弟鏈接法要求每個記錄設兩個指引元,一個指引元指向它的最左邊的子女記錄值(屬記錄值),另一個指引元指向它的最近兄弟記錄。圖2-14b中的實例,如果用子女-兄弟鏈接法表示,其結構如圖2-16所示。

圖2-16 子女-兄弟鏈接法

2)層次序列鏈接法。層次序列鏈接法按樹的前序遍歷順序,鏈接各記錄值。圖2-14b中的實例,如果用層次序列鏈接法表示,其結構如圖2-17所示。

圖2-17 層次序列鏈接法

2.2.3 網狀數據模型

現實世界中,許多事物之間的聯系是非層次結構的,它們需要使用網狀模型表示。網狀數據庫系統是采用網狀模型作為數據組織方式的數據庫系統。網狀數據庫系統的典型代表是DBTG系統,也稱CODASYL系統。它是20世紀70年代數據系統語言研究會(Conference On Data System Language,CODASYL)下屬的數據庫任務組(Data Base Task Group,DBTG)提出的一個系統方案。DBTG系統雖然不是實際的數據庫軟件系統,但是它提出的基本概念、方法和技術,對于網狀數據庫系統的研制和發展起了重大的影響,后來很多數據庫系統都采用了DBTG模型,如HP公司的IMAGE、Univac公司的DMS1100、Honeywell公司的IDS/2、Cullinet Software公司的IDMS等。

1.網狀模型的數據結構

(1)網狀模型結構的基本特征

滿足以下兩個條件的基本層次聯系的集合稱為網狀模型。

1)有一個以上的結點沒有雙親。

2)結點可以有多于一個的雙親。

圖2-18a、圖2-18b和圖2-18c都是網狀模型的例子。

圖2-18 網狀模型的例子

網狀模型的結構比層次模型的結構更具有普遍性,它允許多個結點沒有雙親,也允許結點有多于一個的雙親。此外,網狀模型還允許兩個結點之間有多種聯系。因而,網狀模型可以更直接地去描述現實世界。

(2)網狀模型的數據表示方法

1)同層次模型一樣,網狀模型也使用記錄和記錄值表示實體集和實體;每個結點也表示一個記錄,每個記錄可包含若干個字段。

2)網狀模型中的聯系用結點間的有向線段表示。每個有向線段表示一個記錄間的一對多的聯系。網狀模型中的聯系簡稱為系。由于網狀模型中的系比較復雜,兩個記錄之間可以存在多種系,一個記錄允許有多個雙親記錄,所以網狀模型中的系必須命名。用系名標識不同的系。例如,圖2-18a中R3有兩個雙親記錄R1和R2,因此我們把R1與R3之間的聯系命名為L1,R2與R3之間的聯系命名為L2。另外,網狀模型中允許有復合鏈,即兩個記錄間可以有兩種以上的聯系,如圖2-18b所示。

層次模型實際上是網狀模型的一個特例。

2.網狀模型的完整性約束條件

網狀數據模型記錄間的聯系比較復雜。一般來說,它沒有層次模型那樣嚴格的完整性約束條件,但具體的網狀數據庫系統對數據操縱都加了一些限制,提供了一定的完整性約束。例如DBTG在模式DDL中,提供了定義DBTG數據庫完整性的若干個概念和語句,它們是:

1)支持記錄碼的概念。碼即唯一記錄的數據項的集合。

2)保證一個聯系中雙親記錄和子女記錄之間是一對多的聯系。

3)可以支持雙親記錄和子女記錄之間某些約束條件。例如,有些子女記錄要求雙親記錄存在時才能插入,雙親記錄刪除時子女記錄也一同刪除。

3.網狀模型的存儲結構

由于網狀模型記錄之間的聯系比較復雜,因而如何實現記錄之間的聯系的問題是網狀數據模型存儲結構中的關鍵。網狀數據模型常用的存儲方法是鏈接法,它包括單向鏈接、雙向鏈接、環狀鏈接、向首鏈接等。此外,網狀數據模型還用其他的存儲方法,如指引元陣列法、二進制陣列法、索引法等。

4.網狀模型和層次模型比較

網狀數據模型和層次模型比較,雙方各有其自身的優缺點。

(1)層次模型的主要優缺點

層次模型的主要優點是:數據模型本身比較簡單;系統性能優于關系模型和網狀模型;能夠提供良好的完整性支持。

層次模型的主要缺點是:在表示非層次性的聯系時,只能通過冗余數據(易產生不一致性)或創建非自然的數據組織(引入虛擬結點)來解決;對插入和刪除操作的限制比較多;查詢子女結點必須通過雙親結點;由于結構嚴密,層次命令趨于程序化。

(2)網狀數據模型的主要優缺點

網狀數據模型的主要優點有:能夠更直接地描述現實世界,一個結點可以有多個雙親,允許復合鏈,具有良好的性能,存取效率比較高。

網狀數據模型的缺點主要是:結構比較復雜,而且隨著應用環境的擴大,數據庫的結構就變得越來越復雜,不利于用戶掌握;DDL和DML語言復雜,用戶不容易使用;由于記錄之間聯系是通過存取路徑實現的,應用程序在訪問數據時必須選擇適當的存取路徑,因此,用戶必須了解系統結構的細節后才能實現其數據存取,程序員要為訪問數據設置存取路徑,加重了編寫應用程序的負擔。

2.2.4 關系數據模型

關系模型是3種模型中最重要的一種。關系數據庫系統采用關系模型作為數據的組織方式,現在流行的數據庫系統大都是關系數據庫系統。關系模型是由美國IBM公司San Jose研究室的研究員E.F.Codd于1970年首次提出的。自20世紀80年代以來,計算機廠商新推出的數據庫管理系統幾乎都是支持關系模型的,非關系模型的產品也大都加上了關系接口。

1.關系模型的數據結構

關系數據模型建立在嚴格的數學概念的基礎上。在關系模型中,數據的邏輯結構是一張二維表,它由行和列組成。

(1)關系模型中的主要術語

1)關系:一個關系(Relation)對應通常所說的一張二維表。表2-2就是一個關系。

表2-2 學生學籍表

2)元組:表中的一行稱為一個元組(Tuple),許多系統中把元組稱為記錄。

3)屬性:表中的一列稱為一個屬性(Attribute)。一個表中往往會有多個屬性,為了區分屬性,要給每一個列起一個屬性名。同一個表中的屬性應具有不同的屬性名。

4)碼:表中的某個屬性或屬性組,它們的值可以唯一地確定一個元組,且屬性組中不含多余的屬性,這樣的屬性或屬性組稱為關系的碼(Key)。例如表2-2中,學號可以唯一地確定一個學生,因而學號是學生學籍表的碼。

5)域:屬性的取值范圍稱為域(Domain)。例如,大學生年齡屬性的域是(16~35),性別的域是(男,女)。

6)分量:元組中的一個屬性值稱為分量(Element)。

7)關系模式:關系的型稱為關系模式(Relation Mode),關系模式是對關系的描述。關系模式一般的表示是:關系名(屬性1,屬性2,…,屬性n)。例如,學生學籍表關系可描述為:學生學籍(學號,姓名,性別,年齡,所在系)。

(2)關系模型中的數據全部用關系表示

在關系模型中,實體集以及實體間的聯系都是用關系來表示的。

例如,關系模型中,學生、課程、學生與課程之間的聯系表示為:

學生(學號,姓名,性別,年齡,所在系)

課程(課程號,課程名,先行課)

選修(學號,課程號,成績)

關系模型要求關系必須是規范化的。所謂關系規范化是指關系模式要滿足一定的規范條件。關系的規范條件很多,但首要條件是關系的每一個分量必須是不可分的數據項。

2.關系操作和關系的完整性約束條件

關系操作主要包括數據查詢和插入、刪除、修改數據。關系中的數據操作是集合操作,無論操作的原始數據、中間數據或結果數據都是若干元組的集合,而不是單記錄的操作方式。此外,關系操作語言都是高度非過程的語言,用戶在操作時,只要指出“干什么”或“找什么”,而不必詳細說明“怎么干”或“怎么找”。由于關系模型把存取路徑向用戶隱蔽起來了,使得數據的獨立性大大地提高了;由于關系語言的高度非過程化,使得用戶對關系的操作變得容易,提高了系統的效率。

關系的完整性約束條件包括3類:實體完整性、參照完整性和用戶定義的完整性。

3.關系模型的存儲結構

在關系數據庫的物理組織中,關系以文件形式存儲。一些小型的關系數據庫管理系統(RDBMS)采用直接利用操作系統文件的方式實現關系存儲,一個關系對應一個數據文件。為了提高系統性能,許多關系數據庫管理系統采用自己設計的文件結構、文件格式和數據存取機制進行關系存儲,以保證數據的物理獨立性和邏輯獨立性,更有效地保證數據的安全性和完整性。

4.關系模型與非關系模型比較

與非關系數據模型相比,關系數據模型具有下列特點。

1)關系數據模型建立在嚴格的數學基礎之上。關系及其系統的設計和優化有數學理論指導,因而容易實現,且性能好。

2)關系數據模型的概念單一,容易理解。關系數據庫中,無論實體還是聯系,無論是操作的原始數據、中間數據還是結果數據,都用關系表示。這種概念單一的數據結構,使數據操作方法統一,也使用戶易懂易用。

3)關系數據模型的存取路徑對用戶隱蔽。用戶根據數據的邏輯模式和子模式進行數據操作,而不必關心數據的物理模式情況,無論計算機專業人員還是非計算機專業人員使用起來都很方便,數據的獨立性和安全保密性都較好。

4)關系模型中的數據聯系是靠數據冗余實現的。關系數據庫中不可能完全消除數據冗余。由于數據冗余,使得關系的空間效率和時間效率都較低。

基于關系模型的優點,關系數據模型自誕生以后發展迅速,深受用戶的喜愛;而計算機硬件的飛速發展,更大容量、更高速度的計算機會對關系模型的缺點給予一定的補償。因而,關系數據庫始終保持其主流數據庫的地位。

2.2.5 面向對象數據模型

面向對象數據庫系統支持面向對象數據模型(OO模型)。一個面向對象的數據庫系統是一個持久的、可共享的對象庫的存儲和管理者;而一個對象庫是由一個面向對象數據模型所定義的對象集合體。

1.面向對象數據模型的基本概念

一個面向對象數據模型是用面向對象觀點來描述現實世界實體(對象)的邏輯組織、對象間限制、聯系的模型。一系列面向對象核心概念構成了面向對象數據模型的基礎。面向對象數據模型的核心概念如下。

(1)對象與對象標識

現實世界的任一實體都被統一地模型化為一個對象(Object),每一個對象有一個唯一的標識,稱為對象標識(Object Identifier,OID)。對象是現實世界中實體的模型化,它與記錄、元組相似,但遠比它們復雜。

(2)封裝

每一個對象是其狀態與行為的封裝(Encapsulation),其中狀態是該對象一系列屬性值的集合,而行為是在對象狀態上操作方法的集合。

(3)類

共享同一屬性結合和方法集合的所有對象組合在一起構成了一個對象類(Class,類),一個對象是某一類的一個實例(Instance)。例如,學生是一個類,具體某一個學生,如王英是學生類中的一個對象。在數據庫系統中有“型”和“值”的概念,而在OODB中,“型”就是類,對象是某一類的“值”。類屬性的定義域可以為基本類,如字符串、整數、布爾型,也可以為一般類,即包含屬性和方法的類。一個類的屬性也可以定義為這個類自身。

(4)類層次

一個系統中所有類組成的一個有根的有向無環圖稱為類層次(Class Hierarchy)。如同面向對象程序設計一樣,在面向對象的數據庫模型中,可以定義一個類(如C1)的子類(C2),類C1稱為類C2的父類(或超類)。子類還可以再定義子類,例如C2可以再定義子類C3。這樣面向對象數據庫模式的一組類就形成一個有限的層次結構,這就是類層次。一個類可以有多個超類,有的是直接的,有的是間接的。例如,C2是C3的直接超類,C1是C3的間接超類。一個類可以繼承它的所有超類(包括直接超類和間接超類)的屬性和方法。

(5)消息

在面向對象數據庫中,對象是封裝的,對象之間的通信和面向對象程序設計中的通信機制相似,也是通過消息(Message)傳遞來實現的。即消息從外部傳遞給對象,存取和調用對象中的屬性和方法,在內部執行要求的操作,操作的結果仍以消息的形式返回。

2.對象結構與對象標識

(1)對象結構

對象是由一組數據結構和在這組數據結構上的操作程序代碼封裝起來的基本單位。對象之間的界面由一組消息構成。一個對象通常包括以下幾個部分。

1)屬性集合。所有屬性構成了對象數據的數據結構。屬性描述對象的狀態、組成和特性。對象的某一屬性可以是單值或多值的,也可以是一個對象。如果對象的某一屬性還是對象,對象就形成了嵌套,這種嵌套可以繼續,從而組成各種復雜對象。

2)方法集合。方法用于描述對象的行為特性。方法的定義包括方法的接口和方法的實現兩部分:方法的接口用以說明方法的名稱、參數和結果返回值的類型,也稱之為調用說明;方法的實現是一段程序代碼,用以實現方法的功能,即對象操作的算法。

3)消息集合。消息是對象向外提供的界面,消息由對象接收并響應。消息是指對象之間操作請求的傳遞,它并不管對象內部是如何處理的。

(2)對象標識

面向對象數據庫中的每個對象都有一個唯一的、不變的標識,即對象標識(OID)。對象通常與實際領域的實體對應,在現實世界中,實體中的屬性值可能會隨著時間的推移而發生改變,但是每個實體的標識始終保持不變。相應的,對象的部分(或全部)屬性、對象的方法會隨著時間的推移發生變化,但對象標識不會改變。兩個對象即使屬性值和方法都完全相同,但如果它們的對象標識不同,則認為兩個對象不同,只是它們的值相同而已。對象標識的概念比程序設計語言或傳統數據模型中所用到的標識概念更強。

下面是常用的幾種對象標識。

1)值標識。值標識是用值來表示的。關系數據庫中使用的就是值標識,在關系數據庫中,碼值是一個關系的元組唯一標識。例如學號“980001”唯一標識了計算機系的學生張三。

2)名標識。名標識是用一個名字來表示標識。例如,程序變量使用的就是名標識,程序中的每個變量被賦予一個名字,變量名惟一地標識每個變量。

3)內標識。上面兩種標識是由用戶建立的,內標識是建立在數據模型或程序設計語言中,不要求用戶給出標識。面向對象數據庫系統使用的就是內標識。

不同標識其持久性程度是不同的。若標識只能在程序或查詢的執行期間保持不變,則稱該標識具有程序內持久性。例如,程序設計語言中的變量名和SQL語句的元組標識符,就是具有程序內持久性的標識。若標識在從一個程序的執行到另一個程序的執行期間能保持不變,則稱該標識具有程序間持久性。例如,在SQL語言中的關系名是具有程序間持久性的標識。若標識不僅在程序執行過程中而且在數據的重組重構過程中一直保持不變,則稱該標識具有永久持久性。例如,面向對象數據庫系統中對象標識具有永久持久性,而SQL語言中的關系名不具有永久持久性,因為數據的重構可能修改關系名。

對象標識具有永久持久性的含義是,一個對象一經產生,系統就給它賦予一個在全系統中唯一的對象標識符,直到它被刪除。對象標識是由系統統一分配的,用戶不能對對象標識符進行修改。對象標識是穩定的,它不會因為對象中某個值的修改而改變。

面向對象的數據庫系統在邏輯上和物理上從面向記錄(或元組)上升為面向對象、面向可具有復雜結構的一個邏輯整體。它允許用自然的方法并結合數據抽象機制在結構和行為上對復雜對象建立模型,從而大幅度提高管理效率,降低用戶使用復雜度,并為版本管理、動態模式修改等功能的實現創造了條件。

3.封裝

封裝是面向對象數據模型的一個非常關鍵的概念。每一個對象是其狀態與行為的封裝。對象的通信只能通過消息,這是OO模型的主要特征之一。

(1)封裝可以提高數據的獨立性

由于對象的實現與對象應用相互隔離,這樣當對操作的實現算法和數據結構進行修改時就不會影響接口,因而也就不必修改使用它們的應用。由于封裝,對用戶而言對象的實現是不可見的,這就隱蔽了在實現中使用的數據結構與程序代碼等細節。

(2)封裝可以提高應用程序的可靠性

由于對象封裝后成為一個自含的單元,對象只接受已定義好的操作,其他程序不能直接訪問對象中的屬性,從而提高了程序的可靠性。

(3)封裝會影響到數據查詢功能

對象封裝后也帶來了另一個問題,即如果用戶要查詢某個對象的屬性值,就必須通過調用方法,而不能像關系數據庫系統那樣進行即席的(隨機的)、按內容的查詢,這就不夠方便靈活,失去了關系數據庫的重要優點,因此在面向對象數據庫中必須在對象封裝方面作必要的修改。

4.類的概念

在面向對象數據庫中,相似對象的集合稱為類。類的一個實例稱為一個對象。一個類所有對象的定義是相同的,不同對象的區別在于屬性的取值不同。類和關系模式非常相似,類的屬性類似關系模式的屬性,對象類似元組。實際上,類本身也可以看作是一個對象,稱為類對象(Class Object)。面向對象數據模式是類的集合。

面向對象的數據模式中存在著多種相似但有所不同的類。例如,構造一個有關學校應用的面向對象數據庫,教工和學生是其中的兩個類。這兩個類有一些屬性是相同的,如兩者都有身份證號、姓名、年齡、性別、住址等屬性,也有一些相同的方法。當然,兩者也有自己特殊的屬性,如學生有學號、專業、年級等屬性,而教工有工齡、工資、單位、電話號碼等屬性,有自己獨特的方法。用戶希望統一定義教員和學生的公共屬性、方法和消息部分,分別定義各自的特殊屬性、方法和消息部分。面向對象的數據模型提供的類層次結構可以實現上述要求。

5.類的層次結構

在面向對象的數據模式中,一組類可形成一個類層次。一個面向對象數據模式可能有多個層次。在一個類層次中,一個類繼承它的所有超類的全部屬性、方法和消息。

例如,教工和學生可以分別定義成教工類和學生類,而教工類和學生類又都屬于人這個類;教工又可定義教師、行政人員兩個子類,學生類又可以定義本科生和研究生兩個子類。圖2-19表示了這種學校數據庫的類層次關系。

圖2-19 學校數據庫的類層次結構圖

需要指出的是,一個類可以從一個或多個已有的類中導出。

6.類的繼承性

繼承(Inherit)是面向對象數據庫的重要特征。如果一個子類只能繼承一個超類的特性(包括屬性、方法和消息),這種繼承稱為單繼承;如果一個子類能繼承多個超類的特性,這種繼承稱為多重繼承。單繼承是因為子類是從一個類導出的,它只能繼承這個類的特性;而多重繼承是因為一個子類是從多個類導出的,它可以繼承這多個類的所有特性。例如本科生是從學生這個類導出的,因而它只繼承了學生的所有特性,是單繼承。在學校中還有在職研究生,他們既是教工又是學生,所以在職研究生既繼承了教工的特性又繼承了學生的特性,它具有多重繼承性。

繼承性有兩個優點。

1)繼承性是建模的有力工具,提供了對現實世界簡明而精確的描述。

2)繼承性提供了信息重用機制。

由于子類可以繼承超類的特性,因此可以避免許多重復定義。當然子類還可以定義自己的屬性、方法和消息。子類對父類既有繼承又有發展,繼承的部分就是重用的部分。

7.滯后聯編

子類可以定義自己特殊的屬性、方法和消息,但是當子類定義的方法與父類中的方法相同時,即發生同名沖突時,應用程序中的同名操作該執行哪種操作呢?究竟是執行父類中的操作還是子類中的操作呢?面向對象的數據庫管理系統采用滯后聯編(Late Binding)技術來解決這種沖突。具體方法為:系統不是在編譯時就把操作名聯編到程序上,而是在運行時根據實際請求中的對象類型和操作來選擇相應的程序,把操作名與它聯編上(即把操作名轉換成該程序的地址)。

假設在前面的學校數據庫系統中,在學生類中定義了一個操作“打印”,主要功能是打印學生的基本信息。而在研究生子類中,也定義了一個操作“打印”,這個操作不但打印學生的基本信息,還需要打印研究成果等研究生特有的信息。這樣,在父類(學生)和子類(研究生)中都有一個“打印”操作,但是實際上這兩個操作是不同的。在面向對象的數據庫管理系統中,采用滯后聯編的方法來解決操作名相同而內容不同的問題,即在編譯時并不把“打印”操作聯編到應用程序上,而是在應用程序執行時根據實際的對象類型和操作選擇相應的程序。如果對象是學生就選擇學生類的打印方法類執行,如果對象是研究生就選擇研究生類的打印方法來執行。

8.對象的嵌套

在面向對象的數據模式中,對象的屬性不但可以是單值的或值的集合,還可以是一個對象。由于對象的屬性也是一個對象,這樣就形成了一種嵌套的層次結構。

圖2-20所示的是一個對象嵌套實例。圖中,工作單位的個人檔案包括姓名、性別、出生日期、籍貫、政治面貌、主要社會關系等屬性。這些屬性中:姓名和籍貫的數據類型是字符串;性別的數據類型是邏輯型的;出生日期是日期型的;而社會關系則是一個對象,包括父親、母親、配偶等屬性;而父親、母親、配偶等屬性又是對象,它們的屬性又包括姓名、年齡、工作單位、政治面貌等。

圖2-20 個人檔案的嵌套層次圖

對象嵌套形成的層次結構和類層次結構形成了橫向和縱向的復雜結構。不僅各種類之間具有層次結構,而且一個類內部也具有嵌套層次結構,這種結構不同于關系模式的平面結構,更能準確地反映現實世界的各種事物。

2.2.6 對象關系數據模型

對象關系數據模型是關系模型的擴展,是面向對象數據模型與關系模型結合的產物。對象關系數據模型是一種新型的數據模型,目前許多數據庫管理系統都支持它。

1.對象關系數據模型的概念

對象關系數據模型使用二維表表示數據,它包括關系表和對象表兩種。關系表屬于關系模型,關系的屬性對應于表的列,關系的元組對應于表的行,關系數據模型不支持方法。對象表屬于面向對象數據模型,支持面向對象的基本功能,對象的類抽象對應二維表,類的實例(對象)對應于表中的行,類的屬性對應于表的列,通過對象可調用方法。

對象表不再強調表結構一定要滿足關系范式,取消了許多應用限制,擴展了關系模型的數據類型,增加了用戶自定義的數據類型,更加靈活方便。

2.對象表的數據類型和表結構特點

對象表通過用戶自定義數據類型,實現支持數據使用記錄類型(對象類型)、數組類型和嵌入表類型,其表結構和設計方法與關系表有較大的變化。

(1)對象表的屬性支持復合數據類型

關系表強調屬性數據只能是不可分割的簡單數據項,是不允許出現復合數據的。對象表的數據可以是基本項,也可以是組合數據項。

例如我們要表示學生信息,屬性有“姓名”“學號”“年齡”“班級”和“家庭住址”,還有“隸屬關系”“姓名”“單位”“聯系電話”等家庭情況信息。用關系表示學生信息時,需要將家庭信息拆成一個個單一的基本項,與其他屬性并列表示;如果改用對象表存儲學生信息,可以將家庭信息定義成一個記錄類型(對象類型),保持了原有的屬性內在關系。

表2-3中,分別列出了使用對象表和關系表表示學生信息時的表結構,很容易看出含記錄類型的對象表的結構特點。

表2-3 使用對象表和關系表表示學生信息時的表結構

(2)對象表的屬性支持可變長數組類型

關系表的屬性不支持數組類型,更不支持可變長的數組類型。在設計數據庫時,對于一些數據個數不確定的信息,關系表只能采用獨立新建表的方法解決,不僅破壞了數據的整體性,還增加了數據查詢和處理的難度。由于對象表增加了數組類型,用戶可以使用可變長的數組類型保存記錄中數據個數不一樣的屬性數據,用更自然、更符合客觀情況的方式存儲數據,易于理解、處理和應用。

例如要存儲學生-選課信息,包括“學號”“姓名”“班級”“年齡”“選課名”及“成績”項,由于每個學生實際選課的門數不一樣,不能用固定的空間表示。使用關系表存儲學生-選課信息時,數據庫中需要學生表和選課表兩個二維表,它們之間需要通過外碼連接。如果改用對象表存儲學生-選課信息,可以使用二維變長數組類型表示“選課名”及“成績”,一個二維表就能滿足使用要求。

表2-4中,列出了學生-選課信息使用變長數組類型的對象表結構,同時也列出了關系表的結構,供大家對照分析。

表2-4 學生-選課的對象表與關系表結構

(3)對象表的屬性支持嵌入表數據類型

對象表中的屬性,不僅可以是復合數據、數組數據等帶結構的數據,還可以是嵌套表,信息結構更復雜、更豐富。嵌套表有行和列,表的長短與具體元組有關。例如學生-選課表中的選課數據也可以采用嵌套表數據類型表示,如圖2-21所示。

圖2-21 學生-選課的對象表中有嵌入表的圖例

主站蜘蛛池模板: 泰顺县| 漯河市| 大庆市| 蒲江县| 旅游| 阳春市| 阿拉善盟| 威远县| 西峡县| 枣庄市| 万安县| 安顺市| 阿拉善右旗| 永定县| 涿鹿县| 揭东县| 全南县| 兴国县| 云南省| 阜宁县| 璧山县| 松潘县| 霍城县| 高邮市| 上杭县| 那坡县| 腾冲县| 双流县| 抚州市| 菏泽市| 防城港市| 吴忠市| 吴桥县| 滦平县| 周至县| 祥云县| 开阳县| 高碑店市| 罗江县| 仙游县| 宜兰县|