基于schema可变技术的面向对象数据库的设计与实现
2014-11-05李书攀
李书攀
摘 要
面向对象数据库为适应新的数据库应用需要而产生的数据库系统,它将面向对象的方法与数据库技术融合在一起。本文针对在程序开发时,数据库schema经常变动而导致原有存放在数据库中的数据失效,频繁将数据导入导出的问题,构建基于schema可变技术的面向对象数据库,使得数据库在schema变化的过程中,尽可能的保留数据库中存储的原有数据,减少数据库中数据因schema变化而引起的数据丢失问题,提高面向对象数据库的可用性。
【关键词】schema可变 面向对象数据库
面向对象对象数据库是面向对象技术与数据库技术的结合,构成新的数据库领域研究和发展方向,使数据库管理系统能够全面的支持面向对象的模型,使数据库中的数据接近于面向对象程序所定义的语义结构,实现面向对象程序与数据库的无缝衔接,提高数据库模拟和操纵客观对象的能力。同时面向对象数据库面临着与其它数据库相似的问题,如数据库的可扩展性问题、数据库性能提升问题等。
本文针对在开发设计数据库时schema经常变动而导致原有存放在数据库中的数据失效,频繁将数据导入导出的问题,提出一种基于schema可变技术的面向对象数据库,使得数据库能够在schema变动的情况下尽量保证能够继续使用以前的存储的数据而不必重新导入数据,提高数据库的可用性。
1 数据库的概要设计
依据分层设计的思想是将每个模块划分为不同的层次。整个数据库共分为三个层次,从上到下分别是接口层、数据操纵层、数据存储层,结构如如图1所示。
1.1 用户接口层
该层是数据库提供给用户的接口,主要是用于规范客户端程序如何访问数据库的应用接口,其提供了诸如查询和更新数据库中数据的方法。该层主要包含两个部分:
(1)程序接口:增加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作是数据库的最基本的操作,它们主要被用于描述软件系统中持久层的基本操作,同时也是数据库中最为常用的操作。
(2)管理接口:提供数据库的基本方法,如删除schema结构,查看数据库表中数据内容等。
1.2 数据操纵层
该层主要负责对数据库内的对象进行操纵,包括反射Java的类结构、类的schema的存储、索引的维护以及创建等,主要分为以下几个模块:
(1)Reflector:反射(reflector)是Java语言提供的一种动态的获取加载到JVM中的类的方法、属性以及方法和属性上的标注的技术。在schema可变技术的面向对象数据库中,在很多的地方需要借助到Java语言的反射技术,如类结构的解析、schema的检测、实例中数据的获取等。
(2) ClassicMetadata:主要是用来存储解析出来的类的结构,避免对已经解析过的类的结构再次进行解析,管理类的版本以及schema的演化。
(3)Index Query:主要是对索引进行管理。它的功能体现在以下几个方面:①当需要创建索引时,根据创建索引的条件,创建索引;②当查询条件使用到索引时,根据索引的特点以及查询的方式,选择一种最为适合此种查询的索引操作;③当用户插入的数据造成索引的更新时,更新和调整索引等;④对索引的状态进行管理和监控。
1.3 数据存储层
该层主要用于维护已经存储在数据库中的数据,包括类的存储的组织方式,类的索引的结构等。主要分为以下几个模块:
(1)Class Index:由于在面向对象数据库中每个类的实例都是用UUID标识的。根据UUID的重复率低、长度固定、数据结构为string类型的特点,构建索引全部类的实例的数据结构。
(2)Class Field index:由于在每个类中,可以依据每个类的属性,为某个属性建立索引,Classic Field index提供了索引,方便用户快速查询到需要的数据。
(3)ACID transection slot:ACID是指事务的原子性、一致性、独立性及持久性,是数据库必须具备的性质。ACID transection slot就是为了保证ACID在数据库中的实现而设置的。同时它也提供了部分基本的数据结构,为数据的存储提供了可能。
2 schema可变技术的实现
2.1 面向对象数据库中的Schema可变技术
数据库的Schema是对数据模型的实现。Schema表示了数据库的结构或者是数据库中的一个名字空间,包含了一组表结构、视图、和存储过程等对象。在面向对象数据库中,数据库的schema是通过类的结构来表示的,schema的变化可能会导致数据库中存放的原有数据失效或丢失。
Schema可变技术即意味着当数据库的类结构发生变化时,如果该类的部分数据以及数据的限定与上一个版本的类结构中存储的数据以及数据限制兼容时,则上一个版本的类结构存储的数据依然可以在当前的类结构当中使用,不必进行数据库中数据的调整或者更新操作。再该面向对象数据库中,通过建立的类结构与数据库中存储的数据做映射的方式实现schema可变技术,我们使用的映射方法为:将类的名称与版本号相结合的方式——“原类名+版本号”为类命名。
数据库支持schema可变技术可以带来很多的优势:
(1)尽可能的保留已经存储在数据库中的原始数据,使其在schema发生变动时,不丢失数据。
(2)在schema变动时,不必对数据库进行调整或者更新的操作,简化了数据库管理员的工作。
2.2 面向对象数据库中Schema变化的原因
Schema变化是由类结构的变化造成的,类结构变化的原因可分为以下几种:endprint
2.2.1 由于类自身的变化而造成的
(1)增加属性。
(2)减少属性。
(3)改变属性的类型。
(4)改变属性的约束条件。
2.2.2 由于父类的变化而造成的
在面向对象语言中存在继承关系,即子类继承父类中的属性,当该类父类的结构发生改变的时,子类的结构会同时发生改变。
2.3 Schema可变技术的主要流程
在Schema可变的面向对象数据库中,实现schema可变技术的重要操作位主要有三个,分别是是Schema的解析,Schema发生变化后的处理以及如何将Schema中的数据添加到不同版本的类结构中。
2.3.1 Schema的解析流程
Schema的解析是指获取指定类内部的属性以及属性的标识等信息的过程,解析完之后会将解析后的schema信息添加到数据库中。其具体流程如下所示:
(1)将类名加入队列中,并从队列中取出一个类名进行解析,如果该类为object则放弃解析,如果不是object则转到2。
(2)将该类的父类父类添加到队列中。
(3)逐个解析该类的属性。
a. 如果是基本类型,则解析其名称以及约束。
b. 如果不是基本的类型,则解析器名称以及约束,并将该类的名称加入到队列中。
(4)转到1。
2.3.2 Schema变化后的对Schema处理
Schema变化后,数据库能够识别出该schema的变化,然后根据解析出来的类结构,生成新的版本信息,如果该类与数据库中存储的该类以前的版本信息兼容,则生成新的类结构和版本号,具体流程如下所示:
(1)检测该类的结构是否存在,如果存在则不再进行类结构的演化并删除该结构;如果不存在,则转到(2)。
(2)根据兼容性列表(如表1所示),检测该schema中保存的类的结构是否与其它的版本相冲突,如果不冲突,则存储该类的结构,转到(4);如果冲突,则给出冲突的原因、版本号等信息。
(3)根据已经存在的类的结构,生成新的版本号。
2.3.3 Schema变化后对类的处理
当程序进行查询操作时,根据传递过来的客户端的schema信息,查询在服务器端是否已经存储与该Scheme相应的版本,如果不存在,则返回空;如果存在,则依据查询条件进行查询,具体流程如下所示:
(1)从数据库中获取该类的所有数据,如果数据库中所有的类都应解析完毕,则退出解析过程并返回结果;如果还有未解析的类,则取出一个,进行解析。
(2)根据数据库中存储的类中的属性和类的版本信息,逐一解析数据库中存储的类的每个属性,并将值填入查询结果中。
a.在数据库中的类不包含该类属性时,如果该属性允许此值为空,则将该属性设置为null;如果该属性不允许为空,则放弃对数据库中类的解析,转到1。
b. 类中同名属性的类型发生改变,则放弃对数据库中存储的类的解析并转到(1)。
c. 类中属性的标示发生改变,如果兼容则继续解析,如果不兼容,则放弃对数据库中存储的类的解析并转到1。
d. 如果数据库中的类包含该类的属性时,如果兼容则继续解析,如果不兼容,则放弃对数据库中存储的类的解析并转到1。
(3)转到1。
3 系统测试
3.1 面向对象数据的存取
3.1.1 构造POJO类结构
public class Person {
private String name;
private int age;
}
3.1.2将name设置为test,age设置为20,并将该类数据存入数据库中。
3.1.3从数据库中取出数据,name=test,age=20
由此可以说明,数据库能够完成对类结构的解析,并可以取出相应的数据。
3.2 在兼容的情况下schema变更测试
3.2.1更改后的Person类
public class Person {
private String name;
private int age;
private String description;
}
在这里增加一个属性description,它为String类型的,默认的情况下,允许该字段为null,所以属于能够与前边所存储的类的实例相兼容。
3.2.2在服务器端输入命令对版本进行查看,版本信息显示如下内容
V1:Person:Name String,Person:Age Int
V2:Person:Name String,Person:Age Int,Person:description String
3.2.3读取数据,读取结果为:Name=test,Age=20,Description= 。
在这组测试中,可以得出该数据库所提供的schema可变技术是正确的。
3.3 在不兼容情况下schema变更测试
3.3.1更改后的Person类
public class Person {
private String name;
private Age age;
}
在这里将原有的名称为age的属性由int修改为Age类。
3.3.2使用该类添加数据,则返回错误信息
“There is collision on Person:name, please recheck the schema. Collision version V1”
在这组测试中,可以得出该数据库可能够识别不兼容的schema,并提示有冲突的版本。
4 总结
基于schema可变技术的面向对象数据库实现了schema可变技术,使得数据库在schema变化的过程中,尽可能的保留数据库中存储的原有数据,减少数据库中数据因schema变化而引起的数据丢失问题,提高面向对象数据库的可用性。但是其也有部分不足的地方,如不能够很好的支持泛型、对静态变量不能够做到有效的支持、不支持事务等。在以后的工作中,将根据面向对象数据库的发展逐渐的完善该数据库,使其融入新的技术融入更多的技术并且在已有的技术上进行创新。
参考文献
[1]Object database[N/OL].2010.http://en.wikipedia.org/wiki/Object_database.
[2]埃史尔.Java编程思想(第四版)[M].北京:机械工业出版社,2007.
[3]王珊、萨师煊等.数据库系统概论[M]. 北京:教育出版社,2006.
[4]Richardson.POJOs IN ACTION:Developing Enterprise Applications with Lightweight Frameworks[M]. Oreilly & Associates Inc,2007.
作者单位
南阳师范学院计算机与信息技术学院 河南省南阳市 473061endprint
2.2.1 由于类自身的变化而造成的
(1)增加属性。
(2)减少属性。
(3)改变属性的类型。
(4)改变属性的约束条件。
2.2.2 由于父类的变化而造成的
在面向对象语言中存在继承关系,即子类继承父类中的属性,当该类父类的结构发生改变的时,子类的结构会同时发生改变。
2.3 Schema可变技术的主要流程
在Schema可变的面向对象数据库中,实现schema可变技术的重要操作位主要有三个,分别是是Schema的解析,Schema发生变化后的处理以及如何将Schema中的数据添加到不同版本的类结构中。
2.3.1 Schema的解析流程
Schema的解析是指获取指定类内部的属性以及属性的标识等信息的过程,解析完之后会将解析后的schema信息添加到数据库中。其具体流程如下所示:
(1)将类名加入队列中,并从队列中取出一个类名进行解析,如果该类为object则放弃解析,如果不是object则转到2。
(2)将该类的父类父类添加到队列中。
(3)逐个解析该类的属性。
a. 如果是基本类型,则解析其名称以及约束。
b. 如果不是基本的类型,则解析器名称以及约束,并将该类的名称加入到队列中。
(4)转到1。
2.3.2 Schema变化后的对Schema处理
Schema变化后,数据库能够识别出该schema的变化,然后根据解析出来的类结构,生成新的版本信息,如果该类与数据库中存储的该类以前的版本信息兼容,则生成新的类结构和版本号,具体流程如下所示:
(1)检测该类的结构是否存在,如果存在则不再进行类结构的演化并删除该结构;如果不存在,则转到(2)。
(2)根据兼容性列表(如表1所示),检测该schema中保存的类的结构是否与其它的版本相冲突,如果不冲突,则存储该类的结构,转到(4);如果冲突,则给出冲突的原因、版本号等信息。
(3)根据已经存在的类的结构,生成新的版本号。
2.3.3 Schema变化后对类的处理
当程序进行查询操作时,根据传递过来的客户端的schema信息,查询在服务器端是否已经存储与该Scheme相应的版本,如果不存在,则返回空;如果存在,则依据查询条件进行查询,具体流程如下所示:
(1)从数据库中获取该类的所有数据,如果数据库中所有的类都应解析完毕,则退出解析过程并返回结果;如果还有未解析的类,则取出一个,进行解析。
(2)根据数据库中存储的类中的属性和类的版本信息,逐一解析数据库中存储的类的每个属性,并将值填入查询结果中。
a.在数据库中的类不包含该类属性时,如果该属性允许此值为空,则将该属性设置为null;如果该属性不允许为空,则放弃对数据库中类的解析,转到1。
b. 类中同名属性的类型发生改变,则放弃对数据库中存储的类的解析并转到(1)。
c. 类中属性的标示发生改变,如果兼容则继续解析,如果不兼容,则放弃对数据库中存储的类的解析并转到1。
d. 如果数据库中的类包含该类的属性时,如果兼容则继续解析,如果不兼容,则放弃对数据库中存储的类的解析并转到1。
(3)转到1。
3 系统测试
3.1 面向对象数据的存取
3.1.1 构造POJO类结构
public class Person {
private String name;
private int age;
}
3.1.2将name设置为test,age设置为20,并将该类数据存入数据库中。
3.1.3从数据库中取出数据,name=test,age=20
由此可以说明,数据库能够完成对类结构的解析,并可以取出相应的数据。
3.2 在兼容的情况下schema变更测试
3.2.1更改后的Person类
public class Person {
private String name;
private int age;
private String description;
}
在这里增加一个属性description,它为String类型的,默认的情况下,允许该字段为null,所以属于能够与前边所存储的类的实例相兼容。
3.2.2在服务器端输入命令对版本进行查看,版本信息显示如下内容
V1:Person:Name String,Person:Age Int
V2:Person:Name String,Person:Age Int,Person:description String
3.2.3读取数据,读取结果为:Name=test,Age=20,Description= 。
在这组测试中,可以得出该数据库所提供的schema可变技术是正确的。
3.3 在不兼容情况下schema变更测试
3.3.1更改后的Person类
public class Person {
private String name;
private Age age;
}
在这里将原有的名称为age的属性由int修改为Age类。
3.3.2使用该类添加数据,则返回错误信息
“There is collision on Person:name, please recheck the schema. Collision version V1”
在这组测试中,可以得出该数据库可能够识别不兼容的schema,并提示有冲突的版本。
4 总结
基于schema可变技术的面向对象数据库实现了schema可变技术,使得数据库在schema变化的过程中,尽可能的保留数据库中存储的原有数据,减少数据库中数据因schema变化而引起的数据丢失问题,提高面向对象数据库的可用性。但是其也有部分不足的地方,如不能够很好的支持泛型、对静态变量不能够做到有效的支持、不支持事务等。在以后的工作中,将根据面向对象数据库的发展逐渐的完善该数据库,使其融入新的技术融入更多的技术并且在已有的技术上进行创新。
参考文献
[1]Object database[N/OL].2010.http://en.wikipedia.org/wiki/Object_database.
[2]埃史尔.Java编程思想(第四版)[M].北京:机械工业出版社,2007.
[3]王珊、萨师煊等.数据库系统概论[M]. 北京:教育出版社,2006.
[4]Richardson.POJOs IN ACTION:Developing Enterprise Applications with Lightweight Frameworks[M]. Oreilly & Associates Inc,2007.
作者单位
南阳师范学院计算机与信息技术学院 河南省南阳市 473061endprint
2.2.1 由于类自身的变化而造成的
(1)增加属性。
(2)减少属性。
(3)改变属性的类型。
(4)改变属性的约束条件。
2.2.2 由于父类的变化而造成的
在面向对象语言中存在继承关系,即子类继承父类中的属性,当该类父类的结构发生改变的时,子类的结构会同时发生改变。
2.3 Schema可变技术的主要流程
在Schema可变的面向对象数据库中,实现schema可变技术的重要操作位主要有三个,分别是是Schema的解析,Schema发生变化后的处理以及如何将Schema中的数据添加到不同版本的类结构中。
2.3.1 Schema的解析流程
Schema的解析是指获取指定类内部的属性以及属性的标识等信息的过程,解析完之后会将解析后的schema信息添加到数据库中。其具体流程如下所示:
(1)将类名加入队列中,并从队列中取出一个类名进行解析,如果该类为object则放弃解析,如果不是object则转到2。
(2)将该类的父类父类添加到队列中。
(3)逐个解析该类的属性。
a. 如果是基本类型,则解析其名称以及约束。
b. 如果不是基本的类型,则解析器名称以及约束,并将该类的名称加入到队列中。
(4)转到1。
2.3.2 Schema变化后的对Schema处理
Schema变化后,数据库能够识别出该schema的变化,然后根据解析出来的类结构,生成新的版本信息,如果该类与数据库中存储的该类以前的版本信息兼容,则生成新的类结构和版本号,具体流程如下所示:
(1)检测该类的结构是否存在,如果存在则不再进行类结构的演化并删除该结构;如果不存在,则转到(2)。
(2)根据兼容性列表(如表1所示),检测该schema中保存的类的结构是否与其它的版本相冲突,如果不冲突,则存储该类的结构,转到(4);如果冲突,则给出冲突的原因、版本号等信息。
(3)根据已经存在的类的结构,生成新的版本号。
2.3.3 Schema变化后对类的处理
当程序进行查询操作时,根据传递过来的客户端的schema信息,查询在服务器端是否已经存储与该Scheme相应的版本,如果不存在,则返回空;如果存在,则依据查询条件进行查询,具体流程如下所示:
(1)从数据库中获取该类的所有数据,如果数据库中所有的类都应解析完毕,则退出解析过程并返回结果;如果还有未解析的类,则取出一个,进行解析。
(2)根据数据库中存储的类中的属性和类的版本信息,逐一解析数据库中存储的类的每个属性,并将值填入查询结果中。
a.在数据库中的类不包含该类属性时,如果该属性允许此值为空,则将该属性设置为null;如果该属性不允许为空,则放弃对数据库中类的解析,转到1。
b. 类中同名属性的类型发生改变,则放弃对数据库中存储的类的解析并转到(1)。
c. 类中属性的标示发生改变,如果兼容则继续解析,如果不兼容,则放弃对数据库中存储的类的解析并转到1。
d. 如果数据库中的类包含该类的属性时,如果兼容则继续解析,如果不兼容,则放弃对数据库中存储的类的解析并转到1。
(3)转到1。
3 系统测试
3.1 面向对象数据的存取
3.1.1 构造POJO类结构
public class Person {
private String name;
private int age;
}
3.1.2将name设置为test,age设置为20,并将该类数据存入数据库中。
3.1.3从数据库中取出数据,name=test,age=20
由此可以说明,数据库能够完成对类结构的解析,并可以取出相应的数据。
3.2 在兼容的情况下schema变更测试
3.2.1更改后的Person类
public class Person {
private String name;
private int age;
private String description;
}
在这里增加一个属性description,它为String类型的,默认的情况下,允许该字段为null,所以属于能够与前边所存储的类的实例相兼容。
3.2.2在服务器端输入命令对版本进行查看,版本信息显示如下内容
V1:Person:Name String,Person:Age Int
V2:Person:Name String,Person:Age Int,Person:description String
3.2.3读取数据,读取结果为:Name=test,Age=20,Description= 。
在这组测试中,可以得出该数据库所提供的schema可变技术是正确的。
3.3 在不兼容情况下schema变更测试
3.3.1更改后的Person类
public class Person {
private String name;
private Age age;
}
在这里将原有的名称为age的属性由int修改为Age类。
3.3.2使用该类添加数据,则返回错误信息
“There is collision on Person:name, please recheck the schema. Collision version V1”
在这组测试中,可以得出该数据库可能够识别不兼容的schema,并提示有冲突的版本。
4 总结
基于schema可变技术的面向对象数据库实现了schema可变技术,使得数据库在schema变化的过程中,尽可能的保留数据库中存储的原有数据,减少数据库中数据因schema变化而引起的数据丢失问题,提高面向对象数据库的可用性。但是其也有部分不足的地方,如不能够很好的支持泛型、对静态变量不能够做到有效的支持、不支持事务等。在以后的工作中,将根据面向对象数据库的发展逐渐的完善该数据库,使其融入新的技术融入更多的技术并且在已有的技术上进行创新。
参考文献
[1]Object database[N/OL].2010.http://en.wikipedia.org/wiki/Object_database.
[2]埃史尔.Java编程思想(第四版)[M].北京:机械工业出版社,2007.
[3]王珊、萨师煊等.数据库系统概论[M]. 北京:教育出版社,2006.
[4]Richardson.POJOs IN ACTION:Developing Enterprise Applications with Lightweight Frameworks[M]. Oreilly & Associates Inc,2007.
作者单位
南阳师范学院计算机与信息技术学院 河南省南阳市 473061endprint