首页 理论教育分布式数据库技术实施样例

分布式数据库技术实施样例

【摘要】:在图15.4中,元类PG_METACLASS是将POSTGRES关系和属性映射到VML类、性质与方法。图15.4POSTGRES数据库到元类模型的正向映射类里的每个实例对应于关系里的某个元组。由图15.4可知,POSTGRES数据库中的关系Conference映射到类CONFERENCE,同样,可以生成类SESSION和TUTORIAL。图15.5从POSTGRES数据库到元类模型的映射(详)显然这个类型的定义是普适的,描述了如何与基础数据库的连接。

VML是一个灵活开放的数据模型,在元层提供了一些建模原语,如aggregation、specialization、generalization、grouping和part-of等,可以从默认的元类来定义。

VODAK是在关系型数据库系统POSTGRES[11]上构建的,因此下面会多次涉及POSTGRES。

下面以定义一个会议管理系统为例。在图15.4中,元类PG_METACLASS是将POSTGRES关系和属性映射到VML类、性质与方法。类似地,元类SYBASE_METACLASS是将Sybase关系型数据库的关系映射成类[12]。由于PG_METACLASS是一种从关系向对象的直接映射,所以对象的公共行为和结构代表关系里的元组。元类PG_METACLASS提供的公共行为和结构的例子可以简述为:直接映射中定义的存取方法get发送给代表关系R的类的实例。这些实例必须知道它们其原来的关系R,即关系标识必须存放在这些实例里。

图15.4 POSTGRES数据库到元类模型的正向映射

类里的每个实例对应于关系里的某个元组。因此,每个实例要有某种性质,必须对应于某种存取方法,指定、检索关系元组里的键值。除此之外,还必须定义能检索特定元组的值的方法。

数据库设计者可以使用元类的功能定义和关系对应的类,如Conference、Tutorial和Session等。

为了保证这些类和相应的关系真实对应,将PG_METACLASS定义为它们的元类,并进行一定的初始化

如果需要另一类映射,则必须引入另一个元类,如元类PG_RECOMPOSE_METACLASS。

图15.4的下部是一个POSTGRES数据库,描述的是会议管理系统的信息。关系Conference的实例记录的是一个会议信息,会议标识记为OODB06,假设是2006年的面向对象数据库系统会议。这里讨论的是如何将POSTGRES的关系模式映射成面向对象模式。图的上部是由VODAK定义的面向对象模型。

由图15.4可知,POSTGRES数据库中的关系Conference映射到类CONFERENCE,同样,可以生成类SESSION和TUTORIAL。这三个类的共性可以抽象为一个元类PG_METACLASS。类似地,Sybase系统存放的数据映射到元类SYBASE_METACLASS。除数据外,还有应用,在关系型系统中,这是和数据分开的,面向对象系统中,一切归结到对象,所以也要映射到类。图的左部就反映了这一内容。元类Kernl Application Class就用于描述它。例如,某个个人Smith映射到类PERSON,PERSON和其他相关类就映射成Kernl Application Class。METACLASS就作为这些元类的元类。

1.VML中映射的实现

下面对元类与类进行定义,先定义元类PG_METACLASS。

1)元类PG_METACLASS

PG_METACLASS用于实现关系和类间的直接映射,这里表示POSTGRES里的关系如何映射为类。图15.5描述了元类PG_METACLASS与其他应用类之间的关系。

2)元类PG_METACLASS的定义

POSTGRES数据库的存取可以通过其自身类型(own type)、实例类型(instance type)和实例-实例类型(instance-instance type)中的方法来实现。在VODAK系统中,PG_METACLASS则是借助POSTGRES C库函数实现的。

元类PG_METACLASS及其相关的对象类型可以定义如下:

CLASS PG_METACLASS METACLASS Metac lass

OWNTYPE PG_Metac l ass_OwnType

INSTTYPE PG_Metac lass_Inst Type

INSTINSTTYPE PG_Metac l ass_Ins t Ins t Type

END;

如图15.5所示,假设POSTGRES数据库中有大会(conference)、会议(session)和时间(tutorial)三个基本关系,它们在面向对象模式中就映射到类CONFERENCE。OODB06就成了这个类的一个实例。

3)对象类型PG_Metaclass_Own Type的定义

下面是元类PG_METACLASS的对象类型的定义,其中方法linkdb和unlinkdb负责启动和终止与POSTGRES数据库的通信

图15.5 从POSTGRES数据库到元类模型的映射(详)

(www.chuimin.cn)

显然这个类型的定义是普适的,描述了如何与基础数据库(POSTGRES数据库)的连接。

4)对象类型PG_Metaclass_Inst Type的定义

与类对应的关系标识存放在该类的性质relation里。方法get Rel正好用于返回这个性质的值。方法init为性质relation的参数赋值,从对应关系里找出属性oid的所有实际值,为每个值创建类的一个实例,同时把这个值存放在新实例的性质PG_Oid里,以便能进一步存取非键属性。

5)对象类型PG_Metaclass_InstInst Type的定义

元类PG_METACLASS的实例-实例类型定义了性质PG_Oid,方法setPG_Oid、get PG_Oid和get Value对存取定义为PG_METACLASS的应用类实例是有用的。与该实例对应的元组的属性oid的值存放在性质PG_Oid里。方法setPG_Oid和get PG_Oid存储和返回性质PG_Oid的值。方法get Value(att:STRING):STRING用于检索和消息接收对象的类对应关系的属性的每个值。get Value使用存放在信息受体对应元组的标识,以确定数据库中的元组是否正确。

2.直接映射的例子

假设有一个POSTGRES关系(这里的例子选择为conference,其键值为conf_id):

con ference(con f_id,t i t l e,topi cs,l ocat ion,durat ion,l anguage)

因为是一个关于会议信息的关系,因此其属性包括会议标识(conf_id)、名称(title)、主题(topics)、会议地点(location)、会议时间(duration)、会议语言(language)。

现在定义一个类CONFERENCE,PG_METACLASS作为其元类。类CONFERENCE的实例的结构和行为用一个对象类型conference_Inst Type来描述。PG_METACLASS提供的方法init用于表示从关系conference到类CONFERENCE的映射。

如果需要应用域,则可以对关系conference中指定的每个属性定义一个性质。这里选用性质title、location和language,它们对应关系里相应的属性。采用同样的方式通过conference_Inst Type的超类可以定义性质conf_id、topics和duration。这些属性可能定义在数据库其他关系里,通过这种继承,可以避免重复定义。

检索性质值(就是检索POSTGRES数据库的属性值)的方法的全部实现按相同模式实现:首先测试要检索的性质是否已经从POSTGRES数据库里检索出来,若没有,则使用超类PG_METACLASS提供的方法get Value从下位POSTGRES数据库里将值检索出来。这个方法实际上生成一条POSTGRES检索语句,从数据库中获得数据再返回值。[13]

元类PG_RECOMPOSE_METACLASS的实例-实例类型(instance-instance type)是PG_Metaclass_InstInst Type的一个子型,所以方法get Value(att:STRING):STRING及其机制是继承而来的。类型PG_RECOMPOSE_InstInst Type提供三个方法,它们是两个通用方法get Value和get OID的特指。方法get Value(rel:STRING,joinatt:{STRING},att:{STRING}):{||STRING©STRING||}通过接收对象里的关系指针rel将相关属性集成在属性joinatt里并重新合成复杂值。这里定义一个称为dictionary的概念,这些值以dictionary集合的方式返回。dictionary代表任意的元组结构。

若我们想把这些关系转换成面向对象形式,则必须重组成类。

属性conf_id是关系conference的主键,也是其他关系的外键。因此conference是基关系,而conf_info_address、session和lectures非基关系。从映射得来的类CONF_EVENT的实例与conference的元组对应。conference和conf_info_address的属性建模为单值属性,因为它们在关系里是键。相比之下,conf_id只是关系session和lectures里键属性集里的一部分,所以不具有唯一性。更进一步,关系session的键属性sess_id是关系lectures的外键,所以session里的元组可以与lectures里的几个元组对应,session和lectures的元组会组合成一种嵌套元组的复杂集合性质。

关系hotel是一个基关系,其中不包含外键,它可以简单地映射成一个类HOTEL。关系reservation代表conference和hotel间的一种联系。

类CONF_EVENT和HOTEL及它们的实例类型CONF_EVENT_Inst Type和HOTEL_Inst Type的定义如下[14]

CLASS CONF_EVENT METACLASS PG_RECOMPOSE_METACLASS INSTTYPE CONF_EVENT_Ins t Type

INIT CONF_EVENT→ini t('conf erence')

关于VML的详细内容请读者查阅相关文献,如参考文献[6]和参考文献[7]。