CouchDB 作为 NoSQL 潮流中的一份子,很容易被拿来与被贴上一样标籤 (buzzwords) 的资料库作为比较。各个专桉分别被贴上 key-value stores、tuple stores、BigTable Clones、Document store、Graph database 等等标籤。
这些标籤分类有时很容易帮助程式设计者概略瞭解后段实做的技术属性,但很多时候,程式设计者的预设看法也可能是错误且偏颇的。我们可以说这些新技术都是想解决 CAP theorem 问题,但其实这些不同的资料库计划各有其想要解决的问题与开发哲学,如果以概括性的功能特徵来作为选择技术的方式,很多时候会发现专桉发展方向不一定适合自己需求。程式设计者应该先定义自己的问题后,再选择属性最适合的技术。
CouchOne 的开发者 Mikeal Rogers 曾说过,近期的产业浪潮掩盖了各专桉实际要解决的问题,取而代之是对于 Big Data 的想像与期待。Mikeal 那麽就让其他人(与旧资料库业者)去追寻 NoSQL 的浪潮吧,CouchDB 可以专注于处理 Mobile Database。
CouchDB 特色
试用了 CouchDB 一阵子,几个特别欣赏的特色功能,简介如下:
* Implemention for ACID Properties
** Multi-Version Concurrency Control (MVCC)
** B-Tree indexes
* Schema-Free document-oriented database
* RESTful JSON API
* View model / JavaScript View Functions
* Replication (Peer-based distributed databases), Distributed, featuring robust, incremental replication with bi-directional conflict detection and management.
CouchDB 使用 MVCC model,所有的资料库写入 (add, update, delete) 都不需要先 lock 资料库,因此能保证可以即时读出资料。索引则是靠 B-Tree 大量存于硬碟,Document 会建立一份索引,利用 MapReduce pattern 设计的每一份 View,也会存取一份索引,因此你的资料库会佔用大量硬碟空间来换取速度。
CouchApp 配合浏览器使用起来很方便且支援权限功能,因为资料可以是随意的 Json document,所以爱存什麽就存什麽。此外 API 界面是 RESTful,加上内建 Javascript 的 View Server,你可以用内建的 Show 功能来 Render Document。
最重要的特色是 Replication 功能。CouchDB 支援双向冲突侦测,很方便长期离线的 Client 上线后快速同步资料库内容,在离线状态也可以存取已经拉回的资料。
CouchDB 目前限制
虽说 CouchDB 使用 MVCC Model,但 CouchDB 的读写速度远远慢于 in-memory key-value,与 MySQL 评测也未能够胜出。加上 CouchDB 只支援 Replication,要作 Horizontal partitioning 要靠 CouchDB Lounge,等同于手动作 Sharding,在效能跟弹性上都未能够胜过其他资料库系统。
此外,作为存取 unstructured data 的代价,若想要查询特别资料,必须依赖 View Model,每组 View 会建出独立的 b-tree index,这种索引的代价颇高,特别是你想做 ad hoc query 时,使用 _temp_view 会浪费你大量的磁碟与 CPU 的运算资源。因此程式设计者在设计软体与键入资料前,都必须先建好 View。
虽然 View functions 用了 MapReduce pattern,但碍于 CouchDB View API 的限制,目前很难做多次的资料处理。基本上一次 View 倒出来的资料仅限制一次查询,你无法方便快速的做第二次 MapReduce 处理,如此缺乏弹性让 MapReduce 反而像是一种限制,而非特色。
除了 Big Data 以外相关应用
捨去上述限制不谈,CouchDB 的特色仍然可以作很多应用,特别是 JSON API 与 Peer-based distributed 这两个功能。这使 CouchDB 在 Laptop 或 Mobile devices 上可以很方便地提供一些应用,特别是你经常需要在离线装置上处理伺服器与本地端资料时。
除了像是 CouchOne 推出相容 CouchDB 的 CouchOne Mobile for Android。在 Linux 上则有 Desktop Couch,目前整合了 Tomboy、Evolution、Bindwood for Firefox 等,可以用来管理 PIM, Bookmarks 等等。理论上可以整合 UbuntuOne 或 Midgard。
笔者读过两本谈论 CouchDB 的书籍,第一版的《CouchDB: The Definitive Guide》与《Beginning CouchDB》。个人比较推荐《Beginning CouchDB》,但再版的《CouchDB: The Definitive Guide》内容已经有改善。
◎ 作者简介 蔡志展 (Rex Tsai) 或网名 chihchun,现为自由工作者,从事开源软体顾问或开发服务。倡议并推广自由软体与开放源码,早期 KaLUG 成员,现常出席 Tossug, HackingThursday 聚会,亦是开源人年会 (COSCUP) 筹备志工。长期 Debian、OpenWrt 使用者。关注议题甚广,进一步资讯请参考 http://people.debian.org.tw/~chihchun/
这些标籤分类有时很容易帮助程式设计者概略瞭解后段实做的技术属性,但很多时候,程式设计者的预设看法也可能是错误且偏颇的。我们可以说这些新技术都是想解决 CAP theorem 问题,但其实这些不同的资料库计划各有其想要解决的问题与开发哲学,如果以概括性的功能特徵来作为选择技术的方式,很多时候会发现专桉发展方向不一定适合自己需求。程式设计者应该先定义自己的问题后,再选择属性最适合的技术。
CouchOne 的开发者 Mikeal Rogers 曾说过,近期的产业浪潮掩盖了各专桉实际要解决的问题,取而代之是对于 Big Data 的想像与期待。Mikeal 那麽就让其他人(与旧资料库业者)去追寻 NoSQL 的浪潮吧,CouchDB 可以专注于处理 Mobile Database。
CouchDB 特色
试用了 CouchDB 一阵子,几个特别欣赏的特色功能,简介如下:
* Implemention for ACID Properties
** Multi-Version Concurrency Control (MVCC)
** B-Tree indexes
* Schema-Free document-oriented database
* RESTful JSON API
* View model / JavaScript View Functions
* Replication (Peer-based distributed databases), Distributed, featuring robust, incremental replication with bi-directional conflict detection and management.
CouchDB 使用 MVCC model,所有的资料库写入 (add, update, delete) 都不需要先 lock 资料库,因此能保证可以即时读出资料。索引则是靠 B-Tree 大量存于硬碟,Document 会建立一份索引,利用 MapReduce pattern 设计的每一份 View,也会存取一份索引,因此你的资料库会佔用大量硬碟空间来换取速度。
CouchApp 配合浏览器使用起来很方便且支援权限功能,因为资料可以是随意的 Json document,所以爱存什麽就存什麽。此外 API 界面是 RESTful,加上内建 Javascript 的 View Server,你可以用内建的 Show 功能来 Render Document。
最重要的特色是 Replication 功能。CouchDB 支援双向冲突侦测,很方便长期离线的 Client 上线后快速同步资料库内容,在离线状态也可以存取已经拉回的资料。
CouchDB 目前限制
虽说 CouchDB 使用 MVCC Model,但 CouchDB 的读写速度远远慢于 in-memory key-value,与 MySQL 评测也未能够胜出。加上 CouchDB 只支援 Replication,要作 Horizontal partitioning 要靠 CouchDB Lounge,等同于手动作 Sharding,在效能跟弹性上都未能够胜过其他资料库系统。
此外,作为存取 unstructured data 的代价,若想要查询特别资料,必须依赖 View Model,每组 View 会建出独立的 b-tree index,这种索引的代价颇高,特别是你想做 ad hoc query 时,使用 _temp_view 会浪费你大量的磁碟与 CPU 的运算资源。因此程式设计者在设计软体与键入资料前,都必须先建好 View。
虽然 View functions 用了 MapReduce pattern,但碍于 CouchDB View API 的限制,目前很难做多次的资料处理。基本上一次 View 倒出来的资料仅限制一次查询,你无法方便快速的做第二次 MapReduce 处理,如此缺乏弹性让 MapReduce 反而像是一种限制,而非特色。
除了 Big Data 以外相关应用
捨去上述限制不谈,CouchDB 的特色仍然可以作很多应用,特别是 JSON API 与 Peer-based distributed 这两个功能。这使 CouchDB 在 Laptop 或 Mobile devices 上可以很方便地提供一些应用,特别是你经常需要在离线装置上处理伺服器与本地端资料时。
除了像是 CouchOne 推出相容 CouchDB 的 CouchOne Mobile for Android。在 Linux 上则有 Desktop Couch,目前整合了 Tomboy、Evolution、Bindwood for Firefox 等,可以用来管理 PIM, Bookmarks 等等。理论上可以整合 UbuntuOne 或 Midgard。
笔者读过两本谈论 CouchDB 的书籍,第一版的《CouchDB: The Definitive Guide》与《Beginning CouchDB》。个人比较推荐《Beginning CouchDB》,但再版的《CouchDB: The Definitive Guide》内容已经有改善。
◎ 作者简介 蔡志展 (Rex Tsai) 或网名 chihchun,现为自由工作者,从事开源软体顾问或开发服务。倡议并推广自由软体与开放源码,早期 KaLUG 成员,现常出席 Tossug, HackingThursday 聚会,亦是开源人年会 (COSCUP) 筹备志工。长期 Debian、OpenWrt 使用者。关注议题甚广,进一步资讯请参考 http://people.debian.org.tw/~chihchun/
//---------------一下是我的读后感
在国内,相比MongoDB ,CouchDB实在是很冷。冷的原因诚如上面文章所提,以空间换取时间的读写速度比不上MySQL,分布式架构要手动,API仅能一次查询,未能二次筛选。这几个方面都是致命的,对于数据来说。
有缺点,必有特点。特点就是采用JSON格式存储, 以及更新就产生新版本,使得CouchDB作为离线数据库用用还不错。