Home > news > Introducing… CouchDB!

Introducing… CouchDB!

December 12th, 2007 :: jackyz

pi1ot 同学提了一个问题:

javaeye上看到的“用Erlang开发的文档数据库系统CouchDB”是个什么东西,啥叫文档数据库啊

这是一个好问题,因为我也老见到这个名字,但总不知其所以然,因此,特地作了一下 research ,将我了解到的,与诸君共享。

啥叫文档数据库?

CouchDB FAQ 里面这么写:

A CouchDB document is an object that consists of named fields. Field values are lists that may contain strings, numbers and dates.

晕啊,这段虫族文翻过来,我大致这么理解:它是一个数据库,它的里面存放文档。没了!怎么能没了呢?是的,它就是没了,没有 schema, 没有 table, 没有 record,也没有 sql 。就是这样的数据库了,抓狂去吧。哈哈。其实,这个玩意并不罕见。

从概念上,和 Erlang 的 dict ,或者 Java/.Net 的 hashmap ,以及 Oracle 收购的 BerkleyDB可以模糊糊糊的看作一类东西。尤其是你用自己的生物 CPU 把 XML 和 Json 或者 Term 都模糊为“数据”的话。

HaHa,就是一个大 Hash !

那么,CouchDB 是个什么东西?

首先 couchDB 的 couch 是 Cluster Of Unreliable Commodity Hardware 的缩写,即“由不可靠的廉价硬件组成集群”(是不是听起来似曾相识呢?没错,google 提起自己的核心技术的时候,也常常这么说),单就名字而言,就能嗅到野心勃勃的味道。这个计划是由 Mysql 的工程师 Damien Katz发起的。目前,它的核心特性包括:

- a REST API using JSON instead of XML for data transport,
- a JavaScript view engine based on Mozilla Spidermonkey,
- a GNU Autotools build system supporting most POSIX systems (Noah Slater) ,
- a built-in administration interface (Christopher Lenz),
- experimental fulltext search with Lucene (Jan Lehnardt) and
- countless tweeks, enhancements and other small refinements.

如果这个列表看的你一头雾水,那太正常了,我也是哦。这里核心的关键词是 —— Json !没错,就是这个东西。所以,看到如下的 related project 列表就不足为奇了:

* CouchObject (Ruby client + JsServer for views in Ruby)
* CouchDb-Ruby
* CouchDB4J Java bindings
* Levitz – XUL based CouchDb utility client
* Erlang interface to CouchDB
* Perl interface, Net::CouchDb
* CouchDB Python Library
* CouchDB Common Lisp Library
* jQuery CouchDB Library
* Another PHP library for CouchDb

换句话说,如果以 CouchDB 为 DB ,那么你几乎可以用星球上的任何一种语言来访问它。而且,如果你语言恰好不支持(如果连 Http/Json 都不支持,我很怀疑这样的语言可以做什么用),你很快就能自己写一个出来。

其次,呃……,没有其次了(想必 Replication RESTful JavaScript Lucene 这些关键词你早已耳熟能详不用我废话了 )。

畅想下,一个特别 2.0 的技术小组,借助 CouchDB 仅仅用到 Javascript (CouchDB 就是 DB ,其中的 Javascript view 就是 SQL,Javascript json 就是 Protocol,界面?莫不是 Javascript + HTML 的一颗小菜?)就能在 CouchDB 之上,通过“纯Javascript的方式”搞出一个巨复杂的 Web 2.0 应用,开发速度以小时计哇,什么 Ror Zend ErlyWeb 的统统无视(都没有数据表,搞那些浪费生命的劳什子做甚?)。哈哈……。《如来神掌》之Web开发版秘籍在此,5毛一本。

那么,和 Erlang 有什么关系?

呃,没有说么?CouchDB 是用 Erlang 写的。实际上,还有 C(SpiderMonkey) 。

其他

关于 couchDB,infoq 有一篇很不错的介绍文章(RDBMS is not Enough)(中文翻译)。其中还提到了RDDB,是一个 CouchDB 的 Ruby 跟随项目 。

news

  1. pi1ot
    December 13th, 2007 at 07:19 | #1

    一头雾水变成半头雾水,其实我最兴趣的是他为什么说“性能更高”?仅仅是erlang版的bdb或者memcached吗?在他的code网站上找不到文档,代码暂时也没时间分析(其实是我的erlang语法还不过关…)

  2. jackyz
    December 14th, 2007 at 10:03 | #2

    晕死,咱们对照一下 robbin 的原文:

    一、CouchDB是分布式的数据库……。

    利用 erlang 的分布式能力,在两个 couchDb 或多个 couchDb 之间建立 replication ,通过这种方式解偶目前对于服务器端 db 的“单点”性要求(如,我有 n 个 db ,在任何一个上做操作,数据都会自动同步到其他的 db 上去,此乃 couch 这个缩写的要义)。

    二、CouchDB是面向文档的数据库,存储半结构化的数据,比较类似lucene的index结构,特别适合存储文档,因此很适合CMS,电话本,地址本等应用,在这些应用场合,文档数据库要比关系数据库更加方便,性能更好。

    从上下文上看,我理解 robbin 意思的重点是“在这些应用场合”,说的是“实现某类业务,若采用 db 很麻烦,而用 docdb 会很简单,同时性能也比 db 要好”,而不是“ couchDb vs bdb/memcache 的性能比较”。

    “性能更好”这种结论只能通过严格公正的实测来得出,作为 Erlang 的粉丝,虽说我也乐于见到 Erlang 的项目比其他技术实现具有更好的性能,但咱们还是要讲实验精神,拿数据说话,不能一看到 Erlang 的项目就认为其性能一定会好(实际上,我自己拿 Erlang 做的实验项目,性能就糟糕得很)。既然目前没有看到任何一方公布这样的测试结果,那么,对于“性能更好”这种问题,也就没有办法得出结论。

    三、CouchDB支持REST API,可以让用户使用JavaScript来操作CouchDB数据库……。

    这是目前的 n 种 docdb 中为 couchDb 所独有的特性,这也是它给 web app 的开发模式带来的具有革命性意义的关键之所在。这个地方讲的是“开发效率”“开发模型”“开发语言”和“开发人员”。从某种意义上说,这是 killer 特性。这就好比,RoR 做的网站,若不小心优化很容易会有性能问题,但其具有 killer 特性的“高开发效率”,使得相比之下“明显较低的运行性能”也不能妨碍 n 多项目对其趋之若骛。

  3. pi1ot
    December 14th, 2007 at 10:40 | #3

    如果只是replication机制,基本上成型的db都有,连嵌入式的bdb都有,如果只是个大hash,以我对erlang的了解,似乎想不出优势会在什么地方。
    搞大web的,看到性能两个字就两眼冒光,有点神经过敏。

  4. jackyz
    January 4th, 2008 at 11:48 | #4

    关于 CouchDB 的最新消息是——作者本人已获得 IBM 的资助(用来专做 CouchDB 项目),而且有可能会成为 Apache 的正式项目。

    请看这里

  5. January 4th, 2008 at 20:32 | #5

    这样的《如来神掌》可以放到Internet上跑吗?
    javascript对客户是完全暴露的
    匿名的客户可以知道口令,随意修改CouchDB 中保存的数据

  6. jackyz
    January 6th, 2008 at 11:15 | #6

    @YIN,不会存在你所担心的问题。验证/权限,这些东西在 HTTP 中就已经被支持了,RESTFUL 的应用直接拿这些机制来用就是了,至于这个应用是用Javascript写的还是用C写的,有那么大的差别么?

  7. January 15th, 2008 at 20:20 | #7

    @jackyz,比如我们用couchDB 和Javascript写一个在线购书的网站的应用,
    Javascript怎么连接couchDB,怎么完成验证/权限?
    有什么连接密码用户看不到?
    怎么保证用户不可以修改couchDB的其他记录?
    就像我们在一个Powerbuild+sqlserver做的C/S系统一样,放在内网当然没问题,可以开源了,放在Internet上能跑吗?
    那用户就都可以直接连接sqlserver,想做什么就做什么了!
    B/S系统中用户只是提交表单而已,不能直接连接数据库,从而解决了这个问题.

    couchDB 和Javascript的《如来神掌》相当于
    Powerbuild+sqlserver做的C/S系统,放在Internet上能跑,还是开源了的,能安全吗?

  8. January 15th, 2008 at 20:22 | #8

    不是Javascript写的还是用C写的问题
    关键是你必须把操作数据库的代码放在server上
    你认为呢?

  9. January 15th, 2008 at 20:29 | #9

    比如你的线购书的网站
    正常时数据库要记录
    购买表:某用户,某书,1本
    收款表:某用户,某书,10元
    你javascript里的代码能够防止用户记录成
    购买表:某用户,某书,100本
    收款表:某用户,某书,10元
    吗?
    别的地方没代码了啊.

  10. January 15th, 2008 at 20:38 | #10

    是每个购书者都在数据库中对应一个数据库用户吗?
    显然,这是不可能的,internet上的用户太多了.
    整个应用对应一个数据库用户,
    而且用户名和密码还要写在avascript里,
    那我想做什么就做什么了!
    怎么解决呢?

  11. jackyz
    January 20th, 2008 at 08:04 | #11

    @YIN,没有深入研究过CouchDB的开发细节,你所说的安全问题,我还不知道其解决方案是什么。

    我上一个回复的意思是:Http协议本身就已经定义了Auth机制,RESTful应用的安全可以从这一点来着眼。

    既然RESTful是基于URL来定义资源的,因而,也就可以很方便的在URL的基础上来对于资源的访问进行控制(除了简单的ACL,还可以据此定义更复杂的RBAC)。

    具体到CouchDB来开发应用,如果期望这个任务能在Browser端用纯JavaScript得到完成,可能并不是很现实。不过,比如说,在服务端给URL增加几个filter也不会是很复杂的事情。(比如,可以对URL“/cart/$NAME/*”定义一个限制“$AUTH_USER=$NAME”,而除了filter,没准还会有更好的方式。)

    因为有了这个filter在服务端,严格意义上讲,也就不能再继续宣称整个应用是纯客户端JavaScript完成的《如来神掌》,这个说法是对的。但我想这个更严格的定义应该不是我们在讨论开发效率时所用的Context。因为,一方面这个访问控制层可以是高度可配的独立控件(就好比Apache的某个模块);另一方面,“在关键的业务环节,不能信任客户端的提交,必须进行服务端的校验”这也是Web(or电子商务)编程的基本原则之一,任何的架构模式下恐怕也都是必须的。

  12. Daze
    January 26th, 2008 at 18:53 | #12

    很好玩的东东啊,不过上面各位好像有点各说各话的意思!

    @YIN,似乎你所说的 Javascript 是指在浏览器中执行的吧?

    Javascript 只是一种语言,可以做为浏览器的脚本,自然也可以做为 CouchDB 的脚本,CouchDB 集成了 SpiderMonkey 引擎,所以,就像你说的,操作数据库的代码确实是在 Server 上啊。

  1. February 13th, 2009 at 15:49 | #1