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

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

2013互联网安全大会议题先睹为快之CSA中国理事赵粮 移动建站工具(二):分秒钟DIY一个移动网站 2013上半年中国移动互联网报告,在线完整版 iOS开发者必备:九大设计类工具 已到“迟暮之年”?微软投资者提议两“救世主”外部候选 【SDCC讲师专访】Joseph G. Brown:云带来的软件销售方式变革 用户界面设计攻略:设计师需注意的九大要点 Google Glass的竞争对手来了:看YC演示日的五款新孵化项目! GPU Saturday技术沙龙:OpenCL程序员眼中的下一代APU架构 黑帽大会演讲中国第一人:从攻到防,从白帽黑客到创业者 15个步骤创立技术公司,并收获千万用户(完结) CTO容易犯的三大错误 谷歌艺术计划:互联网能否取代真实的博物馆? Hadoop技术沙龙:Hortonworks技术研发总监展望Hadoop 2.0 Marissa Mayer:雅虎月活跃用户增长了20%达8亿 移动用户3.5亿 气死偷车贼:脑电波防盗技术,让偷车贼无计可施 TIOBE 2013年9月编程语言排行榜:Transact-SQL首次进入前十 前Oracle总裁Charles Phillips:商业软件领域的“乔布斯” 留住你的用户:8款第三方移动推送服务 人气最旺:主流移动应用创建工具大合集(一) 不要强迫用户注册,请让他们先试用产品 Eve:基于Python的REST API框架 想扩展你的数据库吗?那么先了解一下I/O 白帽黑客将现场爆料Android系统及框架漏洞 9月13日:程序员节,一起来过节吧! 欲与Siri、Google Now比高低:微软开始打造个人助理Cortana 【开源专访】禅道创始人王春生:覆盖项目全周期,回归管理的本质 携程无线创业者大赛成功落幕 梁建章为头名“快展”颁20万奖金 Bug报告:小角色,大用处! iOS开发者必备: 五大编程类工具 多核优化软件MCx释放EMC VNX闪存潜能 在php中要取出一段字符串的前n个字节,而又要判断最后一个是中文还是英文,如果是中文则将最后半个字符省略应该怎么做? 有在BCB5中用过sapi5朗读中文的朋友,高分送上! 最初级的问题,关于编译程序的。 重庆市信息产业办公室荣获全国最差信息产业办公室称号 大家用PB创建Jaguar应用程序时,一般创建一个大包还是多个包阿? 奇怪的问题,来者有分!没回答问题的先到先得! 如何把临时表建在内存中 请教一个关于DELPHI多线程的问题 *急:无为,acptvb,请帮忙看看http://www.csdn.net/Expert/topic/426/426766.shtm(有关XMLHTTP) 比爱情少一点,比友情多一点,即不讨厌又不来电,你能做到吗? 请教一个问题,一个分两帧的窗口,分别是两个CView的子类。一个view里的下拉框选中一条记录,使另一个view刷新。不知道用什么mfc函数。 有关新开窗口的问题! please intrduce a good muti-root soft for win95,win98,winme,win2000,winxp 求助:哪位大侠能介绍一下网络传输设备(象 HDSL、Cable Modem)的品牌、厂家和性能? 我的ie浏览器怎么了? 搞软件开发时应不应该是一边看书一边搞开发? 请教:C中的共同体是什么?谁能解释一下或举例说明 关于线程套间问题。 请教各位在oracle中如何在date字段下条件? Window me对ADO是不是支持的不够好??? 请问csdn.net使用shtml如何构架的! 安装Acrobat后,只出现一个PDF Writer虚拟打印机,Adobe Distiller却死活装不上,不知是何原因? sybase anywhere5.0 支持 mid 函数吗,如果支持该怎么写 微软的一道面试题!!!!! help me!(53)问题解决以后再送100分 为什么我的win2000server上装不上Exchange5.5? 虚拟DVD-ROM????!!!!!!!!!!!!!!!!!!!!!!!!!!!!???? 建ORACLE网络服务名的问题!!! 数组作为地址传递到dll,在dll内进行修改,dll释放后,数组也跟着释放,怎么办呢??先谢了! 有关程序的规范写法 谁有minix操作系统的代码 PalmOS中的手写接口? 一个比较搞人的钩子问题! 获取客户端的浏览器的信息!? TMDIChildForm 是系统的一个类吗? 如何在创建新线程时传递多个参数? 数据库之间数据转换的问题。 microcp过来领分 dw长时间在编辑转态,并长时间无人操作,结果会死机???!!!! 请问怎么相应CPropertySheet里的帮助按钮?急!!! 在WIN2K SERVER上怎样启动邮件服务,也就是将win2k变成pop3和smtp服务器 starfish请进来 microcp过来领分2 我怎样汇总两个字段都一样的数目,然后相减呢?急!◎ 如何能在客户端不安装WORD的情况下能在页面上编辑Word文档 这个sql如何写?? java日期字符串問題!!!!!!!!!!!!!! 在一个单文档界面中,当用户最大化和改变窗口大小的时候,CFormView最先调用的哪一个事件? 在VB.net里对socket怎么编程啊? microcp过来领分3 VC的EXCEL自动化编程的初级问题 综合状态求摩擦力和滑动摩擦力如图所示,质量分别为m1、m2的两个物体通过轻弹簧连接,在力F的作用下一起沿水平方向做匀加速直线运动(m1在地面上,m2在空中),力F与水平方向的夹角为θ.则m1 关于静摩擦力,下列说法正确的是(  ) A.只有静止的物体才可能受静摩擦力B.有相对运动趋势的相互接触的关于静摩擦力,下列说法正确的是(  )A.只有静止的物体才可能受静摩擦力B. 滑块所受的摩擦力小于重力沿斜面向下的分力代表着什么?大于呢?或者等于呢? 计算滑动摩擦力如图所示,一个物体质量为20千克,沿水平面向右运动,同时受到一水平向左的大小为10牛的力的作用.已知此物体与地面之间的动摩擦因数为0.1.则此物体与地面之间的滑动摩擦力, 有一个数十位上是4,百分位上是9,个位和十分位上都是0,这个数字作 斜面上滑动摩擦力是重力的分力吗?为什么?初学,请耐心回答 25%的计数单位是( ),它包括有( )个这样的计数单位.25%的计数单位是( ),它包括有( )个这样的计数单位.快呀.哥们...我正忙着呢...∵ 有一个数,十位和百分位上都是9,个位和十分位上都是0,这个数是多少?读作什么? 重力沿斜面的分力大于滑动摩擦力,复制搜索 在接触面粗糙程度和压力大小一定时,滑动摩擦力是否跟拉力大小有关?拉力越大,摩擦力越大?是否,如果是,那么不就是反驳“滑动摩擦力与压力大小和接触面粗糙程度有关” 一个四位数千位上是8,十位是9,百位和个位都是0,十分位上是1,百分位上是6,这个数是( ) 1)摩擦力什么时候和运动方向相同,什么时候和运动方向相反.分别举一个例子.2)什么叫相对运动. 滑动摩擦力是否随着拉力的增大而增大书上说对于指定的物体与接触面,滑动摩擦力用公式计算是恒定的,那当物体匀速运动的时候不应该拉力等于滑动摩擦力么?还是物体做加速度的时候滑动 为什么重力和支持力是一对平衡力,而压力和支持力不是平衡力呢? 一个物体以一定的初速度滑上一个粗糙斜面受摩擦力,且摩擦力大于重力在斜面方向上的分力,物体会怎样运动实惠先减速在向下加速,还是直接向下加速? 为什么重力与支持力是平衡力?呃嗯 重力的重心,然后向下;而支持力的作用点在桌子上,虽然向上但是作用点不同啊,怎么说是作用在同一物体上呢?重力是对桌子,支持力对物体不是吗?为什么 支持力和重力还是和压力成为平衡力 Why? 平角就是一条直线,周角就是一个圆, 关于滑动摩擦力的大小和方向的题目质量为m的物体放在水平放置的钢板C上,与钢板的动摩擦因素为μ.由于受到相对于地面静止的光滑导槽A、B的控制,物体只能沿水平导槽运动.现使钢板以速度 滑动摩擦力产生条件1.接触面不光滑2.物体间相互接触且存在压力3.两物体间有____.我忘了那个空,谁能帮下.接受第一个答对的,急………… 放在水平桌面上的杯子重1N,底面积0.01m2次方.杯中水0.6L,深度0.05m的水,杯厚度不计(g=10N) ρ=1.0×10^3KG每千克1,水对杯子的底部的压力和压强.2,杯子对桌面的压强.列数式,不要文字。ρ=1.0×10^3KG每 滑动摩擦力的方向滑动摩擦力的方向是与运动方向一致还是斜向上?作用点在哪? 求10种影响物体滑动摩擦力的因素比如:接触面的大小.对接触面的压力大小 .请再举8个 放在水平桌面上的杯子重1N,底面积0.01m2次方.杯中水0.6L,深度0.05m的水,杯厚度不计(g=10N)1,水对杯子的底部的压力和压强.2,杯子对桌面的压强.快. 斜面上静止的物体,物体的重力和斜面对物体的静摩擦力能组成合力吗? 有一个数,十分位和百分位都是6,个位和十分位都是0,这个数是( ),读作( ). 英寸的单位进制是怎样的?11进制吗? 静摩擦力做正功时其反作用力一定做负功吗 一个数,百位上是1,个位上是6,百分位上是5,其余个位都是零,这个数是( ) 各个单位间的进制从厘米之类的 平方厘米 立方厘米因为主要是物理 所以 纳米的也要有希望能改成10的X次方的形式啊。我对数学不敏感 37%的计数单位是( ),它有( )个这样的单位 静摩擦力中相对运动趋势是什么意思? 有哪些进制单位如十进制二进制 37%的计数单位是多少?他有几个这样的单位? 相对运动趋势与静摩擦力物体有相对运动趋势 和 受到静摩擦力 之间没有时间间隔吧? ppmv是什么单位了/换算关系是什么?我指的ppmv单位是常用来描述大气中二氧化碳浓度的.我的积分少,还请各位多担待点! 8.37读作什么,它的计数单位是什么,有几个这样的单位急 静摩擦力产生要物体间有相对运动的趋势,这个趋势如何理解? 滑动摩擦力的方向跟物体的相对运动的方向相反这句话中的"物体相对运动的方向"是什么意思?如果没有"相对"这个词有什么不同? 物理滑动摩擦力的题当用一个大小为10N的力,水平向左推一个重力为50N的木箱,此时木箱的匀速运动速度为2m/s,则木箱受到的摩擦力为_____N;当木箱匀速直线运动的速度为4m/s时,它受到的摩擦力 动摩擦力和静摩擦力是什么 相对运动和相对运动趋势呢?最好举几个例子 角的度量单位如何四舍五入? 一个滑动摩擦力的题目,用6N的力拉一个物体,匀速直线运动,若用8N的里来拉,则滑动摩擦力是多少 静摩擦力的方向总与物体相对运动趋势方向相反请分析 请问,摩擦力一定与相对运动(或相对运动趋势)方向相反吗? 关于重力在斜面上分力的问题重力为G的物体,放在倾角为θ的斜面上,重力G沿斜面的分力大小为 Gsinθ,垂直于斜面的分力大小为 Gcosθ.这个是为什么呢?能不能说得清楚一点,遇到了这个有点超纲 一个数由3个1,5个百分之一和7个千之一组成,这个数写作( ),读作( ),把这个数精确到十分位是( ) 桌面对杯子的支持力 怎样计. 摩擦力的大小可以用什么测量要精准 斜面倾角为a=37°,在斜面上放着一重为100牛的物体,求重力沿斜面方向的分力有多大, 一个数十位是7百分位是3千分位是6其余是0这个数写作()读作()精确到十分位是() 那摩擦力的大小可以用什么来测量 有一个数十位和百位上都是6,个位和十分位上都是0,这个数写作()? 一个数的十位,百分位是8,个位、十分位是6,千分位是0,这个数写作()读作() 摩擦力的大小用 来测量 滑动摩擦力与哪些因素有关 有一个数百位是1,十位是3,百分位是7,个位和十分位都是6,这个数写作( ),读作( ). 滑动摩擦力方向问题http://hi.baidu.com/%BED%C8%F4%D1%A9%C2Q/album/item/9b18a6dcb2c885705882dd68.htmlB以速度v1行驶,A以速度V2行驶,V1>V2,如果在AB之间出现滑动摩擦力,则B施于A的摩擦力方向是—A施于B的滑动摩擦 摩擦力的大小与压力成正比 静止摩擦力总是阻碍物体运动的 物体受到的摩擦力一定是静摩擦力判断正误 如图,物体在斜面,摩擦力会等于重力在斜面上的分力吗?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn