面向文档的数据库 CouchDB

来源:developerWorks 中国 作者:成 富
  
Apache CouchDB 是一个面向文档的数据库管理系统。它提供以 JSON 作为数据格式的 REST 接口来对其进行操作,并可以通过视图来操纵文档的组织和呈现。 CouchDB 是 Apache 基金会的顶级开源项目。本文将介绍 CouchDB 的基本概念,包括文档、视图,REST API,并通过一个实际的图书点评网站来说明如何用 CouchDB 开发 Web 应用。

CouchDB 介绍

CouchDB 是一个文档型数据库服务器。与现在流行的关系数据库服务器不同,CouchDB 是围绕一系列语义上自包含的文档而组织的。 CouchDB 中的文档是没有模式的(schema free),也就是说并不要求文档具有某种特定的结构。 CouchDB 的这种特性使得相对于传统的关系数据库而言,有自己的适用范围。一般来说,围绕文档来构建的应用都比较适合使用 CouchDB 作为其后台存储。 CouchDB 强调其中所存储的文档,在语义上是自包含的。这种面向文档的设计思路,更贴近很多应用的问题域的真实情况。对于这类应用,使用 CouchDB 的文档来进行建模,会更加自然和简单。与此同时,CouchDB 也提供基于 MapReduce 编程模型的视图来对文档进行查询,可以提供类似于关系数据库中 SQL 语句的能力。 CouchDB 对于很多应用来说,提供了关系数据库之外的更好的选择。下面介绍 CouchDB 中的一些重要概念。

基本概念

文档(document)
文档是 CouchDB 中的核心概念。一个 CouchDB 数据库实际上是一系列文档的集合,而这些文档之间并不存在层次结构。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。每个文档都有一个全局惟一的标识符(ID)以及一个修订版本号(revision number)。 ID 用来惟一标识一个文档,而修订版本号则用来实现多版本并发控制(Multiversion concurrency control,MVVC)。在 CouchDB 中,文档是以 JSON 对象的形式保存的。
视图(view)
视图是 CouchDB 中文档的呈现方式。在很多情况下,应用都需要对文档进行一定的处理,包括过滤、组织、聚合和生成报表等。在关系数据库中,这通常是通过 SQL 语句来完成的。 CouchDB 中的视图声明了如何从文档中提取数据,以及如何对提取出来的数据进行处理。

扩展概念

设计文档
设计文档是一类特殊的文档,其 ID 必须以_design/开头。设计文档的存在是使用 CouchDB 开发 Web 应用的基础。在 CouchDB 中,一个 Web 应用是与一个设计文档相对应的。在设计文档中可以包含一些特殊的字段,其中包括:views包含永久的视图定义;shows包含把文档转换成非 JSON 格式的方法;lists包含把视图运行结果转换成非 JSON 格式的方法;validate_doc_update 包含验证文档更新是否有效的方法。
附件
CouchDB 中也可以保存二进制文件。这些文件是以文档的附件形式存储的。 CouchDB 支持两种形式的附件:一种是内嵌型的,附件是以 base64 编码的格式作为文档的一个字段保存;另一种是独立型,附件是独立于文档保存和管理的。附件的存在使得可以在 CouchDB 中保存 Web 应用中的 HTML、CSS 和 JavaScript 文件。

在开发 Web 应用之前,下面将先介绍 CouchDB 的安装与配置。





CouchDB 安装与配置

Apache CouchDB 目前的最新发布版本是 0.9.0 。它可以安装在主流的操作系统中,包括 Windows、Linux、Unix、Mac 和 Solaris 。需要注意的是 Windows 上的安装包目前还在测试阶段,并且只有 0.8.1 版本的。而本文中 的 Web 应用需要用到 0.9.0 版本的功能,因此下面主要介绍在 Ubuntu 9.0.4 上安装和配置 CouchDB 0.9.0 。

首先从 CouchDB 的官方网站(见参考资料)下载 0.9.0 的发布包并解压缩,接着需要安装 CouchDB 依赖的组件,包括 Erlang、ICU 和 OpenSSL 等,最后是构建和安装 CouchDB 。完整的脚本如代码清单 1 所示。


清单 1. CouchDB 在 Ubuntu 9.0.4 上的安装脚本
apt-get install build-essential erlang libicu-dev libmozjs-dev libcurl4-openssl-dev 
 wget http://labs.xiaonei.com/apache-mirror/couchdb/0.9.0/apache-couchdb-0.9.0.tar.gz 
 tar -xzvf apache-couchdb-0.9.0.tar.gz 
 cd apache-couchdb-0.9.0 
 ./configure 
 make && sudo make install

从安全的角度考虑,不建议使用超级用户来运行 CouchDB,而是为 CouchDB 新建一个专门的普通用户,由该用户来负责 CouchDB 的运行和管理。在 Ubuntu 上,可以运行代码清单 2 中的脚本来创建该用户。


清单 2. 创建与配置 CouchDB 专有用户的脚本
sudo adduser --system --home /usr/local/var/lib/couchdb --no-create-home \ 
            --shell /bin/bash --group --gecos "CouchDB Administrator" couchdb 
 chown -R couchdb:couchdb /usr/local/etc/couchdb 
 chown -R couchdb:couchdb /usr/local/var/lib/couchdb 
 chown -R couchdb:couchdb /usr/local/var/log/couchdb 
 chown -R couchdb:couchdb /usr/local/var/run 
 chmod -R 0770 /usr/local/etc/couchdb 
 chmod -R 0770 /usr/local/var/lib/couchdb 
 chmod -R 0770 /usr/local/var/log/couchdb 
 chmod -R 0770 /usr/local/var/run

安装配置完成之后,就可以启动 CouchDB 了。通过运行代码清单 3 中的脚本就可以启动 CouchDB 。在 CouchDB 启动完成之后,会显示“ Apache CouchDB has started,time to relax. ”。接下来就可以用浏览器访问地址http://127.0.0.1:5984/_utils/index.html来使用 CouchDB 自带的管理工具 Futon 。在安装完成之后,建议在 Futon 中运行 CouchDB 自带的测试集来确定安装是否正确。图 1 中给出了在 Futon 中运行测试集的界面。


清单 3. 启动 CouchDB 的脚本
sudo -i -u couchdb couchdb -b


图 1. 在 Futon 中运行 CouchDB 自带的测试集
CouchDB自带的测试集

在安装和配置 CouchDB 完成之后,下面将介绍用来操作数据库的 REST API 。





REST API

CouchDB 提供 REST API 来供客户端程序使用 CouchDB 的功能,并对数据库进行操作。。 REST API 主要针对 CouchDB 中的三种资源:数据库、文档和视图。下面分别介绍这三种 REST API 的细节。

数据库 REST API

数据库 REST API 用来查询、创建和删除数据库。 CouchDB 中数据库的名称只能是小写字母、数字以及特殊字符_$()+-/。需要注意的是大写字母是不允许的,这是由于某些操作系统的文件系统是大小写不敏感的。 CouchDB 为了避免可能出现的问题,限制了不能使用大写字母。数据库 REST API 的具体用法如下:

 

  • 通过 GET 请求访问 URL/_all_dbs可以查询 CouchDB 中所有的数据库名称。该请求返回的是一个 JSON 数组,其中每个元素表示一个数据库名称。
  • 通过 GET 请求访问 URL/databasename/可以查询名为databasename的数据库的具体信息。该请求返回的是一个 JSON 对象。
  • 通过 PUT 请求访问 URL/databasename/可以创建名为databasename的数据库。如果数据库创建成功的话,返回 HTTP 状态代码 201 ;如果已有一个同名数据库的话,返回 HTTP 状态代码 412 。
  • 通过 DELETE 请求访问 URL/databasename/可以删除名为databasename的数据库。如果数据库删除成功的话,返回 HTTP 状态代码 200 ;如果数据库不存在,返回 HTTP 状态代码 404 。

 

文档 REST API

文档 REST API 用来查询、创建、更新和删除文档。具体的用法如下:

 

  • 通过 GET 请求访问 URL/databasename/doc_id可以获取名称为databasename的数据库中 ID 为doc_id文档的内容。文档的内容是一个 JSON 对象,其中以“ _ ”作为前缀的顶层字段是由 CouchDB 保留使用的,如_id和_rev。
  • 通过 PUT 请求访问 URL/databasename/doc_id可以在名称为databasename的数据库中创建 ID 为doc_id的文档。通过 POST 请求访问 URL/databasename/也可以创建新文档,不过是由 CouchDB 来生成文档的 ID 。
  • 通过 PUT 请求访问 URL/databasename/doc_id可以更新已有的文档。在 PUT 请求内容的文档中需要包含_rev字段,表示文档的修订版本号。 CouchDB 使用该字段来做更新时的冲突检测。如果该字段的值与 CouchDB 中保存的该文档的修订版本号一致,则表明没有冲突,可以进行更新。当更新完成之后,返回 HTTP 状态代码 201 ;否则返回 HTTP 状态代码 409,表示有版本冲突。
  • 通过 DELETE 请求访问 URL/databasename/doc_id?rev=rev_id可以删除数据库databasename中 ID 为doc_id,并且修订版本号为rev_id的文档。

 

视图 REST API

视图是 CouchDB 中文档的呈现方式。在 CouchDB 中保存的是视图的定义。 CouchDB 中有两种视图:永久视图和临时视图。永久视图保存在设计文档的views字段中。如果需要修改永久视图的定义,只需要通过文档 REST API 来修改设计文档即可。临时视图是通过发送 POST 请求到 URL/databasename/_temp_view 来执行的。在 POST 请求中需要包含视图的定义。一般来说,临时视图只在开发测试中使用,因为它是即时生成的,性能比较差;永久视图的运行结果可以被 CouchDB 缓存,因此一般用在生产环境中。

附件 REST API

前面提到,CouchDB 有内嵌型和独立型两种附件存储方式。内嵌型附件是保存在文档的_attachments字段中。每个附件都包含名称、MIME 类型和数据等三项内容。附件的实际数据是以 base64 编码的形式保存在文档中的。对内嵌附件进行操作的 REST API 与文档 REST API 是类似的,只需要修改_attachments字段即可。在请求文档的时候,附件的实际数据默认是不包含的,包含的只是附件的元数据,如代码清单 4 所示。可以通过在请求的时候添加参数attachments=true来包含实际数据,不过这会降低性能。在请求附件的内容时,CouchDB 会自动进行 base64 解码。也就是说只需要在保存附件的时候进行 base64 编码,获取附件的时候,并不需要客户端代码完成解码的工作。


时间:2009-08-07 09:10 来源:developerWorks 中国 作者:成 富 原文链接

好文,顶一下
(3)
100%
文章真差,踩一下
(0)
0%
------分隔线----------------------------


把开源带在你的身边-精美linux小纪念品
无觅相关文章插件,快速提升流量