面向对象数据库技术引擎设计

2010-06-01 06:29:10刘海蓉朱永昌胡善岳
张家口职业技术学院学报 2010年4期
关键词:数据库系统字段文件夹

刘海蓉,朱永昌,胡善岳

(1.黄冈职业技术学院,湖北黄冈438002;2.甘肃省金昌市公安局龙首分局武威路派出所,甘肃金昌737100;

1 总体设计

本设计模仿关系数据库中关于模式的定义与划分也分为三个模式:内模式、模式和外模式。内模式主要和底层数据文件打交道,它接受来自模式的命令并执行相关的操作。模式则是连接外模式和内模式之间的桥梁。模式将对来自外模式的指令转译成内模式的执行命令,并组织和返回适当的信息给外模式。模式是数据库引擎中最重要的部分,它包含了主要的操作逻辑和对OQL的编译功能,以及组织数据的功能,是本设计中最复杂的一部分,详情请见具体设计。外模式负责与用户打交道,相当于客户端,但又不是客户端。它实际上接受来自客户端的指令信息经组织后传达给模式。设计上将采用的是网络编程技术和客户端进行信息交流,详情如图1。

图1 系统架构图

2 内模式(底层设计)

本部分用于探讨数据库的物理存取方案,[1]将提供一套接口(见外部接口)用来与模式交互,接受模式发来的指令进行操作。具体逻辑见图2。

图2 内模式时序图

2.1 系统配置设计

(1)系统配置主文件(见表1):这是一张属性表,将包含以下信息(为简易起见,仅包含一些基本信息),在数据库系统安装时进行初始化,数据库系统启动时将其读取到内存中并长久保留。

表1 系统配置表

该配置文件使用的是XML格式来存储,下面是一个简单的样例文件:

520

d4gg542af4f458g4asfsd84sfsa874d1saf5652dfa1af4

E:lujijiangdata

E:lujijiangdata2

(2)库(包)配置文件(见表2):这也是一个属性表,包含的是数据库的ID 、名称、物理存储路径、用户信息、可用空间。每个数据库一个表,也是在系统启动时即初始化到内存中。[2]

表2 库配置表

以下是该配置文件的一个示例:

2.2 模式设计(即类的设计)

每个类其实也是一个XML文件,在每次系统启动时加载到内存中,格式如下(具体标签含义请见格式样例中的注释):

其中的方法(即操作)又链接到方法描述文件。

方法描述文件也是一个XML文件,格式如下(具体标签含义请见格式样例中的注释):

1

函数体描述文件直接就是方法描述,如:

number a = 0;

string b = “123456789”;

return b+a;

2.3 存储设计

(1)包的存储[3]

一个包是一个文件夹,包中根下有一个配置文件package.xml,该文件包含了该包的配置信息,就是上述的库(包)配置文件。除了该文件外,还有各种类的文件夹(下面会提到)。

(2)类的存储

一个类是一个名为*.class的文件夹,就存放在包文件夹的根下。其中*号是该类的标识符。类文件夹的根下有一个类配置文件,就是以上所说的class.xml,可能还有方法描述文件夹*.method。该文件夹根下有一个方法描述文件method.xml,还有方法体描述文件如*.body文件。除此之外,就是该类的各个实例对象文件夹了。

(3)对象的存储

每个对象也是一个文件夹,就存放在类文件夹的根下,命名规则是*.object,其中*表示该对象的标识号。该文件夹的根下是各种字段文件。[4]

(4)字段的存储

字段文件的文件名是*.field,其中*是字段名。

2.4 加载策略

系统采用的是深度遍历树的方式遍历加载数据库信息的,即必须先把一个包中的类的实例全部加载完毕后才可能加载其他的包信息。

系统配置加载:数据库系统启动之初,系统将事先加载系统配置文件,即sys.xml文件,该文件位于源根目录下(Java版本)。通过加载此文件,系统将获知系统的一些属性信息如系统名、端口号、管理员信息以及包的存储路径。

包信息加载:在获取了各包的存储路径后,系统将开始扫描这个包路径。首先先加载包配置文件——即包文件夹根下的package.xml文件,从而获取该包的相关信息,包括包的ID号、包名、用户列表、可用最大空间等。然后扫描该文件夹下所有以“.class”结尾的文件夹,开始加载类的信息。[5]

类信息加载:紧接着上一步,系统开始从类文件夹中加载类的信息。首先读取类文件夹根下的class.xml文件,并获取类的字段,方法等信息。然后开始扫描所有以“.object”结尾的文件夹,开始加载对象信息。

对象信息加载:粗略地将对象的ID信息与地址的对应的信息加载到内存中即完成本次深度遍历加载过程。然后开始加载其它类,其它包的信息。

提供服务:当系统全部加载所有信息后开始提供数据库系统服务。

2.5 外部接口

从模式中获取相关操作信息,然后扫描内存获取数据库系统信息,再根据这些信息进行相关操作,最后将操作的结果返回给模式。

3 模式(中层设计)

3.1 内部接口

本接口主要是用来与内模式打交道的。接口将从管理者那里接受指令并转换为内模式可识别的具体操作,交由内模式处理,然后将结果返回给管理者。

3.2 管理者

在系统启动时便加载了必要的信息并保存在内存中,主要供编译器调用相关信息。

3.3 执行者

相应编译器发来的伪字节码,采用命令模式生成一些调用策略。这里指的是为将编译器发来的具体操作通过反射模式调用Java中的相关类的相关方法执行调用方法,其中还要引用管理者持有的数据库信息资源。

3.4 编译器

编译器是本系统的重头戏,主要包括以下几个功能(编译器的具体设计见系统实现,因为其比较依赖于语言以及技巧):

(1)词法分析器

这是OODB语言语句进入的第一步。首先,识别所有标识符和关键字,将其返回给语法分析器。词法分析器将使用外部描述文件来定义,该文件是一个XML文件,文件示例如下:

(2)语法分析器

检查看有没有缺括号,漏定义等。如果成功,则进入语义分析器。

(3)语义分析器

对照管理者提供的数据库系统信息,看有没有语义错误,没有则进行优化处理。

(4)生成伪字节码

如果以上几关都过了,则生成字节码文件。

3.5 外部接口

用于接收来自外模式的信息(信息仅包含OODB语言程序),然后转发给编译器。

4 外模式(外层设计)

4.1 内部接口

用于将信息转发给模式中的外部接口。

4.2 组织者

获取操作信息,提取信息,包括提取OQL程序、用户名、密码、IP和时间等信息并进行验证,通过则命令内部接口将OQL程序转发给模式,并记录日志。

4.3 接收者

通过Socket接受来自客户端的命令。

5 OODB语言设计

5.1 数据查询(OQL)

作为数据库,最重要的估计是数据查询了,面向对象数据库同样如此。在这里,我设计了以下查询语法:get(…)if(…),其中get里面是要查询的类,类的属性等,相当于SQL里面的select … where …。比如有类A,A中有一个属性a(数字型,关于类型后面再讲)。则获取所有A类实例中所有a的值小于0的实例集合的查询语句是:

get(A)if(A.a<0);

执行该语句应该要返回所有类A实例中所有a小于0的实例集合。具体使用方法如下:

(1)单类查询

即在一个类中进行查询。如:get(A)if(A.a<0);返回的是所有类A实例中所有a小于0的实例集合。而不带条件的查询是get(A);这将返回类A的所有实例。

(2)多类查询

如:get(A,B);将返回类A和类B的所有实例的数据。

(3)方法查询(暂不实现)

(4)表达式计算

如:get(3+3);返回的将是6。

(5)复杂查询

如:get(A.a+B.b,C,C.a/A.a)if(A.a5);这个查询语句将返回的是类A的a字段和类B的b字段的相加之和,类C的实例以及C类字段a与A类字段a的商,并且尽在类A的a字段小于类B的b字段并且(##是并号)类C的字段a的值小于5。此类操作可能比较耗时,并且可能返回重复的数据。如在A类实例和B类实例确定的情况下C类实例变化时将返回多个相同结果的A.a+B.b的值。注意返回的都是集合。

5.2 数据操作(OML)

(1)插入数据:new 类名(构造函数参数列表);这样即生成了一个实例(即插入一个实例)。举例如下:

Test t = new Test(1,2,3);//假如类Test的构造参数是三个数字类型的参数。

(2)更新数据:直接调用该类实例引用的属性复制即可实现更新。举例如下:

t.a = 3;//假如类Test有个公有成员a且是数字型的。

可以有更复杂的、有逻辑的更新,如:

if(Test.a>3){

Test.a = 1;//将所有符合条件的Test类的实例的a字段复制为1,是集合操作。

};

又如:

while(t.a>0){

Test.a --;

//只要实例t的字段a的值还大于0,则所有Test的实例的值继续减一。

}

(3)删除数据:free(类名)if(删除条件表达式)。如果没有if,则删除此类的所有实例。

free(Test)if(Test.a>0);这将删除类Test的实例t。

(4)数据定义(ODL)

定义语言包括类的定义和对象的定义,其语法模仿Java的语法。具体如下:

定义类:

class :定义类,语法如下:class 类名{

属性定义:其中包括变量权限声明,值定义,类型声明,目前仅支持三种类型,字符串型,数字型和比特型。

方法定义:方法定义,跟Java类似,但目前仅留接口,不做实现。

}

下面是一个实例:

class Test{

private num a;//数字型

public str b;//字符串型

protected byte c;//比特型,变长比特型,用来存储大容量数据

public void testMethod(num a){//方法定义,目前暂不实现

a++;

this.a = a;

}

};//一定要加;号,否则不能结束

alter:更新类。语法如下:alter 类名.字段名或者方法名 =

{//字段或者方法的新式描述,如果没有任何信息,则表示删除该字段或者方法};举例如下:

alter Test.a {

public num a;//如果不是命名为a,而是b,则将删除a字段,新建b字段。

}//该语句将把字段a的访问权限从私有变为公有。下面是更新方法:

alter Test. testMethod {

public void testMethod(num a){//方法更新,目前暂不实现

a++;

this.a = a--;

}

};

drop:删除类。此关键字只有一个语法,即:

drop 类名;如:

drop Test;//即表示删除Test类。

(5)数据控制

使用

try{

//行为

}catch(){

}

的语法形式,用来控制事务。在try块中的行为必须全部执行成功数据库才会更改,相当于事务提交。如果发生异常(即不能全部执行成功),则事务回滚。同时还要执行catch块中的信息。一般说来,catch块中留空则只回滚事务。

由于应用的日趋复杂和智能化,面向对象数据库技术可以作为适应这种形势的一种解决方案,有可能成为今后数据库发展的方向。本人由于时间和精力有限,无法完成一个完整的面向对象的数据库系统,所做的仅仅是数据库底层实现和编译器的部分实现。我国目前在数据库系统方面严重依赖于他国,缺少自己成功的作品,需要志同道合者能够相互协作,设计和实现完整的、功能强大的面向对象数据库系统。

参考文献:

[1]Silberschatz A,Korth H F,Sudarshan S.数据库系统概念(第三版).杨冬青,唐世渭 等译[M]. 北京:机械工业出版社,2000.58-69.

[2]ElmasriRA,Navathe S B.数据库系统基础(第三版).邵配英,张坤龙 等译[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.

猜你喜欢
数据库系统字段文件夹
磁力文件夹
图书馆中文图书编目外包数据质量控制分析
数据库系统shell脚本应用
电子测试(2018年14期)2018-09-26 06:04:24
调动右键 解决文件夹管理三大难题
微细铣削工艺数据库系统设计与开发
实时数据库系统数据安全采集方案
电信科学(2016年10期)2016-11-23 05:12:00
核反应堆材料数据库系统及其应用
TC一键直达常用文件夹
电脑迷(2015年1期)2015-04-29 21:24:13
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述