首页> 中国专利> 电力实时数据库模型数据导出至关系数据库的映射方法

电力实时数据库模型数据导出至关系数据库的映射方法

摘要

本发明公开了一种电力市场实时数据库模型数据导出至关系数据库的映射存储方法。针对电力市场高性能的计算需求,出清计算需要依赖存取计算性能高效的实时库、而web展示则需要数据存储在关系库中,这时就需要一种实时库导出至关系库的映射存储方法,将实时库中的电力市场模型映射入关系库中;同时实时库中的电力市场模型相对复杂,存在一对多、多对多、一对一的各种关联关系,而关系库中仅存在外键这一种方式来表达层级关系,该方法还能够将实时库的各种层次关系在关系库中准确地表达出来。

著录项

说明书

技术领域

本发明涉及一种电力市场实时数据库模型数据导出至关系数据库的映射存储方法,属于电力市场领域。

背景技术

在电力市场的环境下,必须在存取计算性能高效的实时库中进行各种计算以满足电力市场快速计算的需求,而将计算结果存入商用库中方便进行web展示,这时就需要一套将实时库中电力市场模型数据导出至商用库的机制。实时库中有一对多、多对多、一对一的各种关联关系来表达对象之间的层次关系,而关系数据库只能使用外键来表达表之间的层次关系,那么这套实时库导出至商用库的机制就需要解决这个问题,这里进行说明:

实时库中主要有纵向的1:n关系、横向的单向/双向1:1关系、和横向1:n关系。纵向1:n关系:比如一个厂站(Substation)下有500kV/220kV/110kV三个电压等级(VoltageLevel),且厂站删除那么电压等级也应会删除,即电压等级和厂站是共生的;单向1:1关系:比如一个遥测点(AnalogInput)关联的是某个一次设备的测点P(Analog);双向1:1关系:双向1:1关系可以用两个单向1:1来实现,方便从一方找到另一方;横向1:n关系:比如电气设备经常有1-3个端点,端点(Terminal)本质上是属于电气设备的,和电气设备之间是纵向1:n关系,设备没了端点自然没了。但是我们经常用连接点(ConnectivityNode)来表达设备之间的连接关系,多个端点连在一起就形成一个连接点,我们可以认为连接点和端点之间就是横向的1:n的关系,即使连接点因为端点不连在一起而消失了,端点照样存在于物理设备上,所以这里连接点和端点之间是横向1:n的关联关系,并无纵向1:n的上下级所属关系。

而关系库中只有外键这一个方式来表达父子的层次关系,对应到上文的例子中:对于纵向1:n关系,厂站和电压等级为父子关系;对于单向1:1关系:即测点与遥测点为父子关系;对于双向1:1关系:两方互为父子关系;对于横向1:n关系:连接点与端点互为父子关系。这里映射到关系库的方法就是,在子表中把父表的主键作为子表的外键加入子表的字段中。

所以这里发明的实时库导出至商用库的映射机制就需要把实时库中复杂的关联关系的数据导出至商用库,并且只使用商用库的外键来表达实时库的各种关联关系。

发明内容

针对电力市场复杂的数据计算必须依赖实时库,而web展示必须使用关系库的情况,并且实时库有丰富的一对多、多对多、一对一的关联关系,而关系库只能使用外键来表达关联关系的情况,需要一种实时库导出至关系库的方法,能够在保证实时库层次关系的情况下将数据导出至关系库。

为了实现上述目的,本发明是通过如下技术方案实现的。

(1)从第一配置文件获取实时库需要导出的表的表名、需要导出至关系库的字段、导出至关系库作为主键的字段、导出至关系库需要更改名称的字段;

(2)将第一配置文件中需要导出表的相关信息存储到面向对象的数据结构中;

(3)从第二配置文件获取实时数据库需要导出的表的父表与原表的关系、需要导出的表的父表对应关系数据库中作为主键的字段、需要导出的表的父表对应关系库中需要更改名称的字段;

(4)将第二配置文件中需要导出表的所有父表相关信息存储到面向对象的数据结构中;

(5)根据存入数据结构中的导出表以及导出表父表的信息,将数据导出至关系库。

步骤(1)中,根据第一配置文件,获取需要导出的实时库表名以及该表中需要导出至商用库的字段、作为主键的字段、需要改名的字段。

第一配置文件写法这里做出说明:

其中,"[TABLE_FIELD]"作为第一配置文件的一项标签,其下方的文字均代表所需导出的表的信息。

“实时库表名”需要和实时库中需要导出的表名一致;

第一个“[]”中的内容代表实时库中的该表需要导出的字段,如,“*”代表需要导出所有字段,“name;alias”代表需要导出“name”字段和“alias”字段,“^name”代表需要导出除“name”以外的其他字段;

第二个“[]”中的内容代表作为主键的字段,如,“name;mrid”说明导出的商用库中“name”字段和“mrid”字段作为主键;

第三个“[]”中的内容代表需要改名的字段,如,“id->MRID;name->subname”说明实时库中的“id”字段导出至商用库的字段名改为“MRID”、实时库中的“name”字段导出至商用库的字段名改为“subname”。

步骤(2)中,将第一配置文件相关信息存储到面向对象的数据结构中,这里对所需用到的数据结构进行说明:

首先定义field_config_info结构体,下面介绍该数据结构的成员

导出字段方案,数据类型:int(整形),记为field_case。0代表导出所有字段、1代表不导出set_field_list里的字段、2代表只导出set_field_list里的字段。

具体导出字段,数据类型:list(字符串链表),记为set_field_list。记录了配置文件中所需导出表的所有需要导出的字段名称。

作为主键的导出字段,数据类型:list(字符串链表),记为key_list。记录了配置文件中所需导出表的所有作为主键的字段名称。

需要改名的字段,数据类型:map(字符串映射到字符串的图),记为self_field_rename_map。记录了配置文件中所需导出表的所有需要改名的字段的原始名以及改动名称;

然后定义一个export_map的图,数据类型:map(字符串映射到field_config_info的图),记录配置文件中所有需要导出的表名称及对应的字段信息。

步骤(3)中,根据第二配置文件,获取实时库需要导出的表的父表与原表的关系、需要导出的表的父表对应关系库中作为主键的字段、需要导出的表的父表对应关系库中需要更改名称的字段。

首先说明实时库中一对多、一对一、多对多的关联关系,在关系库中使用外键来表达的方法。如果A表与B表在实时库中为1:n关系且A包含B或A表与B表在实时库中为1:1关系且B指向A或A表与B表在实时库中为m:n关系且A包含B,则A、B表在关系库中为父子层级关系,那么在将B表映射存储到关系库时,就需要在导出B表至商用库时,将A表的主键作为B表的外键加入B表的关系库字段中。

第二配置文件写法这里做出说明:

其中"[ INHERIT.子表名]"作为第二配置文件的一项标签,其下方的文字均代表所需导出的“子表名”所指定的父表的信息。“序号”从1开始编号,代表需要导出的父表的数量;第一个“[]”中的内容代表该父表需要导出的字段,以“/”来分隔每一层的父子关系,“*”代表需要导出该父表所有字段,“attr_oid;name”代表需要导出该父表的“attr_oid”字段和“name”字段,“^name”代表需要导出该父表除“name”以外的其他字段;第二个“[]”中的内容代表该父表作为主键的字段,“attr_oid; name”说明导出的商用库中该父表的“attr_oid”字段和“name”字段作为外键;第三个“[]”中的内容代表该父表需要改名的字段,“attr_oid->OOID”说明该父表中的“attr_oid”字段导出至商用库的字段名改为“OOID”。

步骤(4)中,将第二配置文件中需要导出表的所有父表相关信息存储到面向对象的数据结构中,这里对所需用到的数据结构进行说明:

定义一个export_map_list的链表,数据类型:list(字符串映射到export_map的图),该链表中存储了某一个子表对应的需要导出的所有父表及该父表需要导出的字段信息;定义一个export_parent_map的图,数据类型:map(字符串映射到export_map_list的图),该图中存储了所有子表的表名以及对应的需要导出的父表的信息。

步骤(5)中,根据存入特定数据结构中的导出表以及导出表父表的信息,将数据导出至商用库,具体步骤如下:

遍历存了所有需要导出表的export_map结构,获取其中每一个key,得到每一个子表的表名;

每一个子表表名根据export_map映射关系,得到field_config_info结构体,存储了每一个子表需要导出的所有字段的详细信息;每一个子表表名根据export_parent_map映射关系,得到export_map_list链表,存储了每一个子表所需导出的所有父表的层次关系以及字段详细信息;

如果商用库中该子表不存在,那就从field_config_info结构体获取子表的关键字字段名以及需要进行字段名修改的字段,从export_map_list链表获取所有父表关键字字段名以及需要进行字段名修改的字段,在商用库中建立该子表。

获取子表数据:根据field_config_info结构体,获取该子表需要导出的字段,从实时库中读取该表所有记录的这些字段;

获取所有父表数据:遍历export_map_list链表,获取其值value即对应的export_map结构体;再得到export_map每一个元素,export_map的key对应父表的层次结构、value为field_config_info结构体对应父表需要导出字段的详细信息,并将field_config_info里的key_list均作为子表的外键,然后根据父表的层次结构,获取父表每一条记录需要导出的字段的数值。

与现有技术相比,本发明具有的有益效果是:

将实时库电力市场模型中一对多、多对多、一对一的各种关联关系,在仅通过使用关系库外键的方法,将实时库的各种层次关系在关系库中准确地表达出来。

上述内容仅是本发明技术方案的概述,为了更清楚的了解本发明的技术手段,下面结合附图对本发明作进一步的描述。

附图说明

图1为步骤(1)、(2)中导出表的字段、主键、字段改名的配置文件截图;

图2为步骤(3)、(4)中导出表的父表的字段、父表主键、父表字段改名的配置文件截图;

图3为步骤(5)中实际导出流程的逻辑图;

图4为步骤(5)中的field_config_info结构体数据类型。

具体实施方式

下面结合说明书附图,对本发明作进一步的说明。

本发明提供一种电力市场实时库模型数据导出至关系数据库的映射存储方法,包括以下步骤:

(1)从第一配置文件获取实时库需要导出的表的表名、需要导出至关系库的字段、导出至关系库作为主键的字段、导出至关系库需要更改名称的字段;

(2)将配置文件中需要导出表的相关信息存储到面向对象的数据结构中;

(3)从第二配置文件获取实时库需要导出的表的父表与原表的关系、需要导出的表的父表对应关系数据库中作为主键的字段、需要导出的表的父表对应关系数据库中需要更改名称的字段;

(4)将配置文件中需要导出表的所有父表相关信息存储到面向对象的数据结构中;

(5)根据存入数据结构中的导出表以及导出表所有父表的信息,将数据导出至商用库。

步骤(1)中,以图1的实际第一配置文件为例进行说明:

其中"[TABLE_FIELD]"作为第一配置文件的一项标签,其下方的文字均代表所需导出的表的信息。以图1框内文字进行说明,导出的实时库表名为“marketRun”;第一个“[]”中的内容代表导出“marketRun”表中除了“mRID”的字段;第二个“[]”中的内容代表“marketRun”表的“marketStartTime”导出至商用库时需要设置为主键;第三个“[]”中的内容代表“marketRun”表的“attr_oid”字段导出至商用库时需要改名为“MRID”、“MemberOfenergyMarket”字段导出至商用库时需要改名为“energyMarket_ID”、“MemberOfplannedMarket”字段导出至商用库时需要改名为“plannedMarket_ID”。

步骤(2)中,以图1的实际配置文件为例进行说明:

针对表“marketRun”,定义一个field_config_info结构体,其中field_case设置为1;set_field_list增加一个元素为“mRID”;key_list增加一个元素为“marketStartTime”;self_field_rename_map增加三个元素分别为“< attr_oid,MRID >、、< MemberOfplannedMarket,plannedMarket_ID >”

在export_map增加一个元素为“”;

步骤(3)中, 子表“marketRun”的父表“energyMarket”的“tradingDay、tradingPeriod、marketType”为主键,那么导出子表“marketRun”时就需要把父表“energyMarket”这三个字段作为外键导出至子表“marketRun”中,配置文件如图2所示。

以图2的实际第二配置文件为例进行说明,框内文字所示如下,其中"[ INHERIT.marketRun]"作为第二配置文件的一项标签,其下方的文字均代表所需导出的表“marketRun”的父表的信息。序号”从1开始编号,代表需要导出的父表的数量;第一个“[]”中的内容代表需要导出表“marketRun”的父表“energyMarket”的“tradingDay、tradingPeriod、marketType”三个字段;第二个“[]”中的内容代表父表“energyMarket”的“tradingDay、tradingPeriod、marketType”导出时均作为主键;第三个“[]”中为空代表父表“energyMarket”没有字段需要改名称。

步骤(4)中,以图2的实际配置文件为例进行说明:

定义一个field_config_info结构体,用于存储父表“energyMarket”的导出字段的详细信息,其中field_case设置为2;set_field_list增加三个元素为“tradingDay、tradingPeriod、marketType”;key_list增加散个元素为“tradingDay、tradingPeriod、marketType”;self_field_rename_map设置为空。

定义一个export_map,增加一个“”

针对表“marketRun”,定义一个export_map_list链表用于存储表“marketRun”的所有父表信息。export_map_list增加一个“

在export_parent_map增加一个元素为“

步骤(5)中,结合图3所示,遍历存了所有需要导出表的export_map结构,获取其中每一个确认键key,得到每一个子表的表名。

结合图4所示,每一个子表表名根据export_map映射关系,得到field_config_info结构体,存储了每一个子表需要导出的所有字段的详细信息;每一个子表表名根据export_parent_map映射关系,得到export_map_list链表,存储了每一个子表所需导出的所有父表的层次关系以及字段详细信息;

如果商用库中该子表不存在,那就从field_config_info结构体获取子表的关键字字段名以及需要进行字段名称修改的字段,从export_map_list结构体获取所有父表关键字字段名称以及需要进行字段名称修改的字段,在商用库中建立该子表。

获取子表数据:根据field_config_info结构体,获取该子表需要导出的字段,从实时库中读取该表所有记录的这些字段;

获取所有父表数据:遍历export_map_list结构体,获取其值value即对应的export_map结构体(export_map_list链表里的每一个元素就是export_map结构体,每一个export_map结构体的确认键key为父表的层次结构的字符串,值value为具体怎么导出的详细信息);再得到export_map每一个元素,export_map的key对应父表的层次结构、value为field_config_info结构体对应父表需要导出字段的详细信息,并将field_config_info里的key_list均作为子表的外键,然后根据父表的层次结构,获取父表每一条记录需要导出的字段的数值。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号