面向對象數據庫系統支持面向對象數據模型,簡稱OO模型。也就是說,一個面向對象數據庫系統是一個持久的、可共享的對象庫的存儲和管理者;而一個對象庫是由一個OO模型所定義的對象的集合體。
面向對象數據庫系統目前尚缺少關於OO模型的統一的規范說明,OO模型缺少一個統一的嚴格的定義,但是有關OO模型的許多和新概念已取得了共識。
1、OO模型
一個OO模型是用面向對象觀點來描述現實世界實體的邏輯組織、對象間限制、聯系等的模型。一系列面向對象核心概念構成了OO模型的基礎。
OO模型的核心概念主要有:
(1) 對象和對象標識:現實世界的任一實體都被統一地模型化為一個對象,每個對象有一個惟一的標識,稱為對象標識(OID)。OID與關系數據庫中碼的概念,以及部分系統中支持的記錄標識、元組標識有本質的區別。OID識獨立於值、系統全局惟一的。對象通常與實際的表識始終保持不變。如一個對象的部分屬性、方法可能會發生變化,但對象標是不會改變。OID是區分兩個不同的對象的標准。常用OID有以下幾種:
值標識:用值來表示標識。如關系數據庫忠實永遠組的碼值區分元組。
名標識:用一個名字來標識。如在一個作用域內程序變量一般使用的就是名標識。
內標識:是建立在數據模型或程序設計與嚴重的不要求用戶給出的標示。例如,面向對象數據庫系統使用的就是內標識。
(2)封裝:每一個對象是其狀態與行為的封裝,其中狀態是該對象一系列屬性值的集合,行為是在對象狀態上操作的集合,操作也稱為方法。封裝是OO模型的一個關鍵概念,封裝是對象的外部界面與內部實現之間實行隔離的抽象,外部與對象的通信是通過“消息”實現的。
封裝將對象的實現與對象應用相互隔離,允許對操作的實現算法和數據結構進行修改而不應相應用接口;不必修改使用它們的應用,這有利於提高數據獨立性。封裝還隱藏了數據結構與程序代碼等細節,增強了應用程序的可讀性。
查詢或使用對象屬性值必須通過調用方法,如在VB中,要將一個文本框的文本內容存儲到一個字符串變量中,可以使用下面的語句:
以下是引用片段:
myStr=txtTextBox1.text
其中,“.”被稱為訪問符,通過它可以訪問文本框對象txtTextBox1的 text屬性。
(3)類:共享同樣的屬性和方法集的所有對象構成了一個對象類(CLASS),一個對象是某一類的一個實例。類的概念在面向對象數據庫中是一個基本概念,我們把屬性、方法相似的對象集合稱為類,而把每一個對象稱為所屬類的一個實例。
類的概念類似於關系模式,類的屬性類似於關系模式中的屬性;對下類似於源組的概念,類的一個實例對象類似於關系中的一個元組。類本身也可看作一個對象,稱為類對象。
(4) 類層次:在一個面向對象數據庫模式中,可以定義一個磊(C1)的子類(C2),類C1稱為類C2的超類;子類還可以再定義子類(C3)。這樣,面向對象數據庫模式的一組類構成一個有限的層次結構,稱為類層次。在每個類的最頂部通常被稱為基類。 對一個類來說,它可以有多個超類,也可以繼承類層次中其直接或間接超類的屬性和方法。
(5)消息:對象是封裝的,對象與外部的通信一般通過顯式的消息傳遞。即消息從外部傳送給對象,存取和調用對象中的屬性和方法;在內部執行所要求的操作,操作的結果仍以消息的形式返回。
(6)繼承:在OO模型中常用的兩種基稱:單繼承和多重繼承。若一個子類只能繼承一個超類的特性,這種繼承稱為單繼承;若一個子類能繼承多個超類的特性,這種繼承稱為多重繼承。例如“旅行用小汽車”既是小汽車又是旅行車,它繼承了小汽車和旅行車兩個超類的所有屬性、方法和消息,因此它屬於多重繼承。
繼承性是建模的有力工具,它同時提供了對現實世界簡明而精確的描述和信息重用機制。子類可以繼承超類的特性,可以避免許多重復定義,還可以定義自己特殊的屬性、方法和消息。如果在定義自己特殊的屬性、方法、消息時與繼承下來的超類的屬性、方法和消息發生沖突時,通常由系統解決,在不同的系統中使用不同的沖突解決方法,因此便產生了不同的繼承語義。例如對於子類與超類之間的同名沖突,一般是以子類定義的為准,即子類的定義取代或替代由超類繼承而來的定義;對於子類的多個直接超類之間的同名沖突,有的系統是在子類中規定超類的優先次序,首先繼承優先級最高的超類的定義,有的系統則指定繼承其中某一超類的定義。
2、持久性
不同對象的標識的持久性程度是不同的。若標識能在程序或查詢的執行期間保持不變,則稱該標識具有程序內持久性。若標識在從一個程序的執行到另一個程序的執行期間保持不變,則稱該標識具有程序間持久性。若標識不僅在程序執行過程中而且在對數據的重組重構過程中一直保持不變,則稱該標識具有永久持久性。例如,面向對象數據庫中對象標識具有永久持久性,而SQL與嚴重的關系名不具有永久持久性,因為數據重構可能修改關系名。
對象標識具有永久持久性含義是:一個對象一經產生,系統就給它賦予一個在全系統中唯一的對象標識符,指導它被刪除。對象標識是由系統統一分配的,用戶不能對對象標識符進行修改。對象標識是穩定的,它不會因為對象中某個值的改變而改變。
3、面向對象數據庫
面向對象數據庫模式是類的集合。面向對象的數據模型提供了一種類層次結構。在面向對象數據庫模式中,一組類可以形成一個類層次。一個面向對象數據庫可能有多個類層次。在一個類層次中,一個類繼承其所有超類的全部屬性、方法和消息。
面向對象的數據庫系統在邏輯上和物理上從面向記錄上升為面向對象、面向可具有復雜結構的一個邏輯整體。允許用自然的方法,並結合數據抽象機制在結構和行為上對復雜對象建立模型,從而大幅度提高管理效率,降低用戶使用復雜性。
4、面向對象數據庫的特性
面向對象數據庫的特性有主要表現在滯後聯編和對象的嵌套兩方面。
1) 滯後聯編
在OO模型中,當子類定義方法與繼承下來的超類的方法產生同名沖突,即子類只繼承了超類中操作的名稱,子類自己實現操作算法,並有自己的數據結構和程序代碼。這樣,同一個操作名就與不同的實現方法、不同的參數相聯系。
一般地,在OO模型中對於同一操作,可以按照類的不同重新定義操作的實現,這稱為操作的重載(同名函數,不同參數)。
例如,定義Tdate類,同時為了滿足不同的設置需要,可以設定3個Set函數():
以下為引用的內容:
Class Tdate
{
public:
int month,day,year; //三個屬性
void set(int m,int d,int y); //同時設置三個屬性月,日,年
void set(int m); //設置月
void set(int d,int y); //設置日,年
}
程序中用到如下定義:
Tdate myDate;
可以有以下不同的set方法(函數)的應用:
以下為引用的內容:
MyData.set(12,3,2002);
MyData.set(12);
MyData.set(12,2002);
為了正確執行myDate的一個set方法,OODBMS不能在編譯時就把操作set聯編到程序上,而必須根據運行時的實際需求,選擇相應的對象類型的相應的程序進行聯變,這個推遲的轉換稱為滯後聯變。
在同一個面向對象數據庫模式中,對象的某一屬性可以是一個對象,這樣對象之間就產生一個嵌套的層次結構。例如:設Obj1和Obj2是兩個對象,如果Obj2是Obj1的某個屬性的值,稱Obj2屬於Obj1,或Obj1包含Obj2。一般的,如果對象Obj1包含Obj2,則稱Obj1位復雜對象或復合對象。
對象嵌套概念是面向對象數據庫系統的一個重要概念,它允許不同的用戶采用不同的粒度來觀察對象。對象嵌套層次結構和類層次結構形成了對象橫向和縱向的復雜結構。