覃嗣凤,顾 平,张 超
(广西大学计算机与电子信息学院,广西 南宁 530004)
随着软件应用规模和复杂度不断扩大,生产效率低、可移植性差和系统维护更新跟不上软件技术发展等问题逐渐突显出来[1]。在此背景下,OMG(Object Management Group,对象管理组织)提出了一种全新的以模型为中心的软件开发方法MDA(Model Driven Architecture)。MDA 以模型为中心,主要定义了3 种模型[2]:计算无关模型(Computation Independent Model,CIM)、平台无关模型(Platform Independent Model,PIM)、平台相关模型(Platform Specific Model,PSM)。MDA 的主要思想是以模型作为整个软件开发过程的核心,不同开发阶段使用不同抽象层次的模型对系统进行分析,旨在降低系统中业务与技术的耦合,提高系统的可移植性和可维护性[3]。
MDA 方法提出后,人们根据模型驱动思想,由需求分析模型开始,逐步得到设计模型,最后自动生成数据库模型,以降低人为原因而导致数据库系统与需求的差异。目前,已有很多关系数据库模型自动生成方法的研究,如参考文献[4-7]等,它们的基本思想是:首先建立与平台无关的UML 类图PIM 模型,然后定义类图PIM 模型到关系型数据库PSM 模型的转换规则,将类图PIM 转换成关系型PSM,最后生成数据库实现代码。
HBase 数据库是当下应用广泛且非常适合大数据处理的非关系型数据库,HBase 数据库依托于谷歌Hadoop 集群,具有高性能、高可靠性、高可扩展性和灵活的数据模型等优点。由于HBase 自身的巨大优势,越来越多的Web 应用开始尝试在其上构建数据中心,传统关系型数据库到HBase 数据库的迁移以及HBase 数据模型的设计等都成为了比较热门的研究问题。
本文以MDA 方法为思想,以UML 类图模型为基础,研究HBase 数据模型的自动生成方法,让数据库设计人员从手工的设计中解脱出来,更专注需求分析,从而得到HBase 数据模型。这种建模方法不易产生设计人员与客户之间对数据库理解上的差异,并且为NoSQL 数据模型的自动化开发提供了一个启发式的方案。
HBase[8]是一个稀疏的、分布式的、持久化的多维有序映射,是目前比较流行的NoSQL 数据库。HBase 是一种专门为半结构化数据和水平可扩展性设计的数据库。类似于关系型数据库,HBase 使用表作为顶级结构来存储数据。
HBase 模式里的逻辑实体概括在HBase 表里,数据按行存储,行由行健RowKey 唯一标识,RowKey 按照字典序进行排序。HBase 表中,行里的数据按照列簇ColumnFamily 分组归类,一张表中至少有一个列簇。一个列簇下包含若干属性相关并且访问模式相似的列Column。RowKey、ColumnFamily 和Column 一起确定一个数据单元Cell,存储在单元里的数据称为单元值Value,即应用系统需要持久化的数据。单元值没有数据类型,视为字节数组。存储在HBase 数据库里的数据单元有时间版本,时间版本用时间戳TimeStamp 标识。HBase 逻辑数据模型如图1 所示。
图1 HBase 逻辑数据模型
目前,MDA 还处于发展阶段,模型转换方法也有很多种,例如手动转换方法、基于规则的转换方法[9]、基于关系代数的转换方法[10]和基于元模型映射的转换方法[11]等。本文使用基于元模型的转换方法实现UML 类图到HBase 数据模型的自动转换。
基于元模型的转换方法以元对象设施[12](Meta Object Facility,MOF)为基础。MOF 是OMG 的一个标准,是为了统一各种建模结构而诞生的。MOF 框架共分为4 层,从上到下称为:M3 层(元元模型层)、M2 层(元模型层)、M1 层(模型层)、M0 层(实例层)。基于元模型的模型转换方法的基本思想是:以M2 层元模型间元素的映射作为转换规则,通过实现M2 层元模型间的转换来实现M1 层模型的转换,即模型转换规则是在M2 层的元模型间定义的,而实际的转换却发生在M1 层。
ATL[13]是Atlas 转换语言的简称,是ATLAS 研究组为回应OMG 的MOF/QVT 提案而创立的模型转换语言。ATL 模型转换框架是一种基于元模型映射方法的具体实现,ATL 属于开源的项目,其模型转换的层次结构如图2 所示[14]。
图2 ATL 模型转换框架
图2 中Ma、Mb对应MOF 框架的模型层M1,MMa、MMb对应元模型层M2,MMM 属于元元模型层M3。其中,Ma是源模型,而Mb是目标模型,Ma、Mb分别符合其元模型MMa、MMb。同时MMa和MMb都符合唯一的元元模型MMM。Mt是一个模型转换实例,它符合模型转换的元模型MMt,MMt也符合元元模型MMM。
在ATL 框架中,唯一的元模型是Ecore,相当于MOF。MMa和MMb是由Ecore 创建的元模型。Ma和Mb是符合这些元模型的模型实例。MMt已经由ATL定义,Mt则是需要自行编写的模型转换程序。所以,一个完整的ATL 模型转换框架需要4 个部分:源元模型MMa、目标元模型MMb、源模型Ma和模型转换程序Mt。生成目标模型Mb。
在本文中,UML 类图和HBase 数据模型是一个具体的模型,对应于ATL 模型转换框架中的Ma和Mb,要实现基于元模型的UML 类图到HBase 的转换,首先要构建类图元模型MMa和HBase 元模型MMb,然后设计源元模型各元素到目标元模型各元素的模型转换规则Mt,最后以此转换规则实现具体的UML 类图到HBase 数据模型的转换。
类图[15]是描述类、接口、协作以及它们之间关系的图,在软件结构设计阶段,类图是不可或缺的模型。在数据库的设计过程中,人们常用类图作为数据库设计的蓝图,即用类图为数据库建立逻辑数据模型。本文主要研究需要持久化的实体类及实体类之间的关系,实体类之间的关系主要有普通关联关系、泛化关系、聚合关系和组合关系等。本文类图元模型如图3所示。
图3 类图元模型
从类图元模型可知:UML 类图中的任何一个元素都是ModelElement,并且有一个name;DataType 是UML 类图原始数据类型;Class 代表类,Class 中包含一个实体类标识符persistentTag,Class 中有多个Attribute,还可以有多个父类parent;Attribute 是类的属性,由类识别属性标识符OIDTag、列簇标识符colFamilyTag、多值属性标识符multiValueTag 等组成,Attribute 有type 类型,type 可以是DataType 类型或者Class 类型;Association 是类之间的关联关系,由关联的多重性、组合关系标识符isComposition 组成,Association 有关联源端sourceClass 和目标端targetClass。
以上是本文建立的UML 类图元模型,本文定义的任何类图模型都必须满足这些规则。在ATL 模型转换框架中,需要用Ecore 来定义元模型,Ecore 元模型最终以XMI 格式存储。根据它的语法,将图3 定义的类图元模型转换为XMI 文件,文件名称为“UMLClass”,文件内容片段如图4 所示。
图4 类图元模型XMI 文件内容
ATL 模型转换框架中,还需要定义目标元模型MMb,即HBase 数据库元模型。由上文的介绍可知,HBase 数据模型中主要包含5 个元素:HTable、RowKey、TimeStamp、ColumnFamily、Column。其中时间戳TimeStamp 只是一种时间维度,是为保留同一种数据多个时间版本而进行的数据库设置,因此HBase数据库模式的设计可以不用考虑这一项。HBase 数据库元模型如图5 所示:HBase 由HTable 组成,HTable 由一个行健RowKey、一到多个列簇Column-Family 组成,而每一个列簇ColumnFamily 下有多个列Column。HBase 模型中所有的模型元素定义了name属性。
图5 HBase 数据库元模型
HBase 数据库元模型相对应的XMI 文件内容片段如图6 所示,文件名为“HBase”。
图6 HBase 元模型XMI 文件内容
由于需求在不断地变化,源模型也会相应发生改变,因此有必要在UML 类图模型和HBase 数据库模型之间建立映射规则,当需求发生变更时,仅需要对源模型进行修改,即可自动生成新的数据库目标模型。在HBase 数据库中,实体的容器是表,表中的每行代表实体的一个实例,故可以将实体类转换成HBase 数据库中的表,具体的转换规则由下文给出。
2.4.1 基本转换
1)类数据类型的转换:UML 类图元模型中的DataType 代表了在类图中所定义的基本数据类型,由于HBase 中的数据是没有数据类型的,所有的数据都以字节数组的方式存储,所以不用考虑类图数据类型到HBase 数据类型的转换。
2)类的转换:将类映射为HBase 中的表时,需要对类之间的继承关系进行分析处理。由于HBase 数据库面向列存储的特点,可以将超类的属性下移,即每个子类对应的数据库表中既包含该子类的属性,也包含该子类所继承的属性。一般情况下,并不是所有的类都需要持久化到数据库的,只有实体类才需要持久化。因此,在类中添加persistenceTag 标识符,persistenceTag 为true 则该类为需要持久化的类,将该类转换为HBase 数据库中的表,类名转换成表名。
3)类识别属性的转换:类的识别属性可以唯一地精确识别出类的一个实例(也就是表中的一行),故将类中的识别属性映射为HBase 表的行健RowKey。一个类经常由多个属性识别出来,则将多个识别属性拼接起来,成为HBase 中的RowKey。
4)类非识别属性的转换:类中的普通属性是用来描述类的基本特征的,可以将所有基本数据类型的非识别属性映射为HBase 表中的列Column。属性之间的相关性(即属性被同时访问的可能性)使用标识符ColFamilyTag 标记,ColFamilyTag 将列划分为不同列簇下的列,列簇名为ColFamilyTag 的值。对于如Address 等多值类型的属性,由于HBase 数据库不像传统关系型数据库那样有范式约束,故可以将Address 的属性展开,分别转换为同一列簇下的不同列。
基本转换如图7 所示:User 类中,识别属性user_name 转换为行健RowKey;User 表中user_email、user_add 等基本用户信息因为访问模式相似,被一起访问到的概率大,所以被划分到同一列簇user_Infor 下面,user_password 因为被单独访问的机会更多,划分给另一列簇user_Acc。由于HBase 是无数据类型数据库,所以这里不用考虑数据类型之间的转换。
图7 基本转换
2.4.2 关联关系的转换
关联的多重性可以分为一对一关联、一对多关联、多对多关联3 种。在传统关系数据库模式设计当中,为了减少数据冗余和使数据库结构更加合理,人们总结出多种规范的关系数据库设计模式,如第一范式、第二范式、第三范式和BCNF 范式等。这些规范将一对一关联、一对多关联建模为外键,而将多对多关联建模为连接表,以使2 张表产生联系。而像HBase、MongoDB 等NoSQL 数据库是数据模式非常灵活的数据库,而且没有外键约束和表间的连接操作。为了设计出最能满足实际情况的数据库,往往会违反范式的约束将数据进行反规范化处理,从而提高数据库的性能。
1)普通关联关系的转换:通常情况下,HBase 中的表可以设计为高表和宽表2 类[16]。前者指表中列少而行多的情况,后者指列多而行少的情况。在一对一或一对多联系中,可以把表设计成高表形式,即由一方的识别属性和另一方的识别属性组合成为行健。组合行健的设计使应用程序可以根据组合行健中的字段来使2 张表产生联系。对于多对多关联,可以把表设计成宽表形式,即为每一边的表都新建一个列簇,列簇中的列存放对方的行关键字,以此来关联2 张表。一对多和多对多关系的转换如图8、图9 所示。
图8 一对多关系的转换
图9 多对多关系的转换
2)聚合关系的映射:聚合是整体/部分关系的一种,其中整体端由多个部分端组成,聚合关系转换到HBase 模型时可以采用与普通关联关系相同的转换方法。
3)组合关系的映射:组合关系是一种很强形式的聚合。因为组合关系中整体与部分之间紧密相连的关系,以及HBase 面向列存储和不支持表间连接操作等特点,可以将组合关系中的部分端内嵌到整体端中去,即在生成的整体表中新建一个列簇存放部分端中所有属性转换成的列,因为部分端只能被一个整体端共享,所以部分端不需要单独建表。组合关系的转换如图10 所示。
图10 组合关系的转换
2.4.3 模型转换规则的代码生成
本文采用ATL 模型转换语言对以上的模型转换思想进行描述,得到转换规则代码。在ATL 模型转换代码中,定义了多个helper 方法,用于完成某项特定的功能,并返回一些属性或者值。代码中还定义了模型转换匹配规则UMLClass2HBase,在元模型层次上,将类模型中每一个模型元素转换为相应的HBase数据模型元素。由于篇幅所限,这里仅给出模型转换的代码片段。
下面通过一个博客系统来验证本文提出的转换方法的可行性。博客系统主要类图模型如图11 所示,该模型完全符合上文定义的类图元模型。
图11 博客系统类图模型
从图11 可知,该博客系统共有6 个类,类之间的关系主要包含了泛化关系、一对一关联、一对多关联和多对多关联。在建立了MMa、MMb、Mt和Ma之后,运行ATL 模型转换代码,自动生成XMI 文件格式描述的HBase 数据模型。该XMI 文件部分内容如下:
本文探讨了在MDA 架构下建立HBase 数据模型的方法,分析了在元模型的基础上UML 类图模型与HBase 数据库模型之间的转换关系,并使用ATL模型转换语言对转换规则进行代码级的描述,实现UML 类图到HBase 数据库模型的自动转换。由于该方法不是针对某一个特定的模型,所以对于符合本文元模型的模型,转换规则仍具有可重用性。本文提出的元模型比较简单,下一步的工作需要考虑更多复杂的模型,完善模型间的转换关系,进一步提高模型转换的准确性和完整性。
[1]周吉.支持MDA 的设计模式建模与模型转换研究[D].重庆:重庆大学,2012.
[2]Kleppe A,Warmer J,Bast W.MDA Explained:The Practice and Promise of the Model Driven Architecture[M].USA:Addison-Wesley Professional,2003:1-31.
[3]张博,李亚芬,王普.基于Atlas 语言的数据库模型转换方法的研究[J].计算机工程与设计,2013,34(2):507-514.
[4]郑娟,冯书兴,张立兵.基于MDA 数据库开发方法研究[J].计算机仿真,2007,24(10):115-118.
[5]雷超阳,钟一青,周训斌.基于UML 的数据库建模技术研究[J].计算机应用,2008,27(9):33-36.
[6]曾一,王健,洪媛,等.一种支持MDA 的UML 类图到RDB 模型的转换方法[J].计算机工程与科学,2010,34(2):67-70.
[7]熊信富.基于UML 的关系数据库建模研究与实现[D].成都:电子科技大学,2011.
[8]Nick Dimiduk,Amandeep Khurana.HBase 实战[M].谢磊,译.北京:人民邮电出版社,2013.
[9]张征,何克清,刘进.一种基于规则的模型转换方法[J].计算机应用研究,2005,22(10):16-19.
[10]蒋璐.基于MDA 的UML 模型转换[D].西安:西安电子科技大学,2009.
[11]Tihomir Calic.Exploration of model driven architecture capabilities via comparative utilization of MDA tools[D].Reno:University of Nevada,2006.
[12]David S Frankel.Model Driven Architecture:Applying MDA to Enterprise Computing[M].New Jesey:John Wiley & Sons,Inc.,2003:95-109.
[13]The Eclipse Foundation.ATL/Uer Manual/Overview of the Atlas Transformation Language[EB/OL].http://wiki.eclipse.org/ATL/User_Manual/Overview_of_the_Atlas_Transformation_Language,2007-09-19.
[14]The Eclipse Foundation.ATL/Concepts[EB/OL].http://wiki.eclipse.org/ATL/Concepts,2009-01-09.
[15]王先国.UML 统一建模实用教程[M].北京:清华大学出版社,2010:28-30.
[16]Lars George.HBase 权威指南[M].代志远,译.南京:东南大学出版社,2012:339-341.