劉海蓉,朱永昌,胡善岳
(1.黃岡職業(yè)技術(shù)學(xué)院,湖北黃岡438002;2.甘肅省金昌市公安局龍首分局武威路派出所,甘肅金昌737100;
本設(shè)計(jì)模仿關(guān)系數(shù)據(jù)庫(kù)中關(guān)于模式的定義與劃分也分為三個(gè)模式:內(nèi)模式、模式和外模式。內(nèi)模式主要和底層數(shù)據(jù)文件打交道,它接受來(lái)自模式的命令并執(zhí)行相關(guān)的操作。模式則是連接外模式和內(nèi)模式之間的橋梁。模式將對(duì)來(lái)自外模式的指令轉(zhuǎn)譯成內(nèi)模式的執(zhí)行命令,并組織和返回適當(dāng)?shù)男畔⒔o外模式。模式是數(shù)據(jù)庫(kù)引擎中最重要的部分,它包含了主要的操作邏輯和對(duì)OQL的編譯功能,以及組織數(shù)據(jù)的功能,是本設(shè)計(jì)中最復(fù)雜的一部分,詳情請(qǐng)見(jiàn)具體設(shè)計(jì)。外模式負(fù)責(zé)與用戶打交道,相當(dāng)于客戶端,但又不是客戶端。它實(shí)際上接受來(lái)自客戶端的指令信息經(jīng)組織后傳達(dá)給模式。設(shè)計(jì)上將采用的是網(wǎng)絡(luò)編程技術(shù)和客戶端進(jìn)行信息交流,詳情如圖1。
圖1 系統(tǒng)架構(gòu)圖
本部分用于探討數(shù)據(jù)庫(kù)的物理存取方案,[1]將提供一套接口(見(jiàn)外部接口)用來(lái)與模式交互,接受模式發(fā)來(lái)的指令進(jìn)行操作。具體邏輯見(jiàn)圖2。
圖2 內(nèi)模式時(shí)序圖
(1)系統(tǒng)配置主文件(見(jiàn)表1):這是一張屬性表,將包含以下信息(為簡(jiǎn)易起見(jiàn),僅包含一些基本信息),在數(shù)據(jù)庫(kù)系統(tǒng)安裝時(shí)進(jìn)行初始化,數(shù)據(jù)庫(kù)系統(tǒng)啟動(dòng)時(shí)將其讀取到內(nèi)存中并長(zhǎng)久保留。
表1 系統(tǒng)配置表
該配置文件使用的是XML格式來(lái)存儲(chǔ),下面是一個(gè)簡(jiǎn)單的樣例文件:
(2)庫(kù)(包)配置文件(見(jiàn)表2):這也是一個(gè)屬性表,包含的是數(shù)據(jù)庫(kù)的ID 、名稱、物理存儲(chǔ)路徑、用戶信息、可用空間。每個(gè)數(shù)據(jù)庫(kù)一個(gè)表,也是在系統(tǒng)啟動(dòng)時(shí)即初始化到內(nèi)存中。[2]
表2 庫(kù)配置表
以下是該配置文件的一個(gè)示例:
每個(gè)類其實(shí)也是一個(gè)XML文件,在每次系統(tǒng)啟動(dòng)時(shí)加載到內(nèi)存中,格式如下(具體標(biāo)簽含義請(qǐng)見(jiàn)格式樣例中的注釋):
其中的方法(即操作)又鏈接到方法描述文件。
方法描述文件也是一個(gè)XML文件,格式如下(具體標(biāo)簽含義請(qǐng)見(jiàn)格式樣例中的注釋):
函數(shù)體描述文件直接就是方法描述,如:
number a = 0;
string b = “123456789”;
return b+a;
(1)包的存儲(chǔ)[3]
一個(gè)包是一個(gè)文件夾,包中根下有一個(gè)配置文件package.xml,該文件包含了該包的配置信息,就是上述的庫(kù)(包)配置文件。除了該文件外,還有各種類的文件夾(下面會(huì)提到)。
(2)類的存儲(chǔ)
一個(gè)類是一個(gè)名為*.class的文件夾,就存放在包文件夾的根下。其中*號(hào)是該類的標(biāo)識(shí)符。類文件夾的根下有一個(gè)類配置文件,就是以上所說(shuō)的class.xml,可能還有方法描述文件夾*.method。該文件夾根下有一個(gè)方法描述文件method.xml,還有方法體描述文件如*.body文件。除此之外,就是該類的各個(gè)實(shí)例對(duì)象文件夾了。
(3)對(duì)象的存儲(chǔ)
每個(gè)對(duì)象也是一個(gè)文件夾,就存放在類文件夾的根下,命名規(guī)則是*.object,其中*表示該對(duì)象的標(biāo)識(shí)號(hào)。該文件夾的根下是各種字段文件。[4]
(4)字段的存儲(chǔ)
字段文件的文件名是*.field,其中*是字段名。
系統(tǒng)采用的是深度遍歷樹(shù)的方式遍歷加載數(shù)據(jù)庫(kù)信息的,即必須先把一個(gè)包中的類的實(shí)例全部加載完畢后才可能加載其他的包信息。
系統(tǒng)配置加載:數(shù)據(jù)庫(kù)系統(tǒng)啟動(dòng)之初,系統(tǒng)將事先加載系統(tǒng)配置文件,即sys.xml文件,該文件位于源根目錄下(Java版本)。通過(guò)加載此文件,系統(tǒng)將獲知系統(tǒng)的一些屬性信息如系統(tǒng)名、端口號(hào)、管理員信息以及包的存儲(chǔ)路徑。
包信息加載:在獲取了各包的存儲(chǔ)路徑后,系統(tǒng)將開(kāi)始掃描這個(gè)包路徑。首先先加載包配置文件——即包文件夾根下的package.xml文件,從而獲取該包的相關(guān)信息,包括包的ID號(hào)、包名、用戶列表、可用最大空間等。然后掃描該文件夾下所有以“.class”結(jié)尾的文件夾,開(kāi)始加載類的信息。[5]
類信息加載:緊接著上一步,系統(tǒng)開(kāi)始從類文件夾中加載類的信息。首先讀取類文件夾根下的class.xml文件,并獲取類的字段,方法等信息。然后開(kāi)始掃描所有以“.object”結(jié)尾的文件夾,開(kāi)始加載對(duì)象信息。
對(duì)象信息加載:粗略地將對(duì)象的ID信息與地址的對(duì)應(yīng)的信息加載到內(nèi)存中即完成本次深度遍歷加載過(guò)程。然后開(kāi)始加載其它類,其它包的信息。
提供服務(wù):當(dāng)系統(tǒng)全部加載所有信息后開(kāi)始提供數(shù)據(jù)庫(kù)系統(tǒng)服務(wù)。
從模式中獲取相關(guān)操作信息,然后掃描內(nèi)存獲取數(shù)據(jù)庫(kù)系統(tǒng)信息,再根據(jù)這些信息進(jìn)行相關(guān)操作,最后將操作的結(jié)果返回給模式。
本接口主要是用來(lái)與內(nèi)模式打交道的。接口將從管理者那里接受指令并轉(zhuǎn)換為內(nèi)模式可識(shí)別的具體操作,交由內(nèi)模式處理,然后將結(jié)果返回給管理者。
在系統(tǒng)啟動(dòng)時(shí)便加載了必要的信息并保存在內(nèi)存中,主要供編譯器調(diào)用相關(guān)信息。
相應(yīng)編譯器發(fā)來(lái)的偽字節(jié)碼,采用命令模式生成一些調(diào)用策略。這里指的是為將編譯器發(fā)來(lái)的具體操作通過(guò)反射模式調(diào)用Java中的相關(guān)類的相關(guān)方法執(zhí)行調(diào)用方法,其中還要引用管理者持有的數(shù)據(jù)庫(kù)信息資源。
編譯器是本系統(tǒng)的重頭戲,主要包括以下幾個(gè)功能(編譯器的具體設(shè)計(jì)見(jiàn)系統(tǒng)實(shí)現(xiàn),因?yàn)槠浔容^依賴于語(yǔ)言以及技巧):
(1)詞法分析器
這是OODB語(yǔ)言語(yǔ)句進(jìn)入的第一步。首先,識(shí)別所有標(biāo)識(shí)符和關(guān)鍵字,將其返回給語(yǔ)法分析器。詞法分析器將使用外部描述文件來(lái)定義,該文件是一個(gè)XML文件,文件示例如下:
…
(2)語(yǔ)法分析器
檢查看有沒(méi)有缺括號(hào),漏定義等。如果成功,則進(jìn)入語(yǔ)義分析器。
(3)語(yǔ)義分析器
對(duì)照管理者提供的數(shù)據(jù)庫(kù)系統(tǒng)信息,看有沒(méi)有語(yǔ)義錯(cuò)誤,沒(méi)有則進(jìn)行優(yōu)化處理。
(4)生成偽字節(jié)碼
如果以上幾關(guān)都過(guò)了,則生成字節(jié)碼文件。
用于接收來(lái)自外模式的信息(信息僅包含OODB語(yǔ)言程序),然后轉(zhuǎn)發(fā)給編譯器。
用于將信息轉(zhuǎn)發(fā)給模式中的外部接口。
獲取操作信息,提取信息,包括提取OQL程序、用戶名、密碼、IP和時(shí)間等信息并進(jìn)行驗(yàn)證,通過(guò)則命令內(nèi)部接口將OQL程序轉(zhuǎn)發(fā)給模式,并記錄日志。
通過(guò)Socket接受來(lái)自客戶端的命令。
作為數(shù)據(jù)庫(kù),最重要的估計(jì)是數(shù)據(jù)查詢了,面向?qū)ο髷?shù)據(jù)庫(kù)同樣如此。在這里,我設(shè)計(jì)了以下查詢語(yǔ)法:get(…)if(…),其中g(shù)et里面是要查詢的類,類的屬性等,相當(dāng)于SQL里面的select … where …。比如有類A,A中有一個(gè)屬性a(數(shù)字型,關(guān)于類型后面再講)。則獲取所有A類實(shí)例中所有a的值小于0的實(shí)例集合的查詢語(yǔ)句是:
get(A)if(A.a<0);
執(zhí)行該語(yǔ)句應(yīng)該要返回所有類A實(shí)例中所有a小于0的實(shí)例集合。具體使用方法如下:
(1)單類查詢
即在一個(gè)類中進(jìn)行查詢。如:get(A)if(A.a<0);返回的是所有類A實(shí)例中所有a小于0的實(shí)例集合。而不帶條件的查詢是get(A);這將返回類A的所有實(shí)例。
(2)多類查詢
如:get(A,B);將返回類A和類B的所有實(shí)例的數(shù)據(jù)。
(3)方法查詢(暫不實(shí)現(xiàn))
(4)表達(dá)式計(jì)算
如:get(3+3);返回的將是6。
(5)復(fù)雜查詢
如:get(A.a+B.b,C,C.a/A.a)if(A.a
(1)插入數(shù)據(jù):new 類名(構(gòu)造函數(shù)參數(shù)列表);這樣即生成了一個(gè)實(shí)例(即插入一個(gè)實(shí)例)。舉例如下:
Test t = new Test(1,2,3);//假如類Test的構(gòu)造參數(shù)是三個(gè)數(shù)字類型的參數(shù)。
(2)更新數(shù)據(jù):直接調(diào)用該類實(shí)例引用的屬性復(fù)制即可實(shí)現(xiàn)更新。舉例如下:
t.a(chǎn) = 3;//假如類Test有個(gè)公有成員a且是數(shù)字型的。
可以有更復(fù)雜的、有邏輯的更新,如:
if(Test.a>3){
Test.a = 1;//將所有符合條件的Test類的實(shí)例的a字段復(fù)制為1,是集合操作。
};
又如:
while(t.a>0){
Test.a --;
//只要實(shí)例t的字段a的值還大于0,則所有Test的實(shí)例的值繼續(xù)減一。
}
(3)刪除數(shù)據(jù):free(類名)if(刪除條件表達(dá)式)。如果沒(méi)有if,則刪除此類的所有實(shí)例。
free(Test)if(Test.a>0);這將刪除類Test的實(shí)例t。
(4)數(shù)據(jù)定義(ODL)
定義語(yǔ)言包括類的定義和對(duì)象的定義,其語(yǔ)法模仿Java的語(yǔ)法。具體如下:
定義類:
class :定義類,語(yǔ)法如下:class 類名{
屬性定義:其中包括變量權(quán)限聲明,值定義,類型聲明,目前僅支持三種類型,字符串型,數(shù)字型和比特型。
方法定義:方法定義,跟Java類似,但目前僅留接口,不做實(shí)現(xiàn)。
}
下面是一個(gè)實(shí)例:
class Test{
private num a;//數(shù)字型
public str b;//字符串型
protected byte c;//比特型,變長(zhǎng)比特型,用來(lái)存儲(chǔ)大容量數(shù)據(jù)
public void testMethod(num a){//方法定義,目前暫不實(shí)現(xiàn)
a++;
this.a = a;
}
};//一定要加;號(hào),否則不能結(jié)束
alter:更新類。語(yǔ)法如下:alter 類名.字段名或者方法名 =
{//字段或者方法的新式描述,如果沒(méi)有任何信息,則表示刪除該字段或者方法};舉例如下:
alter Test.a {
public num a;//如果不是命名為a,而是b,則將刪除a字段,新建b字段。
}//該語(yǔ)句將把字段a的訪問(wèn)權(quán)限從私有變?yōu)楣小O旅媸歉路椒ǎ?/p>
alter Test. testMethod {
public void testMethod(num a){//方法更新,目前暫不實(shí)現(xiàn)
a++;
this.a = a--;
}
};
drop:刪除類。此關(guān)鍵字只有一個(gè)語(yǔ)法,即:
drop 類名;如:
drop Test;//即表示刪除Test類。
(5)數(shù)據(jù)控制
使用
try{
//行為
}catch(){
}
的語(yǔ)法形式,用來(lái)控制事務(wù)。在try塊中的行為必須全部執(zhí)行成功數(shù)據(jù)庫(kù)才會(huì)更改,相當(dāng)于事務(wù)提交。如果發(fā)生異常(即不能全部執(zhí)行成功),則事務(wù)回滾。同時(shí)還要執(zhí)行catch塊中的信息。一般說(shuō)來(lái),catch塊中留空則只回滾事務(wù)。
由于應(yīng)用的日趨復(fù)雜和智能化,面向?qū)ο髷?shù)據(jù)庫(kù)技術(shù)可以作為適應(yīng)這種形勢(shì)的一種解決方案,有可能成為今后數(shù)據(jù)庫(kù)發(fā)展的方向。本人由于時(shí)間和精力有限,無(wú)法完成一個(gè)完整的面向?qū)ο蟮臄?shù)據(jù)庫(kù)系統(tǒng),所做的僅僅是數(shù)據(jù)庫(kù)底層實(shí)現(xiàn)和編譯器的部分實(shí)現(xiàn)。我國(guó)目前在數(shù)據(jù)庫(kù)系統(tǒng)方面嚴(yán)重依賴于他國(guó),缺少自己成功的作品,需要志同道合者能夠相互協(xié)作,設(shè)計(jì)和實(shí)現(xiàn)完整的、功能強(qiáng)大的面向?qū)ο髷?shù)據(jù)庫(kù)系統(tǒng)。
參考文獻(xiàn):
[1]Silberschatz A,Korth H F,Sudarshan S.數(shù)據(jù)庫(kù)系統(tǒng)概念(第三版).楊冬青,唐世渭 等譯[M]. 北京:機(jī)械工業(yè)出版社,2000.58-69.
[2]ElmasriRA,Navathe S B.數(shù)據(jù)庫(kù)系統(tǒng)基礎(chǔ)(第三版).邵配英,張坤龍 等譯[M]. 北京:人民郵電出版社,2002.220-247.
[3]Dittrich K(Editor).Advances in Object-Oriented Database Systems.Lecture Nodes in Computer Science 334,Springer-Verlag,1988.
[4]KimW.Introduction to Object-Oriented Databases.MITPress,Cambridge,1990.223-289.
[5]Maier D,Stein J.Indexing in an Object-Oriented DBMS.Proceedings of the International Workshop on Object-Oriented Database Systems,1986.