Skip to content

CouchDB - 简介

数据库管理系统(Database Management Systems,简称DBMS)是现代应用程序的基石,提供高效的数据存储、检索和管理机制。它们大致分为关系型(SQL)数据库和非关系型(NoSQL)数据库。

RDBMS(关系型数据库管理系统): RDBMS 基于关系模型,如 PostgreSQL、MySQL 和 SQL Server,将数据存储在具有行和列的结构化表格中,并强制执行严格的模式(schema)。它们使用 SQL(结构化查询语言)进行数据操作。

NoSQL 数据库: ‘Not Only SQL’ 的缩写,这类数据库提供了更灵活的数据模型。它们通常因其水平扩展性(horizontal scalability)、模式灵活性以及处理大量非结构化或半结构化数据的能力而受到青睐。NoSQL 数据库包括:

  • 键值存储(Key-Value Stores)(例如 Redis, DynamoDB): 最简单的模型,将数据存储为键值对的集合。
  • 列族存储(Column-Family Stores)(例如 Cassandra, HBase): 将数据按列而非行存储,针对宽数据集查询进行了优化。
  • 文档存储(Document Stores)(例如 CouchDB, MongoDB): 将数据存储在灵活的、类似 JSON 的文档中。CouchDB 属于此类别。

Apache CouchDB 是一个开源的 NoSQL 文档型数据库,专注于易用性和“数据即网络”的理念。它由 Erlang 编写,Erlang 是一种以构建健壮、分布式和容错系统而闻名的语言。

CouchDB 的核心特性包括:

  • JSON 文档: 它使用普遍的 JSON 格式来存储自包含文档,允许灵活和不断演进的数据结构。
  • HTTP/REST API: 所有与数据库的交互都通过 HTTP 使用简单直观的 RESTful API 进行。您可以使用 cURL 或任何Web浏览器等标准工具与您的数据进行交互。
  • 多主复制(Multi-Master Replication): 其突出特点是其健壮的复制协议,允许数据在多个数据库副本(服务器或设备)之间轻松同步,从而支持分布式应用程序和强大的离线优先(offline-first)能力,特别是与 PouchDB 结合使用时。
  • 现代查询: 它提供了两种强大的数据查询方式:基于 JavaScript 的 MapReduce 视图(Views)用于复杂聚合,以及 Mango Query,一种基于 JSON 的查询语言,用于简单高效的数据检索。

数据以独立的文档形式存储,每个文档都有一个唯一的ID(_id)。文档是一个 JSON 对象,可以包含键值对、数组和嵌套对象的任意组合。没有强制的模式(schema),提供了极大的灵活性。

{
"_id": "a2f1b7...",
"_rev": "1-9a7c6b...",
"type": "user_profile",
"name": "Alice",
"interests": ["coding", "hiking", "music"]
}

CouchDB 使用多版本并发控制(Multi-Version Concurrency Control,简称MVCC)系统来管理数据访问。它不是在写入时锁定数据,而是创建文档的新版本,并通过新的修订令牌(_rev)进行标识。这确保了读操作永远不会被写操作阻塞,从而提供高并发性。

这种模型在文档层面提供了 ACID 特性:原子性(Atomicity)(文档更新要么完全成功,要么完全失败),一致性(Consistency)(读取始终看到一致的快照),隔离性(Isolation)(通过 MVCC 实现),以及持久性(Durability)(一旦写入被确认,数据就安全地保存在磁盘上)。

由于其仅追加(append-only)的设计,旧文档版本会在磁盘上累积。压缩(Compaction)是一个后台维护过程,通过将当前“活跃”数据写入新的数据库文件,然后丢弃旧文件来回收磁盘空间。此过程在不使数据库离线的情况下运行。

为了高效查询数据,CouchDB 会构建索引。您主要有两种工具:

  • Mango Query: 现代、推荐用于大多数查询的方式。您定义要查询的字段,CouchDB 会构建索引。然后您可以使用一个类似于 MongoDB 查询语法的简单 JSON 对象进行查询。它快速、易用,并涵盖了大多数常见用例。
  • MapReduce 视图: 对于更复杂的数据聚合、连接和报告,您可以在 JavaScript 中编写 map 和 reduce 函数。map 函数发出键值对以构建索引,可选的 reduce 函数可以对该索引执行聚合。视图功能非常强大,但学习曲线比 Mango 更陡峭。
  • CouchDB 由 Damien Katz 于 2005 年创建。
  • 它于 2008 年成为 Apache 软件基金会项目。
  • 2.0 版本是一个主要版本,引入了集群(clustering)和分片(sharding)功能,其设计基于亚马逊 Dynamo 论文的原则。
  • 最新的稳定版本是 3.x,它增强了安全性并改进了现有功能。