阅读更多

3顶
0踩

数据库

转载新闻 非关系型数据库 NoSQL 的崛起

2012-12-06 17:10 by 副主编 WnouM 评论(7) 有11065人浏览
《连线》杂志网络版近日刊载文章,对NoSQL(非关系型数据库)的来源与历史进行了追溯。文章主要介绍了最古老的NoSQL数据库之一CouchDB,这种数据库的创造者达米安•卡茨受到了在线协作平台Lotus Notes的启发,他的故事有助于帮助解释NoSQL运动的兴起,及为何这种数据库与以往的数据库存在如此巨大的差异。


CouchDB的创造者达米安·卡茨


以下是这篇文章的全文:

在追溯NoSQL运动的源头时,大多数互联网人士都会想到谷歌和亚马逊。

随 着自身网络服务日益取得巨大而成功的增长,谷歌和亚马逊需要新的方法来存储不断增加的服务器所带来的数量庞大的数据,于是两家公司都为此而创造了一个新的 软件平台——谷歌构建了BigTable平台,而亚马逊则构建了Dynamo平台。在这两家互联网巨头发布研究论文来描述其各自的数据存储平台以后,其他 许多公司也都寻求进行复制。

其结果是,一支NoSQL(非关系型数据库)“大军”就此产生,这种数据库是专为在数千台服务器之间运作而设计的。这些新时代的软件平台——包括Cassandra、HBase和Riak等——对数据库市场进行了改造,不仅有助于Facebook和Twitter等诸多互联网巨头的运作,同时也涵盖了更多的传统业务。

“如 果你看看市场上所有的NoSQL解决方案,那么就会发现每一种解决方案都能追溯至亚马逊Dynamo论文或谷歌BigTable论文。”云计算公司 Joyent首席技术官贾森•霍夫曼(Jason Hoffman)说道。“如果谷歌或是亚马逊没人曾写过一份学术报告(来描述NoSQL平台)的话,那么今天的世界将会是个什么样子呢?”

好 吧,如果真是那样,那么世界还将拥有另一种最古老的NoSQL数据库之一,那就是CouchDB。CouchDB的创造者达米安•卡茨(Damian Katz)并未受到谷歌、亚马逊或是其他任何网络巨头的启发,而是受到了在线协作平台Lotus Notes的启发,这个平台最初是在二十世纪七十年代和八十年代开发的。

虽然 Lotus Notes以身为一个电子邮件系统而闻名于世,但事实上它并非只是个电邮系统,同时还是构建依赖于数据库的应用的基础——换句话说,是有组织的信息集合。 通过使用Lotus Notes这个平台,企业能构建从开支申报应用到IT帮助桌面工具等所有东西。卡茨就是构建这种应用的人之一,他从1995年开始就为Lotus开发 Notes应用。他表示,即使是在那时,这个平台也已经展示出一些特性,而正是这些特性让今天的NoSQL数据库取得了如此之大的成功。

正 如其他NoSQL后继者一样,Lotus Notes也同样来自于关系数据库的“领地”。关系数据库是建立在关系数据库模型基础上的传统数据库,借助于集合代数等概念和方法来处理数据库中的数据。 “那是一个复杂的系统,能通过关系数据库让原本难以做到的事情变得简单。”卡茨说道。

从 很多方面来说,卡茨的故事都有助于帮助解释NoSQL运动的兴起——以及为何这种数据库与以往的数据库存在如此巨大的差异。虽然这场运动毫无疑问是取得了 成功,但NoSQL数据库的概念仍旧很难确定下来——“NoSQL意味着如此之多且各有不同的事情,要看你正在讨论什么而定。”谷歌杰出工程师安德鲁•菲 克斯(Andrew Fikes)最近曾这样对我们说道——在整个科技行业中,还有很多人尚未把握到这些新数据库的重要性。

“NoSQL” 其实该算是用词不当,因为NoSQL数据库并不是为了摒弃SQL(Structured Query Language,结构化查询语言,这是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展 名);更好的名称本来应该是“non-relational database”(非关系型数据库)。NoSQL数据库不使用为关系数据库提供支撑的整齐数据图表。

NoSQL数据库拥有两种基本特性:首先,这种数据库能在许多服务器之间延展——允许用户在必要时候扩大运算,甚至是在不同的地理位置之间也可以——其次,这种数据库能给用户带来按自己喜欢的方式架构数据的自由度,正是这第二个特性与Lotus Notes非常相似。

柏拉图式的理想

Notes 平台是受PLATO Notes的启发而创造出来的,后者是一个在伊利诺斯大学PLATO主机上运行的在线社区。PLATO Notes的创造者大卫•伍利(David R. Woolley)曾在1994年写道,这个项目始于1973年,当时还只是一个简单的报错系统。在最开始的时候,人们通过编辑一个文本文件的方式来报错, 但这种方式带来了一些问题。

“那样做根本没有安全性可言,想要确切地知道是谁写了一份报错文件是不可能做到的。”伍利说道。“大多数人都会报错时签上名字或至少是名字的首字母缩写,但没有什么东西能强制他们这样去做。有些时候,会有爱开玩笑的人觉得,删除整个文件是件很有意思的事情。”

因 此,当时年仅17岁的伍利就被分配到了一项任务,那就是创造一个更具结构性的系统来报错。他开发出来的工具允许用户将其报错报告输入到一个应用中去,该应 用会把报告保存为文本文件,并加上用户的姓名和提交日期。然后,支持部门的员工能分屏显示和查看这些文件,就像我们今天的电子邮件客户端一样:报错报告列 表在上面,报告文本在底下。

随后,所有这些信息会被保存为一个大的文本文件,而不是关系数据库。今天,我们将其称为“文件数据库”(document database)。

你可以把一个关系数据库看作一个庞大的电子表格,数据以图表、行和列的方式组织起来。如果你想要增加一个域,那么就新增一列,这一列会在表格的每一行中出现,从而让你的数据变得结构化和统一化,但管理许多无结构性的数据或是以多种方式构建结构的数据则要困难一些。

文件数据库更像是文件的集合,每一个“入口”都是一个文件,而且都能拥有自己的结构。如果你想要对一个“入口”添加一个域,那么这样做的同时不会对其他任何“入口”造成影响。

不久以后,PLATO开发者就添加了更多的Notes应用。到二十世纪七十年代末,他们拥有了一个电子邮件应用,一个一般用途留言板,以及网络游戏等,诸如此类。

在 1984年,雷•奥兹(Ray Ozzie)——一名Lotus开发者,在伊利诺斯大学上学时曾在PLATO工作过——离开了Louts,自己开创了一家名为Iris Associates的公司。随后,Lotus对这家公司进行了投资,双方签署了一项协议,内容是Lotus将拥有使用Iris旗舰产品的独家权利:一个 基于PLATO的企业用系统。

时至今日,许多人都认为Lotus Notes是一个过时的系统,应该像WordPerfect和Novell Netware那样被扔进同一个垃圾桶。但是,Notes为它之后的几乎所有类型的企业通信和协作应用铺平了道路,从微软Outlook电子邮件客户端到Jive Software等社交网络工具再到CouchDB数据库都是如此。

卡茨与CouchDB

1995年时,卡茨以夏季实习生的身份加入Lotus;大约就在同一时间,Lotus被IBM收购。卡茨在Lotus Notes顾问部门工作了一段时间,然后又回到这家公司,加入了Iris团队,当时Iris已被Lotus正式收购。

在 Iris,卡茨对Lotus Notes的精髓作出了改进。他重写了为Formula提供支持的引擎,这是用来开发Notes应用的脚本语言。卡茨表示,当时他远不能胜任这项工作,但 他同时认为自己天生就是要写代码的人。“每完成一个@function,我就跟打了一针毒 品似的;我就像是个瘾君子,在不停地寻找下一个需要修补的地 方。”他后来在自己的博客中这样写道。

卡茨在2005年离开Lotus,加盟了一家名 为Koobie的创业公司;但在不久以后,他就启动了一项事业,目标是将Lotus Notes的思潮带入现代社会,这最终演变成了CouchDB。卡茨曾在一篇早期的博客中谈到这个项目,当时他写道:“Couch就是为网络而从头开始构 建的Lotus Notes。”

最初版本的CouchDB使用一种类似于 Formula的编程语言,但不久以后卡茨就带领这个项目走向了新的方向,从平台转变成了一个专用的数据库。“MySQL是其人气度达到顶峰的产物。”卡 茨说道。“当时如果你告诉人们说,你在开发某种类似于Lotus Notes的东西,那么就会让他们发出惊叹的声音。”

在 这条发展的道路上也存在不少坎坷。在2007年初,卡茨到了Sun Microsystems的MySQL团队工作,放弃了构建CouchDB的工作。但是,这个开源项目吸引了其他的开发者坚持不懈地为之努力,其中著名的 有詹•雷纳德(Jan Lehnardt)和诺亚•斯莱特(Noah Slater)等。斯莱特推出了JSON,在当时以文本文件来对数据进行结构化的新格式。在Sun休陪产假时,卡茨最后替换了整个CouchDB存储引 擎,用XML取代了JSON。在那时,卡茨认识到与使用Formula式的引擎相比,使用网络应用标准语言JavaScript可能是一种更好的想法。 “一旦我们推出JavaScript以后,”他说道,“这个项目就真正腾飞了起来。”

Couch的商业化

在 2007年,“复活”后的CouchDB受到了IBM的关注。不久以后,卡茨的名字回到了这家公司的工资单上,负责全职开发CouchDB。最为关键的 是,IBM同意将这个项目捐给非营利组织Apache基金会(Apache Foundation),这意味着IBM还不得不向开发者和CouchDB用户授权使用该公司的相关专利。这也就是说,IBM将无法起诉CouchDB侵 犯了与Lotus Notes相关的专利。

与此同时,NoSQL运动则全速展开。谷歌和亚马逊的论文令这种模式——此前已经有开源开发者倡导这种模式——变得流行起来,同时也为如何让其在现实世界中运作起来提供了某种深刻的理解。

一 家名为10gen的公司从2007年开始致力于开发一个名为MongoDB的NoSQL文件数据库,用BigTable作为参照模式。“那是完全独立 的,MongoDB、Couch和Lotus Notes两两之间没有太多的平行之处。”10gen创始人德怀特•梅里曼(Dwight Merriman)说道。一年以后,Facebook开放了Cassandra的源码,那是一个NoSQL数据库,整合了来自于Dynamo和 BigTable的概念。到2009年,随着CouchDB、Cassandra、MongoDB及其他NoSQL数据库加速发展,科技博客 ReadWriteWeb提出了一个问题,那就是关系型数据库是否已注定灭亡。

与此同时,当时供职于Last.fm的约翰•奥斯卡森(Johan Oskarsson)主持召开了首次NoSQL会议,无意中给这场原本定义松散的运动起了一个名字。

在 形势一片大好的大肆宣传浪潮中,卡茨、雷纳德和克里斯•安德森(J. Chris Anderson)创立了Couch.io,来对CouchDB进行商业化。到这个时候,一个由麻省理工学院物理学家组成的团队已经开创了一家名为 Cloudant的CouchDB公司,致力于开发自己版本的数据库,这个数据库名为BigCouch。虽然Couch.io(后来更名为 CouchOne)难以在现实世界中找到自己的位置,但很快就通过与另一家NoSQL公司Membase合并的方式找到了自己的立足点。

Membase 需要一名新的首席技术官,而CouchOne则需要一名首席执行官;Couch需要一种更好的方式来将规模扩大至大量的服务器,而这正是Membase所 能提供的;Membase需要一种更好的数据结构,而CouchDB能提供这种结构;很可能最重要的是,Membase拥有被卡茨认为是能够持续运营的商 业模式。在合并以后,新公司和新的数据库都被命名为Couchbase。

但是,此次合 并交易所带来的一个麻烦的结果是与Apache基金会的关系破裂。“我们真的曾付出过很多努力来让这种变化同步发生。”卡茨说道。“但到最后的结果是,与 Apache项目所能达到的前进速度相比,我们需要的速度要快得多。”最终的结局是,卡茨决定放弃他自己创立的项目,全心致力于Couchbase的发 展。在2012年1月份,也就是合并交易完成的一年以后,他在自己的博客上发表了一封措辞强硬的“告别信”,写道:“CouchDB的未来是什么?那就是 Couchbase。”

斯莱特此时已经成为Apache的CouchDB项目负责人,他用一条简短的Twitter消息对此作出了回应:“CouchDB的未来还是CouchDB。”

卡 茨承认,他原本可以处理得更加老练一些,但说到最后,这个故事证明了NoSQL已经变得多么活力四射。开发者仍在顽强地致力于开发CouchDB,哪怕没 有卡茨的参与也还是坚持不懈。Cloudant也仍旧致力于开发CouchDB,承诺将把BigCouch的代码还给这个项目。

Couchbase也正处在发布2.0版本数据库的边缘,此前该公司已经争取到了NTT DoCoMo和AOL等大客户。文件数据库的想法在开发者的脑海中已经生根,这不仅要感谢CouchDB及其诸多分支,同时也要感谢MongoDB所带来的人气。

与此同时,IBM则将放弃Lotus这个品牌名;Notes则将继续生存下去,至少现在是这样。在它的背后可能是最好的年华,但它为未来更多的美好时光搭好了舞台。

附:数据库大事年表

  • 1961年:通用电气着手开发Integrated Data Store(IDS,集成数据存储)。通常来讲,IDS被认为是第一个“完全的”数据库。在今天的NoSQL数据库出现的数十年以前,IDS所做的就是如今NoSQL和大数据的工作。
  • 1967:IBM 开发出Information Control System and Data Language/Interface(ICS/DL/I,信息控制系统与数据语言/界面),这是阿波罗(Apollo)项目的分级数据库。ICS随后变 成了Information Management System(IMS,信息管理系统),与IBM的System360主机整合到一起。
  • 1970年:IBM研究员埃德加•科德(Edgar Codd)发表题为《大型共享数据库的关系模型》(A Relational Model of Data for Large Shared Data Banks)论文,建立了关系型数据库所使用的数学基础。
  • 1973年:大卫•伍利(David R. Woolley)开发出了PLATO Notes,用一个文本文件作为报错系统的数据存储方式。PLATO Notes对随后Lotus Notes的出现形成了影响。
  • 1974 年:IBM着手开发System R,将科德的关系型数据库模型变成了现实,首次使用了SQL(结构化查询语言),随后这个系统演变成了商业化产品IBM DB2。在科德研究的启发下,伯克利大学的学生迈克尔•斯通布雷克(Michael Stonebraker)和尤金•王(Eugene Wong)开始开发INGRES,它随后成为了PostGreSQL、Sybase及其他许多关系型数据库的基础。
  • 1979年:第一个公开可用版本的Oracle数据库发布。
  • 1984年:雷•奥兹(Ray Ozzie)成立Iris Associates,创造了一个受PLATO Notes启发的组合件系统。
  • 1988年:由文件数据库提供支持的Lotus Agenda发布。
  • 1989年:Lotus Notes发布。
  • 1990年:Objectivity发布了期间对象数据库。
  • 1991年:Key-value类型数据库Berkeley DB发布。
  • 2003年:Live Journal开放最初版本Memcached的源码。
  • 2005年:达米安•卡茨(Damien Katz)开放CouchDB源码。
  • 2006年:Google发表BigTable论文。
  • 2007年:亚马逊发表Dynamo论文。10gen开始编制MongoDB代码。Powerset开放BigTable clone克隆版Hbase的源码。
  • 2008年:Facebook开放Cassandra源码。
  • 2009年:科技博客ReadWriteWeb提出一个问题:“关系型数据库是否已注定灭亡?” Redis发布。首次NoSQL会议在旧金山召开。
  • 2010年:Memcached项目的一些负责人与社交游戏公司Zynga开放Membase源码。
  • 大小: 23.9 KB
来自: 腾讯科技
3
0
评论 共 7 条 请登录后发表评论
7 楼 transist 2013-01-10 09:41
mongodb在并发查询压力下频繁crash;虽然数据插入速度快,但即使做replica sets,也会造成部分数据不一致,只能说NoSQL的适用场景有限。
6 楼 allenny 2012-12-10 13:07
kjj 写道
freish 写道
nosql解决了几个重要的问题就能大范围使用:1、事务 2、抽象的标准API

能解决事务问题,基本就可以击溃传统sql了


鱼与熊掌不可兼得,混合模式才是正道。
5 楼 kidneyball 2012-12-10 08:33
kjj 写道
freish 写道
nosql解决了几个重要的问题就能大范围使用:1、事务 2、抽象的标准API

能解决事务问题,基本就可以击溃传统sql了


CAP理论已经证明了一个系统不可能同时获得高可用性,高一致性和高分区容错性。而任何一个在线系统都不可能牺牲可用性去换其他特性。传统sql(ACID体系数据库)强调可用性和一致性,nosql提供可用性和分区容错性。nosql的立足点就是牺牲一定的一致性去换分区容错性。除非CAP被推翻了,否则nosql是不会完全取代传统sql的。
4 楼 kjj 2012-12-09 14:25
freish 写道
nosql解决了几个重要的问题就能大范围使用:1、事务 2、抽象的标准API

能解决事务问题,基本就可以击溃传统sql了
3 楼 zg_wxl 2012-12-08 23:04
看用在哪了  关系复杂的业务 就不能用了
这东西最近还是很火的   我还不会   后期关注
2 楼 freish 2012-12-07 17:10
nosql解决了几个重要的问题就能大范围使用:1、事务 2、抽象的标准API
1 楼 white_crucifix 2012-12-07 10:28
沙发~ Couch

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • cef和ie基于mfc相互通信

    该资源是使用vs2013基于mfc,加载cef和自带的ie浏览器,实现cef的JavaScript和ie的JavaScript相互通信,希望对各位纠结cef浏览器的朋友有一定帮助。

  • localstorage浏览器标签页跨域数据交互解决方案

    最近做个项目,需要两个不同域名的标签页能共享数据,最开始用的是最直接的方式直接用POST或GET方式发送数据,让服务器中转一下。后来又觉得只要本地的两个浏览器标签页能够交换数据就行,何必绕路去服务器那绕一圈回来,又耽误时间又没必要,搞技术嘛就是要有追求,要尝试各种可能。现代浏览器因为安全策略问题是不允许浏览器写硬盘上的文件的,读是可以的,比如读的json文件读个txt文件啥的,实在要写也行,写入文件后会把写入修改后的文件作为一个下载项下载保存。这就不是鄙人想要的效果了,鄙人只是想弄一个共享区域让两个...

  • VC浏览器相关的学习(四)(在BHO中获取IE版本以及获取窗体句柄)

    值得注意的是IE6,IE7,IE8的窗体组织完全不一样,需要用VS自带的工具Spy++查看确定a 获取IE版本    int CMyRock::GetIEVersion() { CComPtr pDocDisp; // Doc CComQIPtr pHtmlDoc2; // HtmlDoc CComQIPtr pWindow; // 窗体 CComQIPtr pNavigator; // 浏览器 HRESULT hRes = m_spWe

  • 【前后端交互与HTTP协议】(HTTP协议、本地存储、Ajax&Fetch 与跨域请求)

    每一次的前后端通信,前端需要主动向后端发出请求,后端接收到前端的请求后,可以给出响应(HTTP是一个请求-响应协议)

  • 实现和IE浏览器交互的几种方法的介绍(二)

    法。IDispatch是从IUnknown中继承的一个接口的类型,通过COM接口提供的任何服务都可以通过IDispatch接口来实现。IDispatch::Invoke的工作方式同vtbl幕后的工作方式是类似的,Invoke将实现一组按索引来访问的函数,我们可以对Invoke方法进行动态的定制以提供不同的服务。Invoke方法的表示如下: STDMETHOD(Invoke)(DISPID

  • 浏览器调用exe并从中获取内容的通用解决方案之浏览器和本地exe通信篇

    除了IE支持OCX可以直接在浏览器内部,其他所有现代浏览器都不支持内嵌exe执行并交互返回内容了 采用的是本地HttpListener监听端口,然后前端轮询jsonp的方式实现浏览器和本地exe通信,浏览器兼容性高,只要是支持xhr的浏览器都行, exe程序启动可以依靠自定义协议在浏览器打开或者将exe打包成window服务持久化运行即可 以下是基础Http类 using System; using System.Collections; using System.Collections.Generic;

  • 实现和IE浏览器交互的几种方法的介绍

    如何实现对IE浏览器中对象的操作是一个很有实际意义问题,通过和IE绑定的DLL我们可以记录IE浏览过的网页的顺序,分析用户的使用行为和模式。我们可以对网页的内容进行过滤和翻译,可以填写网页中经常需要用户填写的Form内容等等,我们所有的例子代码都是通过VC来表示的,采用的原理是通过和IE对象的接口的交互来实现对IE的。实际上是采用COM的,我们知道COM是和语言无关的一种二进制对象交互的模式,所以

  • 网址拦截和弹出窗口的屏蔽

    STDMETHODIMP CIEPlugCom::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pvarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr){ USES_CONVERSION;  if(!pD

  • Duilib中Webbrowser事件完善,使其支持判断页面加载完毕

    在多iframe的页面中,需要结合DISPID_DOCUMENTCOMPLETE和DISPID_NAVIGATECOMPLETE2两个事件判断页面是否加载完毕,而duilib中没有提供对DISPID_DOCUMENTCOMPLETE的支持。要支持DISPID_DOCUMENTCOMPLETE,需要修改UIWebBrowser.cpp、UIWebBrowser.h和WebBro...

  • Duilib中Webbrowser事件完善使其支持判断页面加载完毕

    在多iframe的页面中,需要结合DISPID_DOCUMENTCOMPLETE和DISPID_NAVIGATECOMPLETE2两个事件判断页面是否加载完毕,而duilib中没有提供对DISPID_DOCUMENTCOMPLETE的支持。 要支持DISPID_DOCUMENTCOMPLETE,需要修改UIWebBrowser.cpp、UIWebBrowser.h和WebBrowserEvent...

  • 使用JavaScript开发IE浏览器本地插件实例

    主要介绍了使用JavaScript开发IE浏览器本地插件实例,本文讲解使用JS+注册表的方式开发一个IE浏览器本地插件,需要的朋友可以参考下

  • 日常开发IE浏览器的坑及解决方法总结(二)

    Object.defineProperty 添加监听 IE浏览器不支持 Object.defineProperty。ie上写了先提醒缺少参数或者某个参数不能为false,然后去掉对应的参数就会显示不支持 Object.defineProperty 这是因为,IE浏览器有支持 Object.defineProperty ,但是值允许在操作DOM时使用,对于和vue中对于某个变量进行监听是不支持的。在网上找了一个 工具文件 ,地址是:https://gitee.com/ambit/object-definepr

  • IE 控件一些高级使用方法

    IE 控件一些高级使用方法作者:杨老师下载源代码本文介绍如下内容1、如何显示内存中的 HTML 网页;2、如何屏蔽掉鼠标右键的上下文菜单;3、如何扩展 HTML 中的脚本(external)对象;4、如何显示 HTML 样式的对话窗;5、如何执行 HTML 脚本;一、如何显示内存中的 HTML 网页  或者因为网页保密的考虑;或者因为软件分发的考虑,有的时候就需要让 IE 或 IE 浏览器控件

  • 21. IE WebBrowser控件的基本使用

    综合使用COM的自动化接口、连接点最好的例子就是IE WebBrowser控件,这也是最常用的一个COM控件,借助它我们可以用网页编写界面、调用本地代码,也就是当前流行的混合式程序。本文详述了IE控件的基本使用,包括静态创建、动态创建和事件响应,并对创建过程的atl代码进行剖析,清楚的画出了整个创建脉络。

Global site tag (gtag.js) - Google Analytics