董张卓,孔永超,雒 宁,赵元鹏
(西安石油大学电子工程学院,陕西 西安 710065)
当今,电力系统仿真软件几乎都采用面向对象的设计方法。面向对象技术能够直观、准确地描述现实世界,它克服了面向过程编程技术中的许多不足,更符合软件开发的规律[1]。CIM(公共信息模型)采用了面向对象的方法来描述电力系统资源,作为一个抽象模型它提供了一种用对象类和属性及它们之间的关系来表示电力系统资源的标准方法[2-4]。采用CIM数据模型从数据层面上保证了电力分析软件的开放性与标准性。在电力系统软件开发过程中,经常需要对对象模型做持久化操作[5]。目前,实现对象持久化的方法主要有2种:(1)用对象数据库来存储对象模型。对象数据库采用与面向对象的方法同样的对象模型来描述复杂对象[6],这样做效率高并且方便。然而,由于其缺乏基本的理论依据,对象数据库的发展还不太成熟,目前仍没有一个完善并且通用的对象数据库能够使用。相比之下,关系数据库的发展已经相当成熟,它不仅具有严格的数学理论依据,特别是集合论,而且具有很强的通用性,是目前市场上的主流数据库[7-8]。关系数据库虽然支持数据的共享与交换,但它仅仅针对的是数据元素的存储,而不能直接存储对象元素[9]。(2)用关系数据库做面向对象的扩展,使之带有面向对象的特征[7,10],将对象模型在关系数据库表现出来。这种方法目前普遍采用,且应用广泛。本文将此方法用于电网分析平台的开发,实现CIM模型在关系数据库中的存储。平台测试结果表明存储方案设计的合理、正确,能够提高电力系统资源对象的存储效率。
在数据访问模型中CIM作为概念模型,为应用逻辑提供服务,而关系模型是数据库中要使用的存储模型,持久管理器封装了这2个模型,它的主要功能是完成对象模型到关系模型的转化[11-13]。要在关系数据库存储CIM对象,则必须解决CIM对象到关系数据库的映射。CIM主要涉及类对象和属性以及他们之间的关系,要将CIM对象存储到关系数据库就必须将各个类中的信息以及类之间的关系完整地映射到数据库中去。然而,关系数据库主要通过表、记录、字段以及主外键来描述实体信息,这就意味着二者之间具有某些共性。具体来说,一个关系数据库中的一张表类似于CIM中的一个类,表中的每列可以看作一个类的属性,表中的每行记录可以视为一个类的具体对象,表与表间的联系可以看成类与类之间的联系。CIM模型与关系模型之间的对应关系可用图1表示。
图1 CIM模型与关系模型对应关系
图1中类与表的对应关系,可用以下程序段来说明:
在关系表中如果将Naming类看做一个实体的话,那么可以将Naming类表示成:
其中“()”里每个元素代表关系表中的一列。
在关系数据库中主键(Primary Key)是唯一能够标识表中记录的元素。一个表只能有一个主键,并且主键不能为null,通常将主键命名为一个列或几个列名的组合。一个表的主键常常与多个表的外键相关联,表间的关系通过主外键建立起来。在面向对象理论中使用唯一标识符来标识对象,称为对象标识符(Object ID,OID)[14-15]。OID 与关系数据库中表的主键相对应。在CIM模型中每个电力系统资源对象都有自己唯一的ResourceID,用它作为区分对象的唯一标识。映射过程中,主键生成的重点是根据每个类的ResourceID在数据表中建立ResourceID字段并将其设置为主键,每个对象的ResourceID属性值就是其所对应记录的ResourceID列的值。Naming实体图如图2所示,它的ResourceID就是NamingID属性。
图2 Naming实体图
CIM域包定义了其他包的所有类的属性类型,域包中的数据类型可分为基本型、枚举型和其他数据类型。基本型派生于整型、浮点型、字符串数据类型。枚举型是一个属性类型的固有属性所有可能值的集合。其他数据类型是由一些基本数据类型复合而成,可认为是部分基本型的集合体。
CIM中基本型的固有属性要么只包含value属性要么包含value和units两个属性,可将基本型描述为:
其中 SimpleType={Integer,Float,String}。
基本型的映射是将每个基本型都映射为包含value和unit两个属性的表,如果某基本型仅包含value属性,那么将其映射的表unit列设为null。如图3和表1所示,基本型CurrentFlow的映射。
图3 CurrentFlow类型定义
表1 CurrentFlow类型映射表
域包中的枚举型只指明了它们的固有属性,而没有指明固有属性所属的类型。为了将枚举型映射到关系数据库,需要给每一个枚举型建立一张表,表中存放Int型固有属性ID编号和与之对应的String型属性名。当某个表中的某个字段类型是枚举型时,可将其定义为Int型,然后存放此枚举型的属性ID号,最后将用到该字段的表与枚举型表之间建立多对一的关联。以日类型名称类(DayTypeName)为例,其映射如表2所示,它有3个枚举值,分别是 weekday、weekend、holiday。
表2 DayTypeName映射表
CIM中的其他数据类型,是基本类型和枚举类型的复合体。对其他数据类型的映射可以看作类之间聚集关系的映射,这在1.4.3节详细说明。
一个属性可以映射到关系数据库里的零个或多个字段,很多情况下为一个字段,除非一个类作为另一个类的属性。
CIM类图之间的关系主要包括继承、关联和聚合,而关系数据库并不支持对象之间的关系存储,因此,如何在关系数据库中表达CIM类之间的关联关系是映射研究的一个重点。
1.4.1 继承关系的映射
继承是指一个普遍的类与一个具体的类之间的一种关系。继承关系的映射从根本上可以理解为“如何在关系数据库中组织继承的属性”[16-17]。映射策略是为每一个具体的非虚子类建立一张表。父类只作为公共属性的载体不参与映射,每个具体的非虚子类都继承了父类所有属性,包括父类的ID。图4显示了Equipment类和PowerTransformer类之间继承的关系,Equipment是抽象父类,PowerTransformer是具体子类。表3是对图4继承关系的映射。
图4 继承类图
表3 Power Transformer类映射表
1.4.2 关联关系的映射
CIM中关联关系是类与类之间的一种静态关系。根据关联关系的多重性,可以将关联关系分为3种:零或一对一、一对多和多对多。SQL Server数据库中对关联关系的映射是通过设置主外键来完成的。一张表可以有一个或多个外键,但每个外键所对应的主键只能有一个。关联关系中一对零或一与一对多的映射是将多重性为一的表的主键字段作为其他表的外键字段来实现,若2个表是一对一关联,则取其中任一表的主键作为另一个表的外键来存储。以电压控制区类(VoltageControlZone)和母线段类(Busbar-Section)为例,图5展示了二者之间的关联关系,表4和表5给出了2个类图关联关系的映射。
图5 零或一对一的关联类图
表4 VoltageControlZone类映射表
表5 Busbar Section类映射表
对于类之间多对多的关联,则需另外建立一张关联表,该表有自己的OID,表中其他字段是具有关联关系的两个或多个表的OID。以保护设备类(ProtectionEquipment)和导电设备类(ConductingEquipment)为例来说明,图6展示了这2个类之间的多对多的关系,表6~表8给出了2个类之间的关联过程。
图6 多对多关联类图
表6 ConductingEquipment类映射表
表7 ProtectionEquipment类映射表
表8 ConductProtectAssociation关联表
1.4.3 聚集关系的映射
聚集是关联关系的一种特殊情况,它表示了类之间整体与部分的关系,与继承不同的是,部分类不从整体类那里继承属性。聚集关系的映射处理是在整体类表中增加相应部分类的字段但不包含部分类的OID,同时在部分类表中增加整体类的OID,这样就在关系表中实现了整体与部分之间的关系。以拓扑岛类(TopologicalIsland)和拓扑节点类(Topological-Node)为例,图7展示了拓扑岛类与拓扑节点类之间的聚集关系,表9和表10给出了2个类之间的聚集关系的映射表。
图7 聚集关系类图
表9 TopologicalIsland类映射表
表10 TopologicalNode类映射表
为了解释本文提出的CIM模型到关系数据库的映射方法,本算例采用CIM中的拓扑包来进行分析说明。
图8 拓扑包主框图
图8所示的框图中类之间关系主要有继承、关联和聚集。例如EquipmentContainer类从PowerSystem-Resource类继承;EquipmentContainer类与ConnectivityNode类之间的1对多关联;TopologicalNode类聚集成TopologicalIsland类。
对于以上3种具体关系,采用本文映射方法,用DDL语言在SQL Server 2005数据库中实现其存储。过程如下:
EquipmentContainer类从 PowerSystemResource类的继承关系实现:
EquipmentContainer类与 ConnectivityNode类之间1对多的关联关系实现:
TopologicalNode类与TopologicalIsland类的聚集关系实现:
在电力软件的开发过程中,需要频繁地在关系数据库中操作对象数据。为了提高数据的存储效率,本文先对CIM模型和关系模型做了分析对比,然后结合SQL Server 2005数据库的优势,提出了一种CIM模型到关系数据库的存储方案,并将此方法用在了电网分析平台中历史库与实时库的同步上,可实现历史库与实时库的相互导入。
本文所提出的方法还有待扩展,以使其适用于任何对象模型向关系模型的转化。
[1] 朱玲,薛贺.对象关系数据库系统映射模型及应用[J].计算机工程与科学,2007,29(12):120-122.
[2] IEC 61970-301,EMSAPI-Part 301:Common Information Model(CIM)Base[S].
[3] 薛艳芳,吴健.基于CIM的内存实时数据库的设计[J].计算机工程与设计,2007,28(14):3508-3510.
[4] 高鸣明.一种对象模型与关系模型的映射方法[J].科技促进发展,2010(2):153-154.
[5] 黄晓明.基于关系数据库的持久化技术研究[J].科技创新导报,2008(27):40.
[6] 卢彩霞.基于IEC61970系列标准的数据库接口的研究[D].北京:中国电力科学研究院,2003.
[7] 尹善华.对象模式与关系数据模式的映射研究[D].长沙:中南大学,2007.
[8] 吕威.对象模型、关系模型与对象关系映射技术[J].信息通信,2012(6):87.
[9] 麻淑芳,闫占强.对象关系模在综合测评系统中的映射与研究[J].计算机光盘软件与应用,2010(15):49.
[10]王成良,杨祥陵.对象模型向关系数据库模式映射的策略及应用[J].计算机工程,2004,30(1):155-157.
[11]马鹏烜.基于Entity Framework数据持久化技术浅析[J].电脑与信息技术,2011,19(4):63-64.
[12] Roger Jennings.Professional ADO.NET 3.5 with LINQ and Entity Framework[M].Wiley Publishing,2009.
[13] Scott WAmbler.The Design of a Robust Persistence Framework for Relational Databases[EB/OL].http://www.ambysoft.com/downloads/persistenceLayer.pdf,2005-06-21.
[14] Scott WAmbler.Mapping Objects to Relational Databases:O/R Mapping in Detail[EB/OL].http://www.agiledata.org/essays/mappingObjects.html,2013-06-07.
[15]刘金,徐苏,冯豫华.基于Hibernate的J2EE数据持久层的设计与实现[J].计算机与现代化,2007(3):64-66.
[16]Keller W.Mapping Objects to Tables:A Pattern Language[EB/OL].http://www.objectarchitects.de/ObjectArchitects/papers/Published/ZippedPapers/mappings04.pdf,2005-05-01.
[17]兰伟,万权性.对象关系映射中类的继承映射分析与实现[J].软件导刊,2011,10(9):75-76.