说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

MySQL到NoSQL:数据的重思和查询方式的转换

HTML文档下载 WORD文档下载 PDF文档下载
在众多NoSQL数据库的轰炸下,身为数据工作者的你肯定在做是否迁移的考虑。而迁移后所面对的操作方式转换也是重点考虑的之一,Couchbase副总裁MC Brown认为过渡的首要工作就是对数据的重思,并讨论了查询方式的转换。

从关系型数据库转移至NoSQL数据库——比如从MySQL转移到Couchbase,你需要对你的数据进行再思考。至于为什么是Couchbase而不是MongoDB什么的,因为博文的作者MC Brown是现任Couchbase副总裁,所以你懂得;同时这篇Couchbase博文还涉及到迁移后对查询的影响。

以下为译文:

如果你有一个建立在MySQL上的数据库,你可能就会考虑是否需要以及更重要的如何将数据库(和你的应用程序)转移到Couchbase上。最大的绊脚石不在Couchbase建立或者是存储信息方面(尽管他们也很重要),而是数据的重思,你需要使用另一种方式去处理你的数据,然后对应用程序作出相应的变化。

下面将着眼如何把MySQL数据库结构转换成Couchbase Server,并针对两个数据库的查询方式改变进行讨论。

首先:数据结构的重思

MySQL(以及其它的SQL类型并且以表格为基础的数据库)强迫你将数据打造成表格的形式。你所有的数据就是一张表,当你储存复杂结构类型数据时,一个单独的数据片可能拆分成多于一张的表格。对于一些应用程序以及数据类型,如此存储数据是一个完美的逻辑以及合理的途径。而同样对于某些应用程序,使用这样的方法去存储数据并不是很适合。

下面看一个典型的例子,一个recipe(食谱)数据库。因为Cheffy.com是建立在MySQL之上,所以MC Brown对此非常清楚。基础的表格结构是一个核心表,称为recipe,包括了食谱的name、subtitle、description和servings。当然还有一些其它的recipe信息,比如:成分清单(Ingredients)、方法步骤(Method)、元数据(Metadata)以及通过一个独立的recipe ID连接到原recipe表的关键词(Keywords)。你可以在下图中看到这些主要部分:


这个结构有一些潜在的好处,一些特定的操作可以非常简单的完成。举个例子,比如说查询一些包含原理“carrot(胡萝卜)”的recipe(食谱)。你可以从Ingredients表中查找“carrot”,并鉴于这点得到一个匹配的recipe列表。通过使用join你可以获得一个recipe列表,从中获取他们的title以及一些其它的信息,通过搜索Ingredient表,使用join连接两张表中的recipe ID。


当然这种查询方法很简单,可以收集到一个食谱的所有信息。然而当你想给用户演示这个食谱时,将会变得很复杂。你可以通过一个单独的查询来完成,然而有时候通过几个查询来完成这个更容易,分别获取recipe、ingredients、metadata等表格的数据。在应用程序层,通过建立对象就可以自动的完成这些操作,同时这也是此类操作的基础方法。

对于许多用户和应用程序,通常会建立一个特殊的层去做这些事情,或者是选用一个对象映射系统将底层表格式的数据映射成应用程序使用的高等级对象。这里的recipe就是一个例子,在其它各种各样的应用程序中也有类似的存在,包括invoicing (invoice、supplier、 destination, invoice lines) 和 blog posts (post content、keywords、creator、 comments)。

这种基于表格的解决方案本身并没有什么问题,但是在这种场景下,key被跨表格的储存,同样这也意味着需要保持这几个表格的同步。举个例子,当某条记录被删除时会出现什么样的情况?你必须删掉连接到原表上的其它记录(不管是手动删除或者是级联删除)。类似的,当加载一个菜谱信息时,你可能需要运行5-10个查询。

Couchbase使用了一个不同的方法。取代将信息分割存入多张表格,在Couchbase中你只需要储存一个单独的结构(JavaScript Object Notation JSON)格式。JSON格式允许很多复杂的数据结构,包括字段、对象和标量类型,可以用它们组成一个完整的记录。这就意味着你可以使用一个“文档(document)”代替之前你使用多个表格来储存实体(recipe,blog post)。


现在只需要在一处就可以对整个recipe进行操作,也就是只需要一个操作就可以从Couchbase数据库中获得你想要的信息。

这里对内容没有强制的结构或者是定义,Couchbase数据库中的任何文档都可以储存任何的信息和结构。然而你还可以使用一个验证程序用来检查提供给数据库文档的结构,验证可以同时针对字段以及字段的类容。

鉴于这里没有严格的数据结构类型,它可以给存储带来更高的灵活性。举个例子,你不需要额外的操作就可以向recipe文档中添加新的部分“食谱的提供人”。

这里同样没有多重表这个概念,这里只有数据库,数据库中只包含了文档。如果你想让同一个数据库支持各种不同类型的信息,你可以向文档中加入字段。比如你可以如此来确认一个recipe:


那么type就可以作为标记在数据库其它的地方使用,用以识别(选择)你正在加载的数据。

其次:如果什么都是文档,那么你该如何查询

第一节中已经讨论过如何在MySQL上使用一条简单的SQL语句来获得一个原料中包含胡萝卜菜谱的列表。在MySQL中我们通过搜索ingredients表中与carrot匹配的recipe ID值,然后通过join从recipe表中获得recipe title。出于速度考虑,你可能会使用一个索引来提升查询的响应时间,用以保存单独的每一条记录。

在Couchbase所有数据都是文档,并且这里也没有嵌入的方法用以查询表格中的字段,因为这里既没有字段也没有表格。因为Couchbase中本就没有严格的数据结构模型(同样也没有方法让数据库引擎去确定自由格式文档中的字段),那么我们该如何完成在普通表格上的操作呢?

Couchbase支持一个构造称为view,而这个view与MySQL中的view非常神似;除下在Couchbase中,view是唯一从数据库文档中获得列表的方法,而在MySQL中view只是丰富了一个选择。View事实上定义了3件事情:

  • View中包含的信息结构。你可以想象成表结构的定义,就像你在MySQL中建立一张表。
  • 用以搜索的字段或者是信息。一个view将输出两项结果,key和value。Key将被传入方法以发现你需要搜索什么,更具体的说就是你需要查询的数据库内容。
  • 结构和key上的索引。索引同样用于提升搜索的性能。

View使用JavaScript在一个设计文档中进行定义,使用一个文档作为参数的函数。一旦view被构造,数据库中的每个文档都会提供给view,然后view查询并输出你需要的结果。不用担心JavaScript,JavaScript将只在服务器上执行(不会在客户端上执行)。

现在回到MySQL,一个没有where的查询,查询输出选择的字段,并且在输出结果中构造一个匹配行的列表。下面,详解一个SQL语句:


当在MySQL上运行一个查询,MySQL服务器从一张或者多张表中取得信息,然后构建输出结果列表:


在Couchbase中,View从单一的文档中获取记录,并且在处理过程中附带建立一个索引。结果则是view抓取的所有文档列表。


在MySQL中执行一个带where的查询,索引一般被期望帮助你查询需要的记录:


而在Couchbase中,生成的view就是你的表格,当你对view进行查询,Couchbase使用这些键的值(以及生成的相关索引)和过滤后(你指定)的返回信息,生成最终的匹配列表。


总结

上文主要针对MySQL到Couchbase的转变,通过上面的两个步骤基本上可以完成这个过渡。然而一些更高级的必然需要一些更多的思考,MC Brown在Couchbase博客同样发布了转换的第二部分,包括了更多高级查询的思考。(编译/仲浩 审校/王旭东)

原文链接: How to Move from MySQL to Couchbase Server 2.0: Part 1

推荐阅读: Moving from MySQL to Couchbase Server – Part 2

“  第五届中国云计算大会 ”将于2013年6月5-7日在北京国家会议中心隆重举行。猛击报名! 

相关活动已经火热启动:

2013中国云计算大调查,每周大奖等你拿! “ 

Innovation Cloud 2013云创新产品与应用项目征集,欢迎研发者、团队和创业企业参加! 

我的编程认知:多思考、多编码、多测试 聚焦应用开发 2014年微信开发者大会即将召开 继续补Bug,jQuery Mobile发布1.4.3版本 手游SDK服务商棱镜公司获A轮投资 东方弘道领投 广而告之:Databricks终止Shark项目,转至Spark SQL DeNA China副总裁黄雪斌:IP战国时代的生存法则 巴别时代首席执行官赵暕:从页游到手游的完美转身 Oracle借助RESTFUL API扩展移动端版图 优秀求职者应主动问的5个问题 高德LBS智能硬件编程马拉松:硬件复兴,等你挑战! 首届bong线上黑客马拉松:运动数据分析应用bong+获大奖 英特尔推出基于WebRTC的协同通讯方案 凸显本土创新“软”实力 一周消息树:不同设备不同界面的Windows 9正在逼近! 乐卓网络CEO李澄澄:移动游戏IP是把双刃剑 高性能动画!HTML5 Canvas JavaScript框架KineticJS Swift最酷炫的七大功能 微信开发者大会讲师介绍:柳峰与你一起玩转公众平台应用开发 TIOBE 2014年7月编程语言排行榜:仅发布1月,Swift进Top 20! 艾格拉斯CEO王双义:手游自研引擎的荣耀之路 以招行为例,深圳云软黄榕振谈微信公众帐号企业应用高级开发 来自前苹果高管Heidi Roizen的经验之谈 【短讯】Dropbox、微软OneDrive打不开,国内用户该如何应对? 5分钟弄懂Docker! RakNet:被OculusVR收购的跨平台游戏网络引擎 Qualcomm业务拓展副总裁沈劲:智能终端的延伸 苹果发布Xcode 6 Beta 3,Swift迎来重大更新! Linkedln技术高管Jay Kreps:Lambda架构剖析 《近匠》极光推送:聚焦巨头无法快速转身的领域 Babylon.js:拥有微软背景的开源3D游戏引擎 EMC 2014存储布局及十大新技术要点 腾讯推出零流量地图 离线实现公交步行导航 VB 6.0 sp4出来了! 新增了许多有趣的控件,快去www.microsoft.com去看一直吧! 关于COM、MTS\COM+的客户端访问服务器端总是被拒绝的问题? 高手请进。。。。 求助各位高手,一个关于DLL的问题!(急!!!) java的多媒体问题! 请问哪里有crystal report 8.0下载 有几个使用VC++的问题请教 请教一两个问题: 关于虚父类、虚表的问题。 **RADIO BUTTON的问题** win2k下的oracle816的安装问题,紧急阿 如何通过INTERNET 远程联接ORACLE服务器,SERVER端IP地址是固定(ADSL),客户端是通过电话线上网的。 Delphi的编程环境 救命:如何读取像http://www.csdn.net/demo/demo.txt这样的文件存放到本地? vb调用vc编的activex 在DELPHI中怎样COPY一个文件夹? VB的界而的确容易制作,但似乎过于简单 如何在ATL环境下动态地开辟一个字符串型的缓存区 一句sql 关于中国软件业问题的一些看法 用xml做数据库是不是不安全 关于setwindowlong的问题!!! 关于WINSOCK 通信的问题 Query Analyzer怎么刪不了多筆記錄﹖ getchar ()的问题 ◆→访问csdn会让我“死机”! 纯技术咨询,请大家踊跃发言 一个串口通讯的问题。 一个庞大的计算计划,求解素数的间隔的 那句效率高点? 有没有sql server+asp开发的朋友,怎样把sql server数据库上传到服务器上,分绍有分! 如何注册使用控件,急!!! CView类中如何实现浮动的提示信息? 怎样给对话框创建一个视1? 报表计时用table,不用query,报表已设计好了,在显示预览时如果将一些不符合条件记录筛选择掉呢? 请问流是个什么概念? 我是初学,请指点 送分求购api用法及中文说明! asp页面可否设置关键字,使文章能被搜索引擎搜索到? ~~谁想做世界杯活力宝贝~~? 如何将StringGrid 中的数据保存为Html格式的表格 关于断点续传,请问大家 php中有没有 与 asp response.clear等同函数 单片机高手请看:中断中的中断,麻烦中的麻烦。 怎一个难字了得?挑战高手 如何改变LISTVIEW中各项的宽度 求《C++ Primer》中文版电子书下载;ejian@21cn.com 请问:在Asp中如何使用ODBC和SQL 注册表help... ListCtrl控件设为ICON属性,请问是否有subitem属性? Win2000系统去访问WIN98系统的服务器 PING的通 但打开的时候报参数出错! vb调用vc编的activex 上海初中数学补课较好的地点是哪? 2011北京师范大般五年级数学.语文暑假生活答案 小树问大树;“你吃什么才长得这么大呢?” 大树说:“我每天吃青山一座,白云两片,蜂鸣与蛙唱四两,早晚各吃 厦门市湖里区小学六年级上学期的寒假学伴的第36页和37页的答案? 小树怎样才能变成大树?条件都很充沛! 卧薪尝胆中吴王夫差反胜为败的原因是什么 CHINA,以下是我最后几题不会的了,请帮我解答下:1、从柳州到南宁大约有255千米.甲乙两车同时从中间的一个车站相反方向开出,甲车去柳州,乙车去南宁,甲车每时行23千米,乙车每时行27千米,最 建施节点详图中的正负零点与结施图中的正负零点表示的是一个标高吗建筑标高和结构标高是否公用一个正负零点呢 卧薪尝胆 吴王夫差反胜为败的原因是什么 3y-1/4=y+1/8 ) 九年级下语文鱼我所欲也复习笔记(学生用) 越王勾践转败为胜的原因是什么;吴王夫差反胜为败的原因是什么,(简单回答) 24、如图所示,在直角梯形ABCD中,AD//BC,∠A=90°,AB=12,BC=21,AD=16.动点P从点B出发,沿射线BC的方向以每秒2个单位长的速度运动,动点Q同时从点A出发,在线段AD上以每秒1个单位长的速度向点D运动,当 语文九年级下册19课《鱼我所欲也》的课后题 越王勾践转败为胜的原因是,吴王夫差反胜为败得原因是-. 谁有鄂教版六年级语文下册教案 九年级下《语文作业本:鱼我所欲也》的答案 作文:这也是一次考试【600字左右】月考全班成绩都不好,老师留个这破作文,十分钟内回答有追加啊够600字啊 语文六年级下册教案要苏教版的!急需!1 人教版九年级语文下册《鱼我所欲也》课后答案 学苑新报英语天地人教版新目标八年级2010-2011 9期答案 上人屋面的屋顶平面图要画到楼梯吗有楼梯间通往屋面的,画屋顶平面图时,是应该从顶层地面以上层高以下某个剖切面的角度俯视来画,还是直接从最顶上俯视看不见楼梯那种来画? 小树为什么可以长成大树拜托了各位 学苑新报人教目标版九年级英语天地第18期答案 六年级数学王老师拿720元买桌子和椅子一张桌子比一张椅子贵30元6张桌活9张椅子相等都买桌需要多少元椅子呢 合作的作文400字和同学 学苑新报 英语天地 2010-2011人教新目标八年级第16期 六年级语文下册课本教案急需回顾拓展中日积月累的意思(人教版)主要是一 关于合作的一片作文、字数400字左右、关于同学和我的谢谢! 春节作文的结尾 拿720元买桌子和椅子,一张桌子比一张椅子贵30 6张桌子和9把椅子价格相等,能买多少桌子 多少椅子 理想的作文500字以上 学范新报.英语天地 2010-2011学年人教新目标八年级第35期答案 小学六年级下册语文北京的春天 关于合作的400字作文一定要合作的400字作文! 我的春节(结尾)作文 求初中人教版数学知识点按章总结~从第一章到第二十九章(定义 性质 判别) 关于"合作"的作文 400字可以写“成功的”或“失败的” 春节作文结尾怎么写时光流逝,岁月如梭.春节就是这样一个接一个的过去了.它意味着亲人团聚,意味着卸下一年的不快与负担.我想我们都应该好好珍惜春节这个不可多得的节日,哪怕仅仅是为 初中人教版的数学和北师大版的哪个考得难?哪个考的难是第一,还有就是侧重点有什么不同,还有第三就是人教的里面有哪些知识是北师大没有讲过的?两位能说一些北师大没有讲过但人教讲过 小树能不能顺利长成大树 越王转败为胜的原因是什么? 初中所有的数学概念“人教版” 用110cm长的角铁用110cm长的角铁焊成一个长方形框架长是高的3倍宽是高的1.5倍求这个长方形的长宽高 英语翻译A container in the shape of a right circular cylinder has an inside base radius of 4 inches and an inside height of 9 inches .This cylinder is completely filled with water.All of the water is then poured into a second right circular cylin “竟敢小瞧本女侠,我就让你等来个心服口服!你能读出当时作者的内心想发吗?请写出来.__________________________________________________________________________________________________________________ 初中人教版世界历史总结要总结性质的, 用110cm长的角铁焊成一个长方体框架,长是宽的2倍,求这个长方形的场、宽、高各是多少. 四、通过课外阅读,我知道西游记是 写的,姜子牙是神话小说《 》中的人物;我佩服水浒传中的 、 、 等英雄:…… 商场楼梯间疏散距离 用110cm长的角铁焊成一个长方体框架,长是宽的2倍,宽是高的1.5倍,求这个长方形 六年级语文寒假作业第9面第二大题 楼梯间怎样计算梯步总高度3.16米地面直径长度2.63米拐弯下来3步最多4步,拐弯处做个700*700的平台 用110cm长的角铁焊成一个长方体框架,长是高的3倍,宽是高的1.5倍,求这个长方形的长、宽、高各是 一、写新闻可有意思啦.新闻除了要有时效性之外,它的语言文字要简洁扼要,并且要表意准确.试着将假期中发生的一件事,写成新闻稿.字数太少,不能少于150个字 求北京课改版五年级数学(下)的全部答案!1 用110cm长的角铁焊成一个长方体框架,长是宽的2倍,宽是高的1.5倍,求这个长方形的长、宽、高各是多少. 上海数学补课试听可以去哪啊? 北京课改版语文五年级上册期中试卷有急用 小树问大树:“你吃什么才长得这么大的呢?” 大树说:“我每天吃青山一座,白云两片,蜂鸣与蛙唱四两,早晚各吃晨曦与落日一遍,有时也吃些鸟粪、腐叶几片,喝点朝露和山泉.” 小树:“吃
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘