赵艳妮,郭华磊
(1.陕西职业技术学院计算机科学系,西安710100;2.西安通信学院信息服务系,西安710106)
一种RDBMS到MongoDB数据迁移方法
赵艳妮1,郭华磊2
(1.陕西职业技术学院计算机科学系,西安710100;2.西安通信学院信息服务系,西安710106)
随着物联网、云计算技术出现,大数据广泛存在,关系数据库处理海量数据力不从心,无法满足高并发性、高吞吐量和低延时等,基于NoSQL技术的MongoDB数据库凭借高并发、非结构化存储和高可拓展性等优点得到青睐。提出一种把关系数据库表映射为集合、记录映射为文档、表列属性映射为字段,“父表-子表”连接采用文档嵌套结构将子表数据直接嵌入到父表中,实现数据从关系数据库平滑过渡到MongoDB数据库的数据迁移方法。实验结果表明,随着数据规模不断增大,该方法查询效率显著提高,对关系数据库向NoSQL数据库数据迁移具有参考性。
数据迁移;集合;文档;字段映射
随着计算机技术普及和发展,呈现了电子政务、电子商务、社交网络、移动服务等基于网络的新型模式,数以亿计的网络用户每天产生海量数据,数据也日趋复杂,越来越多半结构化、非结构化数据不断涌现,所占比例越来越高,传统关系数据库(Relation Database Manager System,RDBMS)在处理海量数据方面逐渐力不从心,难以满足物联网、云计算时代的高并发性、高吞吐量和低延迟等要求[1-2],如图1所示。NoSQL(Not only SQL,NoSQL)技术以低延迟高并发读写,支持非结构化数据存储,海量数据访问,依靠廉价集群模式克服服务器硬件纵向扩展成本高瓶颈等特点较好地解决上述问题[3]。传统关系数据库长期运行,积累了海量历史数据,如何将历史数据平滑迁移到NoSQL数据库中,进一步挖掘数据价值,实现数据价值最大化,是大数据时代亟待解决的问题[4],本文以NoSQL典型数据库MongoDB为例,实现关系数据库向NoSQL数据库数据迁移。
基于SQL的关系数据库中表存储结构化数据,在存储数据前先定义表结构,同一字段数据类型统一,每条记录都需要所有字段,便于表间连接查询。基于NoSQL的非关系数据库以“键-值”对存储,具有灵活的数据模型,增加列无须修改表结构,可以存储半结构化/非结构化数据,容易实现可伸缩性,满足用户频繁且并发地访问数据[5-6]。关系数据库扩展性主要是采用纵向扩展,购买高性能服务器,更好的CPU、更多内存、更大磁盘来提高性能。然而,高性能服务器结构复杂,价格昂贵。非关系数据库扩展主要采用横向扩展,即通过同时运行多台廉价服务器来扩大存储容量,提高并发性和访问速度,仅仅变更程序,成本低廉。对于流行的敏捷软件开发模式来说,关系数据库是一种瓶颈,开发过程中想将客户喜欢的特性加到数据库,数据库的表结构都需要改变,向表结构中添加这一列属性,然后将整个数据库表数据迁移到新的表结构上,假如表中已有几百万、上千万条数据,简直是一场灾难[7]。基于SQL数据库经过几十年发展,日趋成熟,标准统一,支持多表连接复杂查询查询和数据强一致性。而NoSQL数据库最近几年才出现,产品不成熟,不支持SQL,支持特性不丰富,功能有限。SQL与NoSQL特性对比如表1所示。
图1 海量数据发展趋势
2.1 基本思路
表1 SQL与NoSQL性能对比
RDBMS到MongoDB数据迁移框架图如图2所示,基本思路如下:
(1)深入研究源关系数据库和目标MongoDB数据库,建立源表和目标集合、源表记录和目标文档、源表列属性和目标字段之间映射关系[8],制定数据迁移方案,如图3所示;
(2)根据数据迁移方案,生成XML格式的映射模型文件;
(3)解析映射模型文件,获取源关系数据库和目标MongoDB数据库的映射关系,从源关系数据库抽取数据,根据数据迁移方案对数据进行预处理(数据验证和数据清洗),然后对预处理后数据进行转换操作(字段合并、字段拆分、类型转换、值替换、字段计算等)[9],生成集合,装载到目标MongoDB数据库中。
图2 RDBMS到MongoDB数据迁移框架图
图3 关系数据库与MongoDB映射图
2.2 数据迁移预处理
源关系数据库中数据无法保证完美无缺,可能存在错误或格式不符合目标数据库要求,在数据迁移过程中如果不进行预处理,可能存在隐患,造成新系统无法正常运行。因此,抽取数据后要对数据进行预处理,验证数据有效性,更正存在的错误,清洗无效数据,尽可能把数据对新系统影响降到最低。
(1)数据验证
数据验证阶段主要考虑以下两个因素[10]:
①防止异常错误造成数据迁移中止,例如,数字中存在字母、字符串截断、非法日期类型等;
②审核数据是否满足目标数据库要求。采用正则表达式验证数据数字、字符、连字符、空格、取值范围等[11]。例如,验证输入文本文件名称以“txt”开始,后面紧跟日期格式“yyyy-mm-dd”,正则表达式可以设置为“txt(20)dd-(0[1-9]|1[012])-([01][1-9]|3[01]). txt”。“txt2016-12-15.txt”为符合规则文件名称,“txt5016-24-35.txt”为不符合规则文件名称。
(2)数据清洗
数据清洗对象不仅包含无效数据,也包含违反规则数据和精度不符合指定范围数据[12]。例如,数字类型数据包含字母、数值超出范围、非法日期等。
在数据验证阶段确定不符合规则数据,进行清洗或更正,减少数据冗余,提高数据质量,在数据转换过程中最大程度避免由数据质量造成的异常中止,保障数据迁移的顺利实施。
2.3 表与集合映射模型
RDBMS到MongoDB数据迁移成败关键在RD⁃BMS表与MongoDB数据库集合映射关系的建立。源表与目标集合映射关系如图4所示。
图4 表与集合映射关系图
根据数据迁移方案读取源关系数据库数据字典,获取源表和源列属性信息,确定源表和目标集合之间映射类型,建立源列属性与目标字段间的映射关系,生成XML格式的映射模型文件。表与集合映射分为“一对一”、“多对一”、“一对多”和“多对多”四种形式[13]。其中“一对多”可以拆分为多个“一对一”,“多对多”可以拆分为多个“多对一”,因此,本文主要研究“一对一”和“多对一”两种映射关系。
(1)“一对一”映射
在RDBMS到MongoDB数据迁移过程中,源表与目标集合“一对一”映射关系最普遍,映射模型XML文件根元素为ETL,属性“type”的值为“1”,表示该映射模型为“一对一”。元素“sdb”为源数据库,属性“type”值为源数据库类型,元素“sdb”值为源数据库名称。元素“tdb”为目标数据库,属性“type”值为目标数据库类型,元素“tdb”值为目标数据库名称。元素“stable”的属性“name”值为源表名称,元素“stable”的子元素为源字段名称,值为目标MongoDB数据库信息,“.”前为目标集合名称,后是目标字段名称。元素“where”值为数据迁移条件,用于生成“where”语句。下面以源数据库“mysqldb”中“student”表的“id”、“name”、“gender”字段迁移到目标数据库“mydb”中“xuesheng”集合的“bian⁃hao”、“xingming”和“xingbie”字段为例,描述“一对一”
映射模型。
-
-
-
-
-//迁移条件
(2)“多对一”映射
“多对一”映射模型XML文件描述说明同“一对一”映射相同。下面以源数据库“mysqldb”中“student”表、“mark”表和“lesson”表合并迁移到目标数据库“mydb”的“xuesheng”集合为例,描述“多对一”的映射模型。其中“student”表中字段“id”、“name”、“gender”,“mark”表中字段“id”、“lessonid”、“score”,“lesson”表中字段“lessonid”、“lessonname”、,迁移到目标数据库“mydb”中“xuesheng”集合表的“bianhao”、“xingming”、“xingbie”、“kcbh”、“kcmc”和“chengji”字段,多表连接方法为等值内连接,连接条件为“mark.id=student.id andmark.lessonid=lesson.lessonid”。
-
-
-
-
-
-//迁移条件
2.4 数据转换
关系数据库为了减少存储冗余度,通过“父表-子表”方式建立大量连接查询,付出查询效率显著下降的代价[14]。本文提出的迁移方法利用MongoDB灵活的文档嵌套结构将子表数据直接嵌入到父表中,以牺牲存储空间为代价,避免了大量的连接查询,提高查询速度[15]。
(1)“一对一”单表迁移
关系数据库中表与其它表不存在外键关联时,直接将关系数据库中表到MongoDB文档的转换。表2为学生信息表“student”,“id”为主键,“student”表与其它表不存在关联,直接数据转换。基本方法:将源表名称字作为MongoDB中集合名称,源表中每条记录转换成MongoDB集合中的一个文档,文档的“键-值”对应源关系数据库中的“列属性-列值”。系统为每个生成的文档自动分配一个唯一“_id”,对应值为ObjectId()对象,在集合中唯一标识一个文档,也可以把源表主键值插入“_id”。
表2 student
下面为转换后的集合“student”:
student=({“_id”:ObjectID(…),id:2017001,name:“张晓强”,gender:“男”},{“_id”:ObjectID(…),id: 2017002,name:“李艳红”,gender:“女”},{“_id”:ObjectID(…),id:2017003,name:“王宝军”,gender:“男”})
(2)“多对一”多表迁移
表3为存储课程信息表“lesson”,“lessonid”为主键。表4以“父表-子表”模式存储成绩的成绩表“mark”,“id”和“lesson”为复合主键,“id”为外键,关联表2“student”表的主键“id”,“lessonid”为外键,关联“lesson”表的主键“lessonid”。
表3 lesson
表4 mark
下面为转换后的集合“student”:
student=({“_id”:ObjectID(…),id:2017001,id:“张晓强”,gender:“男”,mark:[{“_id”:ObjectID(…),id: 2017001,lessoned:101,score:85,lesson:{“_id”:ObjectID(…),lessonid:101,lessonname:“Java编程技术”}},{“_id”: ObjectID(…),id:2017001,lessoned:102,score:90,lesson: {“_id”:ObjectID(…),lessonid:102,lessonname:“数据库技术”}}]},{“_id”:ObjectID(…),id:2017002,id:“李艳红”, gender:“女”,mark:[{“_id”:ObjectID(…),id:2017002,les⁃soned:101,score:91,lesson:{“_id”:ObjectID(…),lesso⁃nid:101,lessonname:“Java编程技术”}},{“_id”:ObjectID(…),id:2017002,lessoned:103,score:78,lesson:{“_id”: ObjectID(…),lessonid:103,lessonname:“数据结构”}}]}, {“_id”:ObjectID(…),id:2017003,id:“王宝军”,gender:“男”,mark:[{“_id”:ObjectID(…),id:2017003,lessoned: 102,score:75,lesson:{“_id”:ObjectID(…),lessonid:101, lessonname:“数据库技术”}}]})
为了验证该方法有效性,以上述复杂的“多对一”模式的三表连接查询为例,本实验设定25门课程,每个学生都有25门课程成绩,学生人数分别为500、1000、2000、5000、10000、20000人,采用MySQL 5.6关系数据库、MongoDB自带工具MongoVUE、和本文方法分别从数据空间存储量和查询速度两个方面进行比较。实验环境:i5-3210M处理器、4G内存、Windows 7操作系统、MySQL 5.6、MongoDB 3.4.1,在Eclipse3.7集成开发环境下采用Java以JDBC方式连接MySQL,以mongo-2.0连接MongoDB实现,图表显示采用开源插件org.swtchart_0.9.0。性能对比如图5、图6所示。
通过对图5、图6分析比较,在数据规模较小时,关系数据库、MongoVUE和本文方法的数据空间存储量和访问时间相差较小,但随着学生数量增加,数据规模逐渐增加,本文方法由于采取“文档嵌套”模式存储数据,数据冗余急剧增加,数据空间存储量远高于关系数据库、MongoVUE,付出巨大存储代价,但由于取消多表连接查询,避免表之间查询锁定,访问时间相比关系数据库、MongoVUE优势明显,在海量数据查询方面,这种以牺牲空间存储量换取查询效率的折中方法对于半结构化、非结构化数据是可行的。
图5 空间存储量对比图
图6 访问时间对比图
针对大数据时代半结构化、非结构化数据急剧增加,传统关系数据库无法满足高并发性、高吞吐量和低延时等海量数据实时处理要求,亟待把数据从关系数据库迁移到NoSQL数据库。提出一种把关系数据库表映射为MongoDB集合、记录映射为文档、表列属性映射为字段,“父表-子表”连接采用文档嵌套结构将子表数据直接嵌入到父表,实现数据从关系数据库平滑过渡到MongoDB数据库的数据迁移方法,实验结果表明,该方法虽然牺牲数据空间存储量,但查询时间大幅度压缩,符合大数据时代对数据实时处理的性能要求。下一步研究方向是在保证查询效率不降低基础上,减少数据空间存储量,降低硬件存储成本。
[1]孟小峰,杜治娟.大数据融合研究:问题与挑战[J].计算机研究与发展,2016,(02):231-246.
[2]陈文艺,闫洒洒,宋亚红.基于MongoDB的物联网开放平台数据存储设计[J].西安邮电大学学报,2016,(02):78-82.
[3]Khan S,Mane V.SQLSupportOverMongoDBUsingMetadata[J].International Journalof Scientific and Research Publications,2013,3(10):1-5.
[4]何杭锋.基于FODO算法MongoDB自动分片的改进[J].计算机技术与发展,2013,23(7):127-130.
[5]Wu CM,Huang Y F,Lee J.Comparisons Between MongoDB and MS-SQLDatabaseson the TwcWebsite[J].American Journalof Software Engineeringand Applications,2015,4(2):35-41.
[6]潘明阳,高立佳,宋平亮,等.基于MongoDB的船舶数据库构建与数据批量迁移技术[J].大连海事大学学报:自然科学版,2016(1): 39-44.
[7]Hou B,Qian K,Li L,etal.MongoDBNoSQL Injection Analysisand Detection[C]//Cyber Security and Cloud Computing(CSCloud),2016 IEEE 3rd InternationalConference on.IEEE,2016:75-78.
[8]田野,袁博,李廷力.物联网海量异构数据存储与共享策略研究[J].电子学报,2016,44(2):247-257.
[9]Long Y.Research on SocialRelationship Network System based on MongoDB[J].International JournalofSimulation-Systems,Science &Technology,2016,17(7):1-6.
[10]王照清.大数据环境下数据查询优化技术应用研究[D].北方工业大学,2016.
[11]Stanescu L,Brezovan M,Burdescu DD.Automatic MappingofMySQLDatabases to NoSQLMongoDB[C].Computer Scienceand Information Systems(FedCSIS),2016 Federated Conference on.IEEE,2016:837-840.
[12]Kang Y S,Park IH,Rhee J,etal.Mongodb-based Repository Design for Iot-Generated RFID/Sensor Big Data[J].IEEESensors Journal,2016,16(2):485-497.
[13]梁海.MongoDB数据库中Sharding技术应用研究[J].计算机技术与发展,2014,24(7):60-67.
[14]郭昆,宋杰,王洁萍,朱志良.NoSQL数据库间数据交换代价研究[J].计算机工程与科学,2016(01):33-40.
[15]曾强,缪力,秦拯.面向大数据处理的Hadoop与MongoDB整合技术研究[J].计算机应用与软件,2016(02):21-24.
A Data Migration Method for RDBMS to MongoDB
ZHAOYan-ni1,GUOHua-lei2
(1.DepartmentofComputer Science,ShannxiVocational&TechnicalCollege,Xi'an 710100;2.Departmentof Information Service,Xi'an Communication College,Xi'an 710016)
赵艳妮(1982-),女,陕西蓝田人,博士研究生,副教授,研究方向为信息集成、软件工程等
郭华磊(1981-),男,汉族,河南泌阳人,硕士,讲师,研究方向为信息集成
陕西省教育厅自然科学专项(No.16JK1192)
1007-1423(2017)22-0018-06
10.3969/j.issn.1007-1423.2017.22.005
As the Internet of things,cloud computing,big data iswidespread,relational database handle huge amounts of data and cannotmeet the high concurrency,high throughputand low delay,etc.,the MongoDB databasewith high concurrency,unstructured storage and the advan⁃tages ofhigh scalable based on the NoSQL technology.Proposes a relational database tablemapping collection,recordmapping document, table column propertiesmapping field,parent table-child table documentnested structure is used to connect the child table data directly embedded into the parent tablemethod,implement the data from a relationaldatabase is smooth transition into themongo database datami⁃grationmethod.The experimental results show thatwith the increasing ofdata size,the query efficiency is improved significantly,there is a reference to the datamigration of relationaldatabase toNoSQL database.
Abstract:
DataMigration;Collection;Document;Field Mapping