高等資料庫報告
物件導向資料庫(二)
The Object Database Standard:
ODMG - 2.0
指導老師:陳彥良教授
學 生:林 豔 88423036
張志緯 88423037
89.4.13
目 錄
目 錄…………………………………………………………………………… | 2 |
第一章 物件導向資料庫基本概念…………………………………………… | 3 |
1.1 起源………….………………………………………………………….. | 3 |
1.2ODMG-物件導向資料庫新標準……….………………………………. | 5 |
第二章 物件模式ODMG Object Model……………………………………… | 10 |
2.1 概要………………….………………………………………………….. | 10 |
2.2 型態(Type)……….………………………………………………….. | 10 |
2.3 類別(Classes)….…………………………………………………….. | 11 |
2.4 Object Identification……………………………………………………. | 13 |
2.5 Collections………………………………………………………………. | 13 |
2.6 Relationships…………………………………………………………... | 14 |
第三章 物件定義語言Object Definition Language…………………………. | 15 |
3.1 引言…………………………………………………………………… | 15 |
3.2 規格…………………………………………………………………… | 15 |
第四章 物件查詢語言Object Query Language……………………………. | 18 |
4.1 OQL的目的…………………………………………………………… | 18 |
4.2 包含架構(Construction of Collection Literals)……………………… | 22 |
4.3 語言描述……………………………………………………………… | 23 |
4.4 運算元優先順序……………………………………………………… | 28 |
第五章ODMG物件導向資料庫的應用…………………………………… | 30 |
5.1 ODMG支援廠商……………………………………………………… | 30 |
5.2 WOO-DB物件導向資料庫…………………………………………….. | 31 |
5.3 WOO-DB功能介紹…………………………………………………….. | 36 |
參考書目………………………………………………………………………. | 46 |
第一章 物件導向資料庫基本概念
起源
物件導向資料庫的起源,是由於物件導向程式語言的興盛而產生的。程式設計師需要一個儲存庫來儲存永久存在的資料。物件導向資料庫對於某些應用軟體特別重要,例如CAD及CAE,因為CAD及CAE會產生大量的二進位格式的物件例如設計圖,使用者在存取這些資料的時候,不單單只是希望存取資料而已,並且希望能夠得到關於存取這些資料的一些程序,這些程序是為了用來控制資料的整合性及安全性。
在電腦程式經過了好幾代的發展後,程式設計師漸漸瞭解物件導向技術對於程式的開發會有很大的幫助,物件導向的技術用在資料庫上,就成為了物件導向資料庫。另一方面,傳統關連式資料庫所不能達到的各種要求,漸漸的促使新一代資料庫管理系統的產生。並且由於資料庫漸漸的變成框架導向(frame-oriented),其中每一個框架是一種物件,包括與其相關的法則所組成。也有越來越多種的抽象型別資料需要支援,例如音效、影像及Video。複雜的資料需要特別的存取技術,使得其效能高於關連式資料庫,以上的需求促使了物件導向資料庫的誕生。在此以條列方式說明物件導向資料庫誕生的原因:
關連式資料庫的效能不能使大家滿意
由於大型二進位資料物件型態(如聲音、影像、Video)的大量盛行,傳統關連式資料庫無法處理這些資料。
有些系統需要永久性存在的資料,如專家系統
使用者自訂資料型別及抽象資料型別的大量使用
由於物件導向語言的興盛,物件導向資料庫因此漸漸被重視,物件導向資料庫被設計可與物件導向程式語言整合得很好,資料庫語言沒有必要與程式設計語言不同。例如有些物件導向資料庫使用C++來作為所有資料庫的定義與處理。相同的物件模式亦可用於分析與設計,分析師決定高階物件及高階的行為,設計師將其實作到較低階的物件,低階的物件繼承了高階物件的特質及行為。有了物件導向軟體工程工具,物件一被做出,程式碼就可立即的被翻譯出來。
在1980年代的末期,第一代的物件導向資料庫系統出現了,早期的系統被設計成物件導向程式語言的延伸。其資料處理語言(DML)及資料定義語言(DDL)是一種共同的物件導向語言,現代的物件導向資料庫設計,應該要利用電腦輔助軟體工程所創造出來方法,包括宣告性敘述、程式碼產生器及法則式的推理。物件導向式資料庫管理系統(OO DBMS)標準的訂定最初由ANSI的資料庫系統研究群(ANSI Database Systems Study Group)首先在1991年發表了關於物件導向式資料庫管理與未來標準訂定的相關報告。接著有三個機構相繼為OO DBMS的標準訂定投注人力,分別是:
Object Database Management Group(ODMG)-Object Database Management Group是一個物件導向資料庫廠商所組成的聯盟體制,該聯盟在1992年成立,目標在訂定物件導向式資料庫管理系統上的各項相關標準。該聯盟在歷經一年半的努力後,於1993年10月公佈了第一版的標準-ODMG-93,其中定義了資料模式、查詢語言等。而後陸續有ODMG 1.1、1.2、2.0及最近剛提出的ODMG 3.0,由於資料取得的關係,本篇文章的內容以ODMG 2.0的規格為主。至於ODMG 3.0可以在http://www.odmg.org這個網站獲得一些相關的資訊。由於ODMG的組成份子大多來自資料庫系統廠商,因此在技術的制訂與推廣上顯得較為積極,也是目前市面上被採行最多和影響最深的物件資料庫標準。
ANSI Object SQL委員會(簡稱ANSI SQL3委員會)-此委員會的標準制定涵蓋面較廣,包含了各式各樣的資料庫規則與觸發條件等。ANSI/ISO延續SQL 2國際資料標準語言,加入程序性與物件資料模式,制訂了SQL 3。ANSI/ISO的著眼點在於繼續沿用SQL 2的影響力,保留既有資料庫管理和開發的技術投資。
OMG(Object Management Group),OMG的組成份子包括電腦硬體和軟體廠商,組織的目標在制定和推廣分散式及物件式系統與應用軟體的架構標準,並不只限於資料庫。因此,物件資料庫標準只是OMG物件軟體標準的一部分。由於OMG的組成成員超過400家廠商,而其所提出標準中的CORBA(Common Object Request Borker Architecture),已經被主從式架構和分散式運算技術所採用。
ODMG-物件導向資料庫新標準
ODMG在1994年又修訂ODMG-93為1.1版,主要是將1.0版的內容中不一致的部份加以修正。1995年底又進一步發表1.2版,在這版中加入一些重要的特性如:訂定了與SQL92相容的部份,以及與ANSI C++相關的一些特性。到了ODMG 2.0版,則新增了Java Binding的功能。
在ODMG之前,因為缺乏一套物件資料庫的標準,無形中限制了應用的範圍,傳統的關連式資料庫雖然紅透半邊天,但仍舊無法解決更高階的應用,所以ODMG的推動將提供資料庫廠商一套遵循的標準,一旦所有的規格能夠統一,並將所有的程式碼和資料庫指令鑲嵌在一塊,則必定能增加系統的可攜性與執行效率。
ODMG的主要目的是提供一套標準,讓ODBMS的程式設計師能夠發展可攜性的應用程式,讓一支程式可以適用於數套不同的物件式資料庫(當然,前提是這些資料庫系統必須支援ODMG的規格),要做到這一點必須連資料綱目、程式語言、資料操作及查詢語言都具有可攜性。在接下來的章節中,我們將討論ODMG 2.0的架構及內容,並比較2.0版與之前的ODMG 1.2有何差異。
ODMG架構
ODMG希望在使用介面上是與現存的物件導向程式語言,如:C++、Smalltalk、Java等,直接以緊密結合(Tightly -Binding)的方式溝通。這與關聯式資料庫中所使用的SQL不一樣,因為在SQL中,DDL與DML在與程式語言的聯繫上,都是以較鬆散的嵌入式SQL來做。因此,對於使用者以ODL(或依某特定程式語言所訂定的ODL)所描述的宣告,需要經過一個「物件宣告前置處理器」(Declaration Preprocessor)來加以剖析,以建立資料庫的綱要(Object Database Scheme)。應用程式則可以使用標準的物件導向式程式語言(C++或Java)來處理或查詢該資料庫,因此在觀念上會有一個OODBMS Runtime(Object-Oriented Database Management Systems Runtime)要與應用程式的目的碼(Object Code)互相連結(Link)。其架構按D.Bartels(1996)的說明可描繪如圖1-1所示。
圖 1-1 ODMG 的架構
ODMG的組成元件
ODMG 2.0 改進了1.2版的諸多功能,為了支援更廣泛的應用,ODMG 2.0在原有的C++與Smalltalk之外,又新增了Java Binding的功能,同時也擴充了物件模式的廣度,及metadata的介面,以定義物件的轉換規格;以下是ODMG 2.0的組成元件:
物件模式(Object Model):ODMG的物件模式中有許多是根據OMG(Object Management Group)的物件模式(Object Model)而得來的,OMG的核心model是被設計來處理物件的需求,並擔任物件資料庫、物件導向語言及其他應用程式的中間人。ODMG 2.0的物件模式支援了「型態」(Types)、「類別」(Classes)、「封包」(Encapsulation)、「繼承」(Inheritance),與「同體多型態」(Polymorphism)。另外還有Object Identifier(OID)、Collection Types-聚集型態、Transaction Model交易模式、Relationships、Extents、Keys。(詳細內容將於第二章介紹)
Relationship-Relationship是物件的特性之一,可以定義在一個以上的物件上。
Extent-一個型態的Extent代表了某個Database中所有屬於此型態的實例(Instance)。
Key-可以用來唯一決定某個型態中的實例,Key可以是簡單的(Simple Key)或是複合的(Compound Key),是物件的一個性質(Property)。
Collection Types-聚集型態,可以用來建立複雜的物件。有許多事先定義好Collection Types可以使用,如:Set<Type>﹑Bag<Type>﹑List<Type>﹑Array<Type>。
物件規格語言(Object Specification Language):在物件資料庫的規格語言中,最主要的即是ODL(Object Definition Language),ODL與任何程式語無關,也不是被用來描述物件內部實作的細節(Implementation Detail)。它是以OMG的IDL(Interface Definition Language)為基礎,再增加了Relationships、Collection、Extents與Keys等特性,並且可以將這些特性對應到現存的ODMG物件模式(ODMG Object Model)上。(詳細內容將於第三章介紹),到了2.0版中,新增了另一個語言,稱為Object Interface Format(OIF),主要是處理物件間的介面規格
物件查詢語言(Object Query Language):ODMG的標準化制定過程中,OQL曾歷經數度的修改,期望能與標準SQL儘可能地相容。目前的OQL已經是標準SQL的Superset了,將來可以預期的是:在關聯式資料庫上所下的任何標準SQL指令,若移到物件導向式資料庫上做查詢,則所表達的查詢意義與所得到的結果應該是一樣的。不過要謹記在心的是:OQL所讀取出來的是物件,而非如關聯式資料庫的表格資料。(詳細內容將於第四章介紹);基本上,OQL的語法跟SQL極為相像,並以SQL-92為主要的參考對象,以下是OQL的一個例子(以ODMG 2.0的規格寫成);
Select c.address
From Person p, p.children c
Where p.address.street=”Chung-li Road” and
Count(p.children) >=2 and
c.address.city != p.address.city
這個查詢式會去尋找所有住在Chung-li Road且有兩個小孩以上的人,並只顯示那些不跟父母住在一起的小孩的住址,以下是這個查詢的圖示:
C++ Language Binding:我們可以利用C++的語法來實做ODL,同時ODMG更提供了一套機制,以C++來執行OQL的工作,也可以允許我們利用C++來管理資料庫及交易活動。
Smalltalk Language Binding:Smalltalk現在的普及性已經遠低於C++及Java,因此在此就不詳加介紹,在功能上與C++相去不遠。
Java Language Binding:在ODMG 1.1版之後就提供了Java的語法支援,在功能上與C++並無不同之處。
我們可以利用C++、Smalltalk或Java製做出一模一樣的資料庫;與SQL在關連式資料庫中不同,這些語言與資料庫的緊密性較高,即使面對的是不同的物件資料庫,我們仍無須去更改任何的程式,就能夠相容於不同的產品甚至平台之間。
ODMG的程式語言
目前市面上的程式語言相當繁多,為什麼ODMG只支援C++、Smalltalk和Java?而不選擇目前當紅的Basic,其實理由相當直覺,為了達到可攜性的目的,候選的程式語言勢必要能夠遊走於不同的作業系統平台之間,否則就違背了ODMG的原意。
在ODMG 1.1之後,新增了Java Binding的功能,目前ODMG是Java物件儲存技術唯一的工業標準,為了增加可信度,ODMG邀集了Java界的領導廠商Sun及JavaSoft來共同制訂此一規格,這是為了避免C++流派過於眾多的問題,目前C++的主導者有Borland及Microsoft等軟體廠商,而彼此之間更因為利益迴避原則,而缺乏了整合的機會;所以在ISO C++的STL(Standard Template Library)尚未統一規格之前,要用C++來實做ODMG還是有先天上的困難;所以ODMG協會才會將焦點放在Java上。
在JDK 1.2之後,以經正式支援ODMG的語法,目前網路上的ODMG範例也幾乎清一色以Java作為展示的標準程式語言,因為Sun與JavaSoft在Java界具有指標的地位,一般來說,軟體廠商所提的各種規格都必須依循一套標準,所以在整合上遠較C++來得容易多了。而Java也的確不負期望,其設計的原意就是要在各平台之間具有可攜性,這也正中了ODMG的下懷,ODMG的功能不就是要消彌各種平台與產品之間的鴻溝嗎。
S
TL(Standard
Template
Library):是一群以樣版為根基的C++函式庫,目的在於提供一些基本的資料結構及演算法,並特別注重執行效率。STL於1994年2月正式成為ANSI/ISO
C++的一部份,它的出現影響了程式設計師的思維方式。此外,目前STL與C++
iostream、String等類別程式庫結合而成的C++標準函式庫(C++
Standard Library),將使C++邁入Component
Software的領域。Component
Software將軟體程式視同硬體的IC一樣,可以組合搭配形成完整的應用程式。
ODMG Object Model
2.1 概要
ODMG物件模式是ODMG標準的核心,許多的物件模式是來自OMG(Object Management Group)的物件模式,它支援了型態(Types)、類別(Classes)、封包(Encapsulation)、繼承(Inheritance)、同體多型態(Polymorphism)。另外還有Object Identifier(OID)、聚集型態(Collection Types)、交易模式(Transaction Model)、Relationships、Events、Keys。
「物件模式」的意思是:系統的物件模式;換句話說,我們在觀察系統時以物件概念去對系統做抽象,因而在我們心中把系統看成為一群物件所構成的,物件成為系統抽象表示法的最重要元素(element),當然還包括有其它的元素,但物件是最核心的元素1。物件模式簡單地摘要如下:
基本模型的原始是物件。
物件可以依照型態(types)來分類,同一個型態的物件表現出共同的行為(behavior)和共同的狀態(states)。
在物件型態上執行的一組操作(operations)定義物件的行為。例如:你可以對一個文件型態的物件作排版。
具有一組性質(properties)的值定義物件的狀態,這些性質可能是物件本身的屬性(attributes),或是物件與物件之間的關連(relationships)。
ODMG物件模式支援data-valued屬性和object-valued屬性(物件能參考其他物件);只支援binary relationship2。
2.2 型態(Types)
Self types的例子:
interface Person:Object{
unsigned short age();
};
interface Employee:Person{
float salary();
};
Person Jonn;Employee Doe;
...
select John.copy().age();
select Doe.copy().salary();
ODMG Primitive Types:提供ODMG支援資料型態的實作。來自以IDL(Interface definition Language)定義的CORBA(Common Object Request Broker Architecture)標準,這些型態在所有平台都有相同的值域和解釋,但為達到異質性,有些ODMG實作會要求這些型態可以用相同的C++型態來取代。
ODMG Domain Types:ODMG定義一組類別來表示定義域(domain)的抽象。
d_String:用來表示不定長度字串的類別。
d_Interval:用來表示一段持續的時間和支援其他與時間相關類別的數學運算。
d_Date:支援日期的抽象,由年、月、日組成。
d_Time:表示時間。
d_Timestamp:包含日期和時間的元件,提供對它們存取的功能。
2.3 類別(Classes)
在ODMG模式中,類別的使用與在C++模式中大略一致。
ODMG base class:d_Object
ODMG標準規格的類別:Database,Transaction,Persistent_Object,String,Date,Time,Timestamp,Interval,Ref <T>,Ref_Any,Collection <T>,Se t <T>,Bag <T>,List <T>,Varray <T>,Iterator,A_to_B,A_to_Bs,A_to_Bp。
Databases,Transactions,and Exception Handling
ODMG標準有提供單一資料庫存取的規格,在使用資料庫物件之前必須宣告d_Database db,利用open功能來開啟欲要存取的資料庫實例,因為d_Database不是持久的,所以每次交易開始前都要先開啟資料庫。
ODMG d_Transaction類別提供交易的操作。
在ODMG中,例外的處理沿用C++的處理機制。
# include <odmg.h>
d_Database db;
main(int argc, char * argv[ ])
{
int ret;
d_Transaction tx;
try{
db.open(“Personnel”);
tx.begin()
// perform transaction
tx.commit();
db.close();
}
catch(d_Error &err){
cerr << “DB error” << err.get_kind()<< “ ”;
cerr << error.what()<< endl;
ret=-1;
}
catch(exception &e){
cerr <<“unknown exceptionn”;
}
return ret;
}
Instances:因為d_object可以支援persistence(即物件存放在資料庫中),許多時候都會被誤以為所有的實例也會是持久的;實例可以是持久的,也可以是短暫的(transient)。
例:d_Database db;
// creating transient instances
Emoloyee *emp1, *emp2, *emp3;
emp1 = new Employee();
emp2 = new(d_Database::transient_memory, “Employee”)
Empolyee();
// creating persistent instances
Emp3=new(&db, “Employee”)Empolyee();
2.4 Object Identification
建立物件實例之初,資料庫會給予每個物件實例一個唯一的物件識別符(object identifier),用以區分物件之間的差別,但資料庫實行所產生的物件識別僅僅在給定的範圍之內是唯一的,通常是一個資料庫或一組資料庫。ODMG規定單一的資料庫存取只有一個界面,所以物件識別符在資料庫中必須是唯一,但在實行時範圍可以擴大,兩個分離的資料庫環境產生的物件識別符可以有重疊的部分。如果一個物件要參考另外一個物件,它們的物件識別符必須存在於相同的識別符範圍內。
Object Naming
ODMG-93 release 1.2,每個物件只能有單一的名字。
ODMG release 2.0,每個物件可以有多個名字。
Keys
一個物件有一個或多個屬性,以唯一識別實例,這些屬性稱作這物件的鍵(key),使用者以鍵值作為條件存取資料庫的物件。ODMG標準目前沒有提供鍵的存取,但有很多實行支援它
2.5 Collections
Collection是歸類其他物件的一個物件,collection中的成員必須是同一個型態,例如:a set of students,a list of classes。Iterator物件是對collection的元素作iterate,支援向前、向後、和任意存取collection的所有元素。
ODMG在1992年開始訂定物件導向資料庫管理系統上的各項相關標準時,C++還沒有collection這個類別,很多供應商都提供collection類別函式庫,但產業界卻沒有訂定標準,每家物件資料庫供應廠商都有自己專屬的collection類別,ODMG的成員基於個人經驗來定義一組collection類別。1994年,C++標準協會正式通過STL(Standard Template Library),但ODMG巳經發表了ODMG-93 release 1.1規格,所以ODMG的collections跟STL的不同,可是ODMG必須支援Smalltalk和java,意即ODMG collections對這些程式語言必須是普遍的,ODMG C++ interface逐漸支援STL,在ODMG-93 release 1.2中擴充ODMG iterator class,可以支援STL constant bidirectional iterator interface,對於這些擴充,ODMG collections巳經可以使用STL演算法。ODMG release 2.0巳經可以支援很多STL collections。
2.6 Relationships
Unidirectional
d_Ref <T>:表示to-one relationships。
d_Set <d_Ref <T>> & d_List <d_Ref <T>>:表示無序(unordered)和有序(ordered)的to-many relationships。
bidirectional
d_Rel_Ref <T,MT>:表示to-one relationships。
d_Rel_Set <T,MT>:表示無序的to-many relationships。
d_Rel_List <T,MT>:表示有序的to-many relationships。
Object Definition Language
3.1 引言
物件定義語言(Object Definition Language)是一種規格描述語言,用以定義物件型態的界面,使符合ODMG的物件模式。
ODL是定義物件資料庫資料的語言,與應用程式語言無關。
ODL要與OMG CORBA標準的界面定義語言IDL相容。
ODL應該是可以擴充的(extensible),不只是未來的功能,還有實體的最佳化(physical optimizations)也可以擴充的。
ODL應該是實用的,對應用開發者而言是有價值的,當公佈規格後,ODBMS 供應商在短時期內可支援。
傳統DBMS提供的DDL,讓使用者定義資料型態和界面;ODL就像物件型態的DDL,它定義型態的特性(包括性質和操作),但只定義操作的特徵,而不是實行這些操作的方法。延伸自IDL,IDL受C++的影響,因此ODL帶有C++的味道。
優點:可攜性(portability)-為應用系統提供一定程度的獨立,使能因應程式語言和ODBMS的改變。
ODL的目的是定義能夠在各種程式語言上可以實行的物件型態,所以ODL不受特定程式語言文法結構的束縛。
任何依循ODMG標準的ODBMS和混合語言的實作(mixed-language implementations), 都可以使用ODL定義的網要。
3.2 規格(Specification)
<interface_dcl>
::=
Interface <identifier> [<inheritance_spec>]
<type_property_list>
[:<persistence_dcl>]
{[<interface_body>]};
<persistence_dcl>
::=
persistence | transient
型態特性
<inheritance_spec>
::=
<scoped_name>|<scoped_name>,<inheritance_spec>
<type_property_list>
::=
([<extent_spec>][<key_spec>])
<extent_spec>
::=
extent<identifier>
<key_spec>
::=
key[s]<key_list>
<key_list>
::=
<key>|<key>,<key_list>
<key>
::=
<property_name>|(<property_list>)
<property_list>
::=
<property_name>
|<property_name>,<property_list>
<property_name>
::=
<scoped_name>
<scoped_name>
::=
<identifier>
| ::<identifier>
| <scoped_name> :: <identifier>
範例:
interface Professor:Person
( extent professors
keys faculty_id,soc_sec_no):persistent
{
properties
operations
};
實例性質
<interface_body>
::=
<export> | <export><interface_body>
<export>
::=
<type_dcl>;
|<const_dcl>;
|<except_dcl>;
|<attr_dcl>;
|<rel_dcl>;
|<op_dcl>;
屬性
<attrib_dcl >
::=
[readonly] attribute
<domain type> <identifier>
[[<positive_int_const>]]
<domain_type>
::=
<simple_type_spec>
|<struct_type>
|<enum type>
|<attr_collection_specifier><literal>
|<attr_collection_specifier><identifier>
<attrib_collection_specifier>
::=
Set | List | Bag | Array
範例:
interface Professor: Person
( extent professors
keys faculty_id,soc_sec_no): persistent
{
attribute String name;
attribute Unsigned Short faculty_id[6];
attribute Long soc_sec_no[10];
attribute Address address;
attribute Set<string> degrees;
relationships
operations
};
關連
<rel_dcl>
::=
relationship
<target_of_path><identifier>
[inverse<inverse_traversal_path>]
[{order_by<attribute_list>}]
<target_of_path>
::=
<identifier>
|<rel_collection_type><<identifier>>
<inverse_ traversal_path>
::=
<identifier>::<identifier>
<attribute_list>
::=
<scoped_name>
|<scoped_name>,<attribute_list>
範例:
interface Professor: Person
( extent professors
keys faculty_id, soc_sec_no): persistent
{
attributeString name;
attribute Unsigned Short faculty_id[6];
attribute Long soc_sec_no[10];
attribute Address address;
attribute Set<string> degrees;
relationship Set<Student> advises inverse Student::advisor;
relationship Set<TA> teaching_assistants inverse TA::works_for;
relationship Department department inverse Department::faculty;
operations
};
操作
<op_dcl>
::=
[oneway]<op_type_spec><identifier>
<parameter_dcls>[<raises_expr>][<context_expr>]
<op_type_spec>
::=
<simple_type_spec> | void
<parameter_dcls>
::=
([<param_dcl_list>])
<param_dcl_list>
::=
<param_dcl>
| <param_dcl>, <param_dcl_list>
<param_dcl>
::=
<param_attribute><simple_type_spec><declarator>
<param_attribute>
::=
in | out | inout
<raises_expr>
::=
raises(<scoped_name_list>)
<context_expr>
::=
context(<string_literal_list>)
<scoped_name_list>
::=
<scoped_name>
| <scoped_name>,<scoped_name_list>
<string_literal_list>
::=
<string_literal>
|<string_literal_list>,<string_literal_list>
Object Query Language
4.1 OQL的目的
OQL的目的是提供陳述的查詢,存取物件資料庫中的物件,支援物件資料庫中的類別所定義的應用的物件模型。OQL query可以被C++應用程式識別或可以經由一行指令或shell environment提供使用者特別的查詢。
OQL由O2 Technology的Francois Bancilhon,Sophie Cluet和Claude Delobet設計。
是ODMG的標準物件查詢語言。
支援ODMG的物件模式。
是SQL-92的superset。
操作物件模式由application決定。例如:C++ database environment,type system是C++類別。
沒有改變物件的update operators;可以update attributes。
和SQL相容,但亦有提供一些SQL不支援的功能。
功能的查詢語言:允許功能分解,使查詢更有效率。
an
operator
Query
expression
Zero or
more operands of a particular type
return value:可以是任何型態。
strongly typed language
An Example Application(禮物列表管理)
GiftList
1
1 0..1
0..1Gift
next
物件模式由兩部份組成:GiftList(一組人的模型和他們會收到的禮物,包含姓名、預算等)和Gift(包括收禮者的姓名、禮物的描述和價格)。
Require Gift and GiftList to make them persistence-capable
# include <odmg.h> // vendor provide,contains declarations of ODMG classes
class Gift:public d_object{// 只有來自基本類別d_Object的類別才可以持久
friend class GiftList;
friend ostream & operator <<(ostream & , const GiftList &); // output the values of instances
public:
Gift(const char *fn, const char *ln, const char *gift, unsigned long c);
Gift();
friend ostream & operator <<(ostream &, const Gift &);
friend instream & operator >> (istream &, Gift &); // read initialization data
private:
char first_name[16];
char last_name[16];
char gift_descry[30];
unsigned long cost;
d_Ref<Gift> next; // reference the next element on the list
};
class GiftList:public d_object{
public:
GiftList(const char *n, unsigned long b);
~GiftList();
friend ostream & operator <<(ostream &, const GiftList &);
void addGifts(istream &);
private:
char name[20];
unsigned long budget;
d_Ref<Gift> gifts; // 在列表中第一個元素的位置
};
creates a persistent instance of GiftList and gives it a name(使用d_Database & d_Transaction)
# include <odmg.h>
d_Database db;
const char * const db_name=”Gifts”;
int
main(int argc, char *argv[ ])
{
db.open(db_name); // opens the named database
d_Transaction tx;
tx.begin(); // begins a database transaction
char *name = argv [1];
unsigned long budget = atoi(argv[2]);
GiftList *giftlist=new(&db, “GiftList”)GiftList(name, budget);
db.set_object_name(giftlist, name);
tx.commit(); // commits the transaction
db.close(); // closes the database
return 0;
}
access a GiftList instance by name and print it to the standard output stream
# include <odmg.h>
d_Database db;
const char * const db_name=”Gifts”;
int
main(int argc, char *argv[ ])
{
db.open(db_name); // opens the named database
d_Transaction tx;
tx.begin(); // begins a database transaction
char *name = argv [1];
d_Ref <GiftList > giftlist = db.lookup_object(name);
if(giftlist.is_null()){
cerr << “No gift list with the name” ;
cerr << name << endl;
return –1;
}
cout << * giftlist; // subsequent transactions
tx.commit(); // commits the transaction
db.close(); // closes the database
return 0;
}
4.2包含架構(Construction of Collection Literals)
OQL根據ODMG2.0標準,其中包含了四種結構。
4.2.1 Set
Given expressions expr1,expr2,………,exprnof type T , the expression
set(expr1,expr2,………,exprn)
define a set that contains the elements defined by expri expressions.
4.2.2 Bag
Given expressions expr1,expr2,………,exprnof type T , the expression
bag(expr1,expr2,………,exprn)
define a bag that contains the elements defined by expri expressions.
4.2.3 List
Given expressions expr1,expr2,………,exprnof type T , the two expressions
list(expr1,expr2,………,exprn)
(expr1,expr2,………,exprn)
define a list that contains the elements defined by expri expressions.
4.2.4 Array
Given the expressions expr1,expr2,………,exprnof type T , the expression
array(expr1,expr2,………,exprn)
define an array that contains the elements defined by expri expressions.
4.3 語言描述(Language Description)
在本節當中所使用的範例架構來描述於第三章。
4.3.1 查詢(Queries)
一個查詢由定義的查詢運算式集合所組成,此查詢運算式必須為合法之運算式,並且不可為遞迴(一個合法的運算式有可能包含其他運算式而形成遞迴)。
Example:
Define jones as select distinct x from x in Students where x.name=”Jones”;
Select distinct x.student_id from x in jones
這裡定義一個名字為Jones的學生的集合,並取得他們的student_id。
4.3.2 查詢定義運算式(Query Definition Expressions)
假設q 是一個查詢的名字,而e是查詢運算式,則define q as e是一個查詢定義運算式。
Example:
Define Does as select x from x in Student where x.name =”Doe”
這個敘述定義一個名為Does的查詢,他會傳回bag形態包含名字是Doe的所有學生。
4.3.3 基本運算式(Elementary Expressions)
假如x是一個變數,那麼x 是一個運算式。
假如a是一個atom(如數字….),那麼a是一個運算式。
Example:
27
此查詢傳回27。
Example:
nil
此查詢傳回nil。
假如define q as e 是查詢定義運算式,那麼q是一個運算式。
Example:
Does
此查詢傳回名字是Doe的所有學生。
4.3.4 Construction Expressions
4.3.4.1 Constructing Objects
假如t是一個type name,P1,P2,…….,Pn是t的屬性,且e1,……en是運算式,那麼t(P1: e1 ……,Pn: en) 是一個運算式。ei的type必須合適於Pi的type。
假如t 是一個collection 的type name ,e是literal,那麼t(e)是一個collection object。
Example:
Employee(name: “Peter”, boss:Chairman)
此處建立一新的員工叫Peter,而他的上司是Chairman。
4.3.4.2 Constructing Structures
假設P1,P2,…….,Pn是屬性名,且e1,……en是運算式,那麼
struct(P1: e1 ……,Pn: en)
是一個運算式。他定義了一個structure來裝e1,e2……,en的值。
Example:
Struct(name: “Peter”, age: 25);
此敘述傳回一structure包含兩個屬性-name、age,其值分別為Peter 和25。
4.3.4.3 Constructing Sets
假設e1,……en 運算式,那麼set(e1,……en)是一運算式。它定義了一個集合(set)包含元素e1,……en 。它建立一個set的實例(instance)。
Example:
Set(1, 2, 3)
此敘述傳回一集合包含三個元素1, 2, 3。
4.3.4.3 Constructing Lists
假設e1,……en 運算式,那麼list(e1,……en)是一運算式。它定義了一個串列(list)包含元素e1,……en 。
Example:
list(1, 2, 2, 3)
此敘述傳回一list包含四個元素。
4.3.4.5 Constructing Bags
假設e1,……en 運算式,那麼bag(e1,……en)是一運算式。它定義了一個袋子(bag)包含元素e1,……en 。它建立一bag instance。
Example:
bag(1, 1, 2, 2, 3)
此敘述傳回一bag包含五個元素。
4.3.4.5 Constructing Arrays
假設e1,……en 運算式,那麼array(e1,……en)是一運算式。它定義了一個陣列(array)包含元素e1,……en 。它建立一array的instance。
Example:
array(3, 4, 2, 2, 3)
此敘述傳回一array包含五個元素。
4.3.5 算術運算式(Arithmetic Expressions)
假設e是一個運算式,<op>是一個合法的operation 對e來說,那麼<op> e是一個運算式。
Example:
not (true)
傳回false。
假設e1和e2為運算式,<op>是一operation,那麼e1<op>e2為一運算式。
Example:
Count(Stdents) – Count(TA)
傳回學生數量和TA數量的差。
4.3.6 聚集運算式(Collection Expressions)
4.3.6.1 Universal Quantifications
假設x是一個變數名,e1和e2是運算式,那麼
for all x in e1:e2
是運算式。假如對於collection e1所有的元素均滿足e2,則此敘述會傳回true。
Example:
For all x in Students: x.student_id >0
假如所有student_id為正值,則此敘述會傳回true。
4.3.6.2 Existential Quantification
假設x是一個變數名,e1和e2是運算式,那麼
exists x in e1:e2
是運算式。假如對於collection e1所有的元素中至少有一個元素滿足e2條件式,則此敘述會傳回true。
Example:
Exists x in Doe.takes: x.taught_by.name = “Turing”
假如Doe至少有一門課是被Turing教的話會傳回true。
4.3.6.3 Membership Testing
假設e1和e2為運算式,e2是一個collection,e1的type和e2的元素的type相同,那麼e1 in e2是一個運算式。假如e1屬於e2那麼會傳回true。
Example:
Doe in TA
假如Doe是TA,則傳回true。
4.3.6.4 Select From Where
假設e, e’, e1, e2, ….., en 是運算式,且X1, X2,……,Xn是變數名,那麼
select e from X1 in e1, X2 in e2,…..Xn in en where e’
select distinct e from X1 in e1, X2 in e2,…..Xn in en where e’
是運算式。
Example:
Select couple(student: x.name, professor: z.name)
From x in Students,
y in x.takes,
z in y.taught_by
where z.rank = “full professor”
4.3.6.5 Sort-by 操作
假設e, e1, e2, ….., en是運算式,那麼sort x in e by e1, e2, ….., en是運算式。
Example:
Sort x in Persons by x.age, x.name
將Persons用年齡排序之後,再用姓名來排序,傳回list。
4.3.6.6 Unary Set Operators
假設e是一個運算式,它代表了一個聚集(collection),且<op>代表{min,max,count,sum,avg}其中之一,那麼<op>(e)為運算式。
Example:
Max(select x.salary from x in Professors)
這個敘述會傳回Professors中最大的薪資。
4.3.6.7 Group-by
假設e是一個運算式,它代表了一個聚集(collection),P1, P2,…..,Pn是屬性名,e1, e2, ….., en 是x的運算式,P’1, P’2,…..P’m 是屬性名,e’1, e’2,…e’m是運算式對每個分割區(partition)而言,那麼
group x in e by(P1:e1, P2: e2, …, Pn:en)
group x in e by(P1:e1, P2: e2, …, Pn:en) with (P’1:e’1, ……, P’m: e’m)
均是運算式。
對於第一個式子而言,就是將e依照各個條件式,將之分成數個不同的分割區,每個分割區代表一物件的集合。
Example:
group x in Employees
by( low: x.salary < 1000,
medium: x.salary >= 1000 and x.salary < 10000,
high: x.salary >= 10000)
這個傳回一個集合包含三個元素,每一個元素會有一個叫partition的屬性,其表示屬於這個元素分類的employees集合。所以傳回的形態如下:
set<struct(low: boolean, medium: boolean, high: boolean, partition: set<Employee> ) >
第二個運算式而言,主要是加強第一個運算式,能夠對分類後的分割區的結果做運算。
Example:
group e in Employees
by (department: e.deptno)
with (avg_salary: avg(sellect x.salary from x in partition))
這個敘述傳回一個集合:包含部門的編號和這個部門員工薪資的平均。其集合的形態如下:
set<struct(department: integer, avg_salary:float)>
4.3.7 聚集索引運算式(Indexed Collection Expressions)
4.3.7.1 取得第i個元素
假如e1和e2 是運算式,e1是list或array,e2是integer,那麼e1[e2]是運算式。它會取得e1中第e2個元素,注意e1中的元素由0開始算起。
Example:
list(a, b, c, d)[1]
傳回b。
4.3.7.2 取得子集合
假如e1, e2和e3 是運算式,e1是list或array,e2和e3是integer,那麼e1[e2:e3]是運算式。它會取得e1的子集合,從e2位置開始到e3。
Example:
list(a, b, c, d)[1:3]
傳回list(b, c,d)。
4.4 運算元優先順序(Operate Precedence)
Operator(in Order of Precedence) | ||||||
() | [ ] | . | -> | |||
not | -(unary) | +(unary) | ||||
in | ||||||
* | / | mod | intersect | |||
+ | - | union | except | | | | ||
< | > | <= | >= | <some | <any | <all |
= | != | like | ||||
and | exist | for all | ||||
or | ||||||
.. | : | |||||
, | ||||||
(identifier) | ||||||
order by | ||||||
having | ||||||
group by | ||||||
where | ||||||
from | ||||||
select |
第五章ODMG物件導向資料庫的應用
ODMG推出至今已經將近八年,直至2.0版推出後才逐漸成熟,廠商的大量投入也令ODMG成為物件資料庫的主要領導技術,在本章中將介紹目前有哪些軟體廠商已經推出了以ODMG標準為依據的物件資料庫,一旦ODMG的ODBMS成為主流之後,Oracle等大廠應該會跟進才是,以目前的情況看來,Oracle等資料庫廠商仍存觀望態度,甚至提出另一套截然不同的規格。ODMG仍有一場硬戰要打,且看ODMG如何能突破重圍。
5.1 ODMG支援廠商
目前市面上支援ODMG標準的廠商陸續增加,以下是支援廠商與支援內容的列表,我們可以從列表上得知,現行的物件資料庫仍是以國外的廠商為主,這種情況跟關連式資料庫差不多;但我們可以發現其中竟有一套產品是國人自行開發的,名為WOO-DB,在第二節中我們將介紹這套完全支援ODMG標準的物件資料庫:
廠商名稱 | 產品名稱 | 說明 | 備註 |
Computer Associates | Jasmine | Jasmine是一套相單純的物件導向資料庫,它支援ODMG的Java Binding及OQL。 | |
JYD Software Engineering | JYD Object Database | 是一套由Java開發而成的純物件資料庫,提供了多使用者的主從式應用架構,並支援Java Binding及OQL的操作。 | |
Micro Data Base Systems, Inc | TITANIUM | 這是一套專為處理複雜功能而設計的物件資料庫,完全支援ODMG的標準;並提供了多模式的物件分析功能。 | |
Object Design |
| 提供了一連串的物件,來輔助Java與物件資料庫之間的整合,這些物件均由Pure Java寫成。 | |
Objectmatter | BSF | Business Sight Framework ™ (BSF)提供了Java的Framework,允許Java能夠輕易地和後端的物件資料庫作連結。 | |
Objectivity |
| Objectivity DB是一套依循ODMG標準的物件資料庫,目前有Unix及Windows的版本;完全支援C++、Java、Smalltalk語言。 | |
Orient |
| Orient ODBMS支援的平台極多,幾乎市面上所有的作業系統都支援,同時還提供了Enterprise及Just兩個版本,前者提供了複雜的資料儲存引擎,並可以在短時間之內產生極有效率的運算架構。後者則是簡易版,只提供單一使用者使用(支援多執行緒);現在支援的語言只有C++。 | |
POET Software |
| 支援的平台有NT及Unix,語言則有Java及C++。 | |
Sun Microsystems | JavaBlend | Sun提出了JavaBlend的技術,讓程式設計師可以很容易地藉由Java連結到物件資料庫,而目前JavaBlend已經整合至JDK 1.2中,並在Sun與JavaSoft的主導下成為ODMG Java Binding的標準。 | |
Sysra Informatique | EyeDB | 支援的ODMG Binding Language有Java及C++。 | |
Versant Corporation |
| 支援的ODMG Binding Language有Java及C++。 | |
財團法人資訊策進會 | WOO-DB | 具備傳統資料庫管理系統功能,並以物件導向模式儲存管理物件資料。提供操作各種物件的C語言APIs,包括對資料庫、綱目、容器及資料物件的操作。提供符合ODMG標準之C++語言介面,包括定義資料庫的C++ODL、查詢資料的C++OQL及更新資料的C++OML。提供資料庫管理工具,以視覺化方式瀏覽及編輯資料庫的各種物件資料。 |
5.2 WWOO-DB物件導向資料庫
物件導向資料庫具備強大的物件導向模塑能力,可彈性地擴充各種資料型態,適合處理Web上各種複雜的資料,包括WebPage、Image、Graphics等,更是物件導向技術的最佳搭檔。資策會經過四年的研發,發展出主從架構的物件導向資料庫WOO-DB,適合在多彩多姿的網路環境中開發新一代的應用系統。
產品簡介
具備傳統資料庫管理系統功能,並以物件導向模式儲存管理物件資料。
提供操作各種物件的C語言APIs,包括對資料庫、綱目、容器及資料物件的操作。
提供符合ODMG標準之C++語言介面,包括定義資料庫的C++ODL、查詢資料的C++OQL及更新資料的C++OML。
提供資料庫管理工具,以視覺化方式瀏覽及編輯資料庫的各種物件資料。
架構
單機版
Client-Server版
應用程式開發介面C及C++應用程式
C應用程式透過 [C API Interface] 來存取及操作資料庫物件,[C API Interface] 是一個函式庫,提供的函式包含資料庫及交易(Transaction)的管理、類別(Class)的管理、關聯(Relationship)的管理、物件(Object)的管理以及查詢等功能。
而所提供的C++介面遵循國際組織ODMG(Object Database ManagementGroup)所訂定的物件導向資料庫規格,包括ODL(Object Definition Language)、OML(Object ManipulationLanguage)、OQL(Object Query Language)。
肆、管理工具
資料庫綱目擷取器 ( [ODL Schema Capture] )
ODL(Object Definition Language)是ODMG所訂定的一套宣告物件資料庫類別的規格,[ODL Schema Capture]根據ODL檔中的資料庫綱目產一個新的資料庫,並且依據此綱目定義產生C++ Header File與Glue File。
資料庫管理工具 ( [DBM Tool] )
提供類別管理者(Class Manager)關聯管理者(RelationshipManager)、容器管理者(Container Manager)、物件管理者(ObjectManager)等功能,可瀏覽、新增、修改、刪除及查詢資料庫之類別、關聯、容器及物件。
交談式查詢工具 ( [Interactive OQL Tool] )
OQL是一套專為物件資料庫所設計的查詢語言,是由國際組織ODMG所訂定,而[Interactive OQL Tool] 是一個視覺化的資料庫查詢工具,使用者可以透過此工具對物件資料庫下OQL查詢,查詢結果將會以試算表的格式清楚地讓使用者瀏覽。
伍、產品功能與特性
Data Model
Persistent Classes and Structures
Transient Attributes
Pointer and References
Schema Management
Run-time Schema Access
Multiple Inheritance
Application Specific Data Types
Object & Data Management
Composite (Complex) Objects
Binary Large Objects
Object Naming
Navigation
Automatic De-reference of Database Objects
Compiler Independent Generic Binding
Embedded Objects
Object Relationships
Database & Transactions
Multiple Database Connections
Transaction Rollback
Performance Enhance
Flexible Object and Container Level Caching
Class-based and Container-based Clustering
API & Class Libraries
ODMG C++ Binding with Class Library
C Kernel API
ODMG-93 OQL support
Client / Server
Client-server architecture
Multiple client applications served by single database server
Index
Btree
Ehash
Tools
Database Browser, Editor
Query tools
ODL Schema capture
陸、效益
提供了模塑能力強大的資料模式,配合物件分析與設計發展系統又直接又正確,免除了RDB正規化的繁瑣程序。
可處理多樣化的資料型態,並讓使用者自訂資料型態,且可彈性擴充資料型態。
透過物件關連的導引,可大幅提升資料存取與查詢的效能。
所提供的ODMG標準之C++介面,是以C++語法來定義資料庫綱目,資料模式與程式語言完全結合。
系統環境需求
MS Windows 3.1,MS Windows 95,MS Windows NT
Borland C++4.0以上
Visual C++1.5以上(使用C++界面需用VC++ 2.0以上)
PC 386/486以上
主記憶體640K(DOS),4M(Windows)
硬體空間8MB
5.3 WOO-DB功能介紹
隨著資訊發展的日新月異,資料型態的多元化及Web/網際網路的普及化正以旋風般的姿態影響應用系統的發展,新一代的應用系統強調如何透過Web/網際網路,控制運作及展現多樣化的資訊。除了應用系統的需求改變外,技術的發展也逐漸地物件導向化,資料庫管理系統面臨新的挑戰,新一代的資訊系統所需之資料庫不但要能支援各式各樣的資料型態,也必須配合網路環境及物件導向技術的發展。物件導向資料庫具備強大的物件導向模塑能力,可彈性地擴充各種資料型態,適合處理Web上各種複雜的資料,包括WebPage、Image、Graphics等,更是物件導向技術的最佳搭檔。資策會經過四年的研發,發展出主從架構的物件導向資料庫WOO-DB,適合用在多彩多姿的網路環境中開發新一代的應用系統。
5.3.1 分 項 介 紹
物件導向資料庫研發團隊是國內唯一發展物件導向資料庫管理系統的技術團隊,也是世界上少數擁有物件資料庫技術的團隊之一,目前已發展出符合ODMG標準之單機版及主從版的物件導向資料庫管理系統IIIDORADO Beta 1.0,並提供C/C++開發介面,這是一個純正的物件導向資料庫,充分發揮高效率、高彈性的優點。研發之外,同時輔導科學園區著名之電子廠使用IIIDORADO開發測試監控系統,成效顯著,配合著Web應用的普及,也開始應用IIIDORADO於Homepage之建置。本團隊不但開發物件導向資料庫,也同時提供物件導向資料庫應用的服務。除了資料庫核心功能與效能不斷的提昇外,未來將配合網路環境,發展各種領域物件儲存系統,並提供更多元的使用介面,以因應未來應用技術的發展。
5.3.2 產 品 簡 介
WOO-DB是一個純正的物件導向資料庫管理系統,資料的儲存管理均以物件導向模式來描述,透過WOO-DB所提供之C/C++介面,使用者可產生資料庫、定義資料綱目、並對資料物件做各種操作,C的部份提供了各種物件操作的APIs,包括對資料庫、對綱目、對容器及對資料物件的操作,C++的部份則是提供符合ODMG標準之介面,包括定義資料庫之C++ODL,查詢資料的C++OQL,以及更新資料的C++OML,另有交談式的查詢介面,使用者可以使用查詢語言OQL以交談方式察看資料,或試試查詢文句的正確性以減少應用系統開發時的失誤,除了語言介面外,WOO-DB還提供了資料庫管理工具,以視覺化的方式瀏覽及編輯資料庫的各種物件。
WOO-DB的物件導向核心提供了模塑能力強大的資料模式,配合物件分析與設計發展系統又直接又正確,免除了RDB正規化的繁瑣程序,對於複雜資料的描述能力遠超過平版式的表格形式,對管理複雜的資料關係非常合適。使用者自訂型態是物件導向資料庫的另一項特色,它可讓使用者擴充資料型態,處理多樣的資料型態。透過物件關連的導航,在資料的存取與查詢上執行效能可大幅提昇,尤其是複雜的資料物件,物件導向程式語言的資料模式和物件導向資料庫的資料模式是一致的,所以資料模式與程式語言完全結合,開發者無須擔心資料模式轉換的問題,WOO-DB所提供的ODMGC++介面就是以C++的語法來定義資料庫綱目,對原 C++的使用者而言無學習新語言的困擾,更可將原來語言的能力更加擴充。
5.3.3 使 用 介 面 介 紹
使用介面主要分為兩個部分,第一個部分是資料庫的C++使用介面,第二個部分是物件導向資料庫管理工具,分別介紹如下:
C++使用介面
物件導向資料庫WOO-DB提供了一組ODMG-93 C++標準界面,ODMG-93是由ODMG(Object Database ManagementGroup)所提出的一個物件導向資料庫的界面規格,在這個C++界面中包括了物件定義語言(Object DefinitionLanguage;ODL)、物件操作語言(Object Manipulation Language;OML)與物件查詢語言(Object QueryLanguage;OQL)等三個部份。
其中物件定義語言是用來定義物件導向資料庫的綱目,在WOO-DB中提供了一個ODL綱目擷取器的工具處理物件定義語言;物件操作語言是一個類別函式庫,提供資料庫物件的新增、刪除、修改等函式;物件查詢語言也是一個函式庫,提供一組使用介面讓使用者對資料庫的物件作查詢。
在介紹ODL、OML與OQL之前,我們先說明WOO-DB C++界面的整體架構,C++界面的架構如下圖所示:
在C++介面的開發流程中,首先是寫出C++ ODL檔和C++主程式檔(也就是上圖中的兩個立體方塊),其中C++ODL檔是用來定義你所要建構的物件導向資料庫的綱目;至於C++主程式檔則是用來操作你所開發的資料庫。
其次,用“ODL綱目擷取器“來開啟已經編輯好的ODL檔,ODL綱目擷取器會將ODL檔中所定義的資料庫綱目註冊到一個新的資料庫,並且自動產生出“C++標頭檔“及“黏貼檔“(如架構圖中所示)。
最後,將ODL綱目擷取器所產生的C++標頭檔、黏貼檔以及你所編輯的C++主程式檔一起送進C++編譯器編譯,再和OML函式庫與OMS函式庫連結,便能產生可以操作或查詢資料庫的應用程式了!以下將分別介紹ODL、OML及OQL的使用界面。
1. 物件定義語言(ODL)
在物件導向資料庫裡,我們可以利用ODL來描述一個物件資料庫的綱目,這個語言是ODMG-93所定義的標準,它的語法與C++宣告類別的語法類似。在WOO-DB中所有的綱目都是以類別(Class)建構而成,所以ODL檔的內容都是類別的宣告,而且如前所述在語法上和C++十分類似,有屬性與成員函式的宣告。不同的是,在ODL語法中增加了類別之間“關係“(Relationship)的宣告。
C++介面提供了一個ODL開發的工具,稱為ODL綱目擷取器(如下圖)。
使用者可以用這個工具來編輯ODL檔,編輯完成之後再將ODL檔所定義的資料庫綱目註冊到一個資料庫中,並且產生出C++標頭檔(HeaderFile)與黏貼檔(Glue File),使用畫面如下圖所示:
註冊資料庫綱目圖
2. 物件操作語言(OML)
下圖是用C++介面操作資料庫的流程:
資料庫操作流程圖
在這個操作流程中,從交易開始到資料庫操作到關閉資料庫的過程,除了查詢之外都是透過OML來操作,資料庫的查詢將在下面OQL的部份作說明。OML部分是一個類別函式庫(ClassLibrary),包含了ODMG-93標準規格的類別(Database,Transaction,Persistent_Object,String,Date,Time,Timestamp,Interval,Ref<T>,Ref_Any,Collection<T>,Set<T>,Bag<T>,List<T>,Varray<T>,Iterator,A_to_B,A_to_Bs,A_to_Bp)與WOO-DB系統所提供的類別(Container,Blob),因此使用者可以直接在應用程式中使用這些類別來操作資料庫。
3. 物件查詢語言(OQL)
WOO-DB提供了嵌入式查詢語言介面,以讓資料庫應用程式呼叫使用,這查詢介面符合了ODMG-93的嵌入式物件查詢語言(OQL)標準,OQL現在提供了如下六種C++的介面:
int
oql(int& result,
char*
query,...); |
使用者可以利用這個查詢介面來查詢並取出物件導向資料庫中的資料。
物件導向資料庫管理工具(DBM Tool)
DBMTool設計之主要目的是以一視覺化介面來輔助使用者管理其物件資料庫,例如資料庫之產生、連結及類別、容器、關聯、物件之瀏灠、刪除、修改等等,也由於它是一個視覺化的介面,接下來作說明時會以許多的使用畫面來作說明。
DBM Tool內含有四個管理者,它們分別是 : 類別管理者(Class Manager)、關聯管理者(RelationshipManager)、物件管理者(ObjectManager)及容器管理者(ContainerManager)。這些管理者提供使用者創造新物件資料庫、聯結現有物件資料庫,以及管理物件資料庫內資料所需的各種功能;簡言之,它們可以幫助使用者管理及開發複雜的物件資料庫。
當一物件資料庫為DBM Tool所連結之後,使用者可以啟動任何一個管理者來進行管理事宜,DBM Tool啟動後連結物件導向資料庫的的主畫面如下圖:
DBM
Tool主畫面圖
主畫面中的Icon與其執行畫面說明如下: | |
產生一個新的資料庫 | |
開啟一個已存在的資料庫 | |
離開資料庫管理工具 | |
類別管理者(Class Manager) 類別管理者提供使用者對類別做瀏覽、新增、修改與刪除等功能。 | |
關聯管理者(Relationship Manager)關聯管理者提供使用者對類別間的關聯作瀏覽、新增、修改與刪除等功能。 | |
容器管理者(Container Manager) 容器管理者提供使用者對容器做瀏灠、新增與刪除等功能。 | |
物件管理者(Object Manager)物件管理者的主要功能為新增、刪除物件與瀏灠、檢索、修改物件的屬性。 |
5.3.4 核 心 功 能 介 紹
本年度核心系統的設計主要在於DB Client與DB Server此兩個子系統。DB Client端與DB Server所提供的功能是相當類似,DBClient是DB Server的一個subset,不論是提供的服務或處理的資料都是其subset。
此架構的目的為提高系統的效率,DB Client與DB Server工作責任劃分的原則為,應用程式需求的服務,能由Local的DBClient處理完成,就儘量於Local處理,但有些共時處理的問題,及真正資料的讀寫,必需於DB Server端才有辦法處理,此時才由server端處理。
A. DB Client
DB Client位於應用程式所在的Client端,提供資料庫服務之窗口,這些服務包括:
交易的起動﹑確認﹑取消。
資料庫的建立﹑刪除﹑開啟﹑關閉。
物件﹑檔案﹑資料庫的鎖定。
檔案的建立﹑刪除﹑開啟及關閉。
索引的建立﹑刪除﹑開啟及關閉。
物件的建立﹑刪除﹑讀取﹑寫入及查詢。
B. DB Server
DB Server可同時服務多個DB Client,專門負責處理資料庫相關的操作,這些服務包括:
交易的起動﹑確認﹑取消。
資料庫的建立﹑刪除﹑開啟﹑關閉。
物件﹑檔案﹑資料庫的鎖定。
檔案的建立﹑刪除﹑開啟及關閉。
索引的建立﹑刪除﹑開啟及關閉。
物件的查詢。
資料頁的配置﹑刪除﹑讀取﹑寫入。
5.3.5 系 統 各 模 組 功 能 簡 介
DB Client與 DB Server的系統模組架構圖如下:
Client 端 模 組 : |
File Directory Manager(FD)檔案管理者:檔案是系統中建立索引檔及查詢的單位,同一個檔案內可置放不同類別的物件,透過檔案的管理以達到物件叢集的目的。
Disk Manager(IO)磁碟管理者:提供管理實際磁碟空間的配置,及負責從磁碟中讀寫資料。
Object Moudle(OB)物件管理者:提供物件之產生、刪除、讀取、更新等功能。物件包括一般物件及二元大型物件。
Buffer Manager(BF)緩衝區管理者:記錄buffer pool的使用狀況,依據這些資訊安排或釋放buffer pool 的空間,並在資源不足時,處理pages在記憶體以及磁碟機的swapping動作。
Transaction Manager(TM)交易管理者:主要功能為log及lock的管理,為了確保交易的正確性,以交易記錄檔(logfile)來記錄交易中的更動,交易結束後才真正將修改的內容寫入資料庫內,並提功lock manager作concurrency control功能。
Scan Manager(SC)檢索管理者:提供使用者檢索符合指定條件之物件,檢索的對象可為sequential的物件檔或是物件索引檔。
Server 端模組 : |
除了包含上述Client端之功能模組外,還包含:Index Manager(IM)索引管理者:根據某一類別某一欄位值,將該類別之所有物件以不同索引方法收集在一起,儲存在索引檔案中,達到加速物件搜尋的速率。
5.3.6 應用案例(1)- 聯華電子測試監控自動化--提升品質與效率
聯華電子為國內國內製作晶圓的大廠,由於製作的晶圓都必須經過嚴格的測試後才可出貨,所以晶圓測試的效率與品質便非常的重要。有鑑於以往測試結果透過人工方式登錄,容易因人為疏失產生錯誤且無法快速得知結果,所以測試監控自動化便成為唯一的選擇。
本測試監控自動化系統採用物件導向資料庫作為設計基底,包括線上即時監控及工程資料查詢兩大子系統,採用主從式的執行架構,資料庫伺服器採二十四小時執行。本系統不僅可提供二十人以上同時透過網路查詢線上即時的測試資料外,更由於採用資料容器(Container)的技術對資料進行分類,使得執行效率得以提昇。此外由於資料庫架構的設計運用物件關連(Relationship)的技術來描述資料間的關係,使得使用者在查詢資料時可以利用建立的關連迅速的取得相關資料。
5.3.7 應用案例(2)- 服務與選情管理系統--提昇服務品質
民意代表必須處理民眾所委託的請託案件,然而隨著案件的增加,以致案件的尋找及資料的整理日趨複雜,導致工作效率降低。因此必須將處理資料的方式電腦化以提昇效率。
由於本系統各種資料之間的關係相當密切且複雜,採用物件導向資料庫來設計本系統,不僅程式設計師可以很容易地利用物件導向的特性及物件導向資料庫所擁有的物件關連特性來模塑系統架構及資料間的關係,同時設計系統取得資料的方式亦非常直接。如果一次要取得多個相關資料時,可以透過資料間的關連直接取得,不必像關連式資料庫必須做多個表格(Table)的Join後才能得到結果,因此查詢的速度變得非常快速,算是物件導向資料庫最大的受惠者了。
5.3.8 應用案例(3)- 多媒體CAI編輯工具 – 資料與程式的整合
近來,物件導向技術已被公認為解決軟體危機最有效的方法。其中所強調的軟體再用更是提高生產力和品質的利器。CAI系統適合顯現此效果﹐原因在於CAI有明顯的特定領域元件可以萃取﹐如多媒體元件﹑腳本元件和畫面控制元件等﹐然而對於這些元件的儲存管理卻是最大難題﹐若使用一般的檔案系統則會有一大堆的檔案需要管理﹐若使用關聯式資料庫系統則會使效率大打折扣。OODB除了在CAI系統中可當做素材的儲存體,更進一步地將CAI中的所有相關連的步驟、場景、以及每一個元件之event/action作儲存管理,也就是利用OODB不但可管理資料也可管理程式。綜合上述的分析﹐使用OODB是最佳的選擇﹐一來可以將所有的多媒體資料存入資料庫中﹐不會導致一大堆需要維護管理的檔案﹐二來可以提昇執行效率﹐另外將最不容易處理的腳本元件儲存起來﹐並且非常方便的修改腳本﹐創造出另一腳本版本出來﹐這是上述兩種方法無法比較的。當然對於畫面控制元件也是可以加以儲存。所以CAI中所有的元件皆可透過OODB來加以儲存管理﹐以達再用的效果。
5.3.9 後 續 發 展
物件導向資料庫研發團隊將以現有的成果及經驗為基礎,朝向下列目標繼續努力與研發:
物件導向資料庫和新產品精進。
擴大物件導向資料庫於不同領域之合作與應用。
帶動產業拓展國際物件導向資料庫應用之市場。
帶動國內於INTERNET環境上物件導向資料庫之應用與發展。
參考書目
作者 | 書目名稱 | 年份 |
Dr. Dobbs | ODMG 2.0:An Overview | 1997 |
Doug Barry | Speaking of ODMG and Java | 1998 |
Doug Barry | ODMG 2.0:A Standard for Object Storage | 1998 |
Doug Barry | There’s an ODMG Database in your future | 1998 |
David Jordan | C++ Object Databases-Programming with the ODMG Standard | 1998 |
M.Roantree , J.B.Kennedy , P.J.Barclay | Providing views and closure for the object data management group object model | 1999 |
R.G.G Cattell etc. | The Object Database Standard:ODMG-93 Release 1.1 | 1993 |
-