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

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云创新产品与应用项目征集,欢迎研发者、团队和创业企业参加! 

【走进支付宝】重磅嘉宾!历届“走进企业”回顾 【OSTC讲师专访】腾讯TDW项目:开源的分布式数据仓库 ID爆发的物联网时代,我们该如何管理手中的数百个账户 取代Google Maps?苹果大幅优化Apple Maps用户体验 中交兴路系统架构师杨晓明:Hadoop+Storm+ HBase…,打造交通行业创新型服务 雨果·巴拉的第二春:我与小米的那些事儿 为什么Android Wear能统领智能手表领域? LinkedIn缘何抛弃Ruby,转投NodeJS怀抱 【OSTC讲师专访】九秒社团李明:开源对游戏产业的渗透与帮助 IBM 2014中国论坛:挖掘新互联网时代下“智慧企业”的发展之路 Facebook工程部副总裁Cory Ondrejka谈企业在早期所遇到的管理瓶颈 小团队管理工具选择:不需要大而全 《近匠》聚合CEO左磊:基础数据免费,API开放 IDC:HTML5与原生应用之争还将长存 不甘称臣,Google誓要击败Amazon 【OSTC讲师专访】腾讯追风(QcloudMna):开源移动加速SDK Google Go:一门为云而生的编程语言 3月26日:没有Larry Page,就没有今天的Google Hortonworks再获1亿美元融资,Hadoop领域三足鼎立 Intel收购Basis Science,欲拓展可穿戴设备市场 Facebook以20亿美元收购Oculus:虚拟现实将是未来计算平台又一大事件 基于NodeJS的14款Web框架 Hadoop导航:版本、生态圈及MapReduce模型 把黑匣子送上“云” 失联困境能否不再 看看全球十大电信巨头的大数据玩法 尹绪森:打开圈子拥抱变化,谈Spark玩家的自我修养 从Healthbook看苹果将如何颠覆移动医疗和健身追踪 Google可穿戴:详解Android Wear的十大功能 初创企业非技术人员的迷思 【OSTC讲师专访】王兴博:Genesis-3D,3D开源游戏引擎 Facebook发布开源项目Tweaks,让iOS应用开发更加便捷 求助 关于LONG VARCHAR 或 数据库insert 操作 问两个有点难度的问题:怎样声明及使用API 和 ActiveX DLL? 向大虾请教一个很菜的问题! 用代理如何把一句话加到域中 假脱机是什么技术? 谁熟悉COGNOS的前台展现吗,可不可以教教我拉,有没有中文的文档可以借我看看拉! msgbox的权限? 数据库 vfp->sql server? 谁能告诉我下面程序代码在内存中被编译器实际做出来的结果是什么? 很急:关于msgget的调用 vb 连接数据库 是不是SQLserver2000不支持些SQL 请问如何用程序控制使FORM最大化,最小化? 如何在datatable中再查找符合条件的数据? 为什么打印宽度最大为21厘米? 请问我在一个.js文件中怎样调用其它.js文件中的资源 这样做到不刷新,获取application的变化? 请教状态栏的问题 vfp问题?急~(关于控件的使用) 破解bios开机密码 如何自己编写代码结束所有的应用程序呢?请教! 请问如何在C#中对字符串或byte[]进行crc32校验。有现成的调用吗? 菜鸟的一个有关数据库的疑问?有谁知道吗? 神啊,救救我吧! 神啊,救救我吧! 神啊,救救我吧! 菜鸟提问,如何知道MDB数据库中是否存在一个指定表,谢谢!急…… 关于用DBGRID向数据库添加主细表的问题?高分奖赏! 关于窗体菜单的问题? 很急!!!!!!!! 欢迎大家推荐好的学习JSP的网站! 数据库 vfp->sql server? 问一个最好的查漏方法 ARM Develop Suite eval version的破解方法或者破解文件 一个word文件,怎么让用户一打开它时 出现保存对话框? ie6.0的快捷键问题 这里人气旺,借贵宝地一用。熟悉网站搜索引擎的朋友请进! 交换机和路由器有什么区别?? csdn怎么回事啊!!昨天登陆后竟然显示别人的用户名,今天竟然连我的注册信息也改了.TMD 关于SQL SERVERS2000 建数据库的问题--请进 请问哪有讲算法的好书啊! 关于单片机??? 向各位大侠请教:怎样在JAVE中调用文件 SYBASE 数据库设备删除后 Vitual Device Number 不能释放? 高分诱惑(痛苦莫过于分太多) RichEdit中的COM问题!!! 各位师兄师姐,帮帮我,好吗? 一个图形文件,如一个JPG图形文件,怎么才能通过流读进来,然后转化成一个字节数组。 关于Activeform中INF文件的问题。(解决问题者有分) 我不算是ASP的学习者,但想请教个问题,一小段ASP代码 请推荐国外(or 国内)优秀的编程网站,for delphi 或vc等等 中国汉字的特点 重庆火锅作文,至少四种修辞500字 我们热爱大地,就像初生的婴儿眷恋母亲温暖的怀抱一样,这句话的含义是什么? 我国汉字最大特点是()选项题a.有形b.有声c.既有形又有声 300-400字作文.音乐可以调节心绪、陶冶情操,还有助于拉近人与人之间的距离,使人们和谐相处.或许你也有过难忘的欣赏音乐的经历,用三四百字写出当时的情景和你的真切感受.有题材就行 例子:我们热爱大地,就像初生的婴儿眷恋母亲温暖的怀抱一样.仿写:我们热爱山川,就像__________________. 我们热爱河流,就像__________________. 我们热爱_______,就像________________. 求十六年前的回忆练习答案.1927年4月28日,我永远忘不了那一天.那是父亲的被难日,离现在已经十六年了.  【那年春天,父亲每天夜里回来得很晚.】每天早晨,不知道什么时候他又出去了.有时 《难忘的暑假》作文300~400字 荷兰为什么被称为“水之国”“花之国”“风车之国”“牧场之国”?【还有有关荷兰的资料】急! 帮我选个英文名Angelia Queena Queenie 我在挣扎选哪个,各位出出主意吧,如果觉得不好听,那就帮我想一个,只要每人想一个就好了,不用很多 描写重庆火锅的文章 荷兰是水之国,花之国.资料! 小学语文五年级上册五单元-遨游汉字王国试卷的答案再加上五单元头名卷 初中议论文答题思路 比如 论证方法 荷兰是"水之国,花之国."怎么把句子写具体? 人教版小学语文五年级《遨游汉字王国》课程纲要》 看作文和读者上的文章,需要读出来吗我语文很烂,请认真的回答我,说实话,我写的作文很不流畅,语言表达能力不是很好 关于写春节的作文1000字以上. 人教版小学语文五年级上册第37页内容 《美文》《意林》和《读者》哪个更有助于写作 杜荀鹤《小松》阅读题 1.首句扣住小松之“小”,描写了它的( )和( )2.这首诗借松写人,托物讽喻.诗人写小松有什么用意? 郑成功有什么成就 关于1-6小学语文人教版课文题目 作者..急求啊啊啊啊...说出来吧,感谢各位6c 求四个字形容祖孙情忘年之交形容得是友情吧~ 郑成功的成就是什么 求助大家1-6小学语文人教版课文题目+作者.急求啊啊啊啊...说出来吧,感谢各位4Q 作文 祖孙情 郑成功的成就 为长大后的我做标题的想象作文350字 写祖孙情的作文 有什么事例 郑成功的故事简短一点,简短一点,再简短一点 丨惟我独尊丨,我的“初一下册语文第一课 的读一读写一写 中选4个词 至少100字写几段话”的回答不好吗?春天到了,春姑娘悄悄地来到了我们的身边,所到之处,都充满了生机。在那碧绿的 求15个比较优美的排比句 《十六年前的回忆》 课后题写被捕前和被捕时采用了对比的手法.父亲整理书籍、文件时对我的提问所表现出得含糊、敷衍的态度与( )形成对比;面对敌人,“我”的恐惧与( )形成对比. 作文开头是:人生到处有风景,只要你有一双发现的眼睛.这类作文是什么话题?老师让我们以:人生到处有风景,只要你有一双发现的眼睛.为开头.可我不知道只是要写风景的还是写别的什么话 关于过年的祖孙情作文 人教版语文六年级上册第三单元作文怎么写?500字的我那一篇作文30分啊 作者....有熟悉这个的吗?不好意思,麻烦了{随机数h 请以“人生到处有风景,只要你有一双发现的眼睛.”为开头,写一篇文章要求:除是格外,文体不限.续写时,可以记叙经历、抒发感情、发表见解等、字迹工整、书写规范、不少于600字文中请不 急!求一篇写秋天的作文!题目:**的秋天字数600 越快越好大家尽情发挥…加分!要有借景抒情的作用,最好是‘伤感的秋天’!很急…谢谢了 请问下谁知道1-6小学语文人教版课文题目+作者...迷茫了,十分谢谢大伙了0O 请以“人生到处有风景,只要你有一双发现的眼睛.”为开头,写一篇文章,⊙ o ⊙ 必须是开头 一篇写秋季的作文要生动优美 求助1-6小学语文人教版课文题目 作者.急求啊啊啊啊...我都迷茫了,感谢各位3Q 跪求八年级以'人生到处有风景,只要你有一双发现的眼睛'为开头的作文要开头啊,内容可以就行,要两篇! 中国革命英雄人物比如说江姐 作者....有会的人说下嘛,十分谢谢大伙了{随机数Z 初中生活委员工作总结,两三百个字就可以了,重要的几点多谈谈就可以了,不用面面俱到, 革命英雄人物电影 26课开国大典看着课文第二段画一张大典会场示意图 ..f晓得的人说下哈,我在此先感谢大家了4Ld 什么的郑成功 开国大典会场示意图. 反映西部风景的文章有什么? 谁知道这篇文章? 开国大典示意图开国大典课堂作业本 照样子,写句子.例:我们热爱大地,就像初生的婴儿眷恋母爱温暖的怀抱一样.我们热爱山川,就像                           .我们热爱河流,就像 谁有福州西湖公园寻秋的作文?描写西湖秋天景色的? 开国大典的示意图在哪 我们热爱大地,就像初生的婴儿眷恋母亲温暖的怀抱这句话是把什么比喻什么
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘