什么是CouchDB

No Comments

CouchDB 是:

  1. Apache开源的面向文档的数据库管理系统(Document-Oriented Database),
  2. 以 Web 应用程序为主要目标而开发的,
  3. 用Javascript以类似于Map/Reduce方式进行查询(query)和索引(index),
  4. 并可以通过RESTful JSON API以HTTP request访问的,
  5. 非关系型数据库(NRDBMS/NOSQL).

“Couch”是”Cluster Of Unreliable Commodity Hardware”(不可靠的廉价硬件集群)的首字母缩写.它反映了 CouchDB 的目标具有高度可伸缩性(Scalability),提供了高可用性(Reusability)和高可靠性(Reliability),即使运行在容易出现故障的硬件上也是如此。CouchDB最终采用Erlang语言开发和测试.CouchDB 的 logo 是一个斜跨式坐在沙发上的人,下方还标注”relax”,表达的涵义不言而喻。

一.面向文档的数据库CouchDB和关系型数据库的区别

CouchDB 是围绕一系列语义上自包含的文档而组织的.这意味着相关文档的所有数据都储存在该文档中 -而不是关系数据库的关系表中. CouchDB 中的文档是没有模式的(schema free).也就是说并不要求文档具有某种特定的结构.事实上,面向文档的数据库中根本不存在表、行、列或关系.不需要在实际使用数据库之前定义严格的模式.如果某个文档需要添加一个新字段.它仅需包含该字段,从而不影响到数据库中的其他文档.因此,文档不必为没有值的字段储存空数据值.

举个例子,为了描述一个名片的信息,我们可能要建立一个”Person”表,一个”Company”表,一个”Contact Details”表,一个”名片”表.这些表都有严格定义的列和键.并且使用一系列的连接(join)组装数据.如果”Contact Details”里面包括有’phone number’和’fax number’,而如果某个用户名片信息里面的’fax number’为空的话,在显示名片的时候不能显示,fax number:没有.应该是压根不体现这项.在面向文档的数据库中.每个名片都储存在各自的文档中.并且每个文档都可以定义它需要使用的字段.因此,对于没有’fax number’的人而言,就不需要定义传真的值.而对于有’fax number’的人.则根据他们的意愿定义该值.

在我们的生活中.有很多document,比如信件,账单,笔记等.他们只是简单的信息,没有关系的需求.我们可能仅仅需要存储这些数据.这样的情况下,CouchDB应该是很好的选择.当然其他使用关系型数据库的环境也可以使用CouchDB来解决.

使用CouchDB,意味着我们不需要像使用RDBMS一样,在设计应用之前首先负责设计数据表.我们的开发更加的快速,灵活.


二.CouchDB实现原理


couchdb_sketch.png

1.底层存储结构

CouchDB是Document Oriented的.文档格式是一个JSON字符串.类似于{“name”:”Jack”,”Birthday”:”1976/12/09″,”Address”:”Haidian,Beijing”}或者是二进制附件.底层结构是由一个”存储”(Storage)(存储文件的后缀名是.couch) ,以及多个”视图索引”(View index).”储存”用来储存文件,”视图索引”用于查询处理.最底层的数据结构是两类B+tree实现Key-Value的搜索.

第一类B+tree: by_id_index,(使用Document的id作为Key).通过Document的id查询document的位置.

第一类B+tree: by_seqnum_index,(使用序列号作为Key,就是每次记录最新的Revision来作为Key).每次Document更新时都会产生一个新的序列号.同步复制的追踪,数据的显示以及更新与它都密不可分.

2.一切皆追加

所有的更新操作(CUD,创建,更新,删除)都是在couch文件尾部采取Append追加的方式.一切皆追加必然导致要”瘦身”(Compaction)

3.MVCC(Multi-Version Concurrency Control)多版本并发控制

CouchDB没有锁的机制提供了MVCC,如果客户端持有先前的B+tree索引,它就可以得到快照试图,即是更新不断进行,客户端也不会看到变化,在在线备份和瘦身方面非常有用.许多现代数据库也逐渐移到MVCC上来了,如Oracle(V7以后)和Microsoft Sql Sever 2005及以后.


三.RESTful JSON API

1.安装

在Ubuntu9.10环境下CouchDB的安装是非常简单的.一条命令搞定: sudo aptitude install couchdb


install_couchdb_ubuntu.png
2.测试,打开Firefox,输入http://127.0.0.1:5984/ 看到welcome界面,说明安装成功.

couchdb_install_welcome.png
CouchDB提供了一个管理界面,叫Futon(果然是很Relax的一帮人)`~^~`,可以自己建立Database和Document,不多说了.

couchdb_futon.png