CouchDB文档存储全解析
立即解锁
发布时间: 2025-08-20 02:20:04 阅读量: 2 订阅数: 2 


CouchDB权威指南:从入门到实践
### CouchDB 文档存储全解析
#### 1. 文档基础概念
文档是 CouchDB 的核心数据结构。要理解和使用 CouchDB,就得从文档的角度去思考。文档是自包含的数据单元,类似于记录。数据通常由整数、字符串等原生类型组成,而文档是对这些原生类型的第一层抽象,它为原始数据提供结构并进行逻辑分组。例如,一个人的身高可以编码为整数(如 176),但这个整数通常是更大结构的一部分,包含标签(“height”: 176)和相关数据({"name":"Chris", "height": 176})。
文档中包含的数据项数量取决于应用程序,也与后续视图的使用方式有关。一般来说,一个文档大致对应编程语言中的一个对象实例。比如在在线商店应用中,商品、销售记录和商品评论都可以作为对象,进而成为文档。
文档与普通对象略有不同,它通常有作者和 CRUD(创建、读取、更新、删除)操作。基于文档的软件围绕文档保存构建存储模型,以确保作者能找回自己创建的内容。在 CouchDB 应用中,还可以给予展示层更多的灵活性。同时,验证函数的存在让我们无需担心坏数据导致系统出错。
如果用户可以对商品进行评论,一种做法是将评论作为数组存储在商品文档中,这样查找商品评论很方便,但扩展性不佳。热门商品可能会有大量评论,因此更好的做法是将评论建模为文档集合。CouchDB 提供了访问集合的模式,我们可以一次只显示 10 或 20 条评论,并提供上一页和下一页的链接。通过视图可以方便地对文档进行有意义的分组。
#### 2. JSON 文档格式
设计应用程序时,确定数据的表示和存储格式是关键步骤。以 JavaScript 编写的博客应用为例,CouchDB 借用了 JavaScript 的 JSON 数据格式,使得在编程时可以直接将文档作为原生对象使用,避免了很多问题。
下面是一个博客文章的 JSON 格式示例:
```json
{
"_id":"Hello-Sofa",
"_rev":"2-2143609722",
"type":"post",
"author":"jchris",
"title":"Hello Sofa",
"tags":["example","blog post","json"],
"format":"markdown",
"body":"some markdown text",
"html":"<p>the html text</p>",
"created_at":"2009/05/25 06:10:40 +0000"
}
```
- **_id 和 _rev**:这两个成员用于 CouchDB 的内部管理,标识文档的特定实例。_id 用于构建文档的 URL,方便查找。例如,在数据库 movies 中存储 _id 为 Jabberwocky 的文档,可通过 URL /movies/Jabberwocky 访问。_rev 是文档的版本号,每次文档更改都会创建新的版本并更新 _rev。保存文档时,必须提供最新的 _rev,以确保操作的是最新版本。
- **其他字段**:
- **type**:是应用级别的参数,用于确定应用于文档的验证规则。
- **author 和 title**:分别表示文章的作者和标题,作者字段通常由验证函数锁定,只有作者可以编辑文章。
- **tags**:以数组形式存储文章的标签,这种非规范化存储方式很适合 CouchDB。
- **format 和 body**:博客文章以 Markdown 格式编写,用户输入的 Markdown 文本存储在 body 字段。
- **html**:在保存文章前,Sofa 会在客户端浏览器将 Markdown 转换为 HTML 存储在 html 字段。
- **created_at**:用于在 Atom 订阅源和 HTML 索引页面中对博客文章进行排序。
#### 3. 编辑页面
要将博客文章存入数据库,首先需要构建创建和编辑文章的界面。编辑页面的 show 函数用于渲染 HTML 页面,以下是 Sofa 编辑页面的 show 函数代码:
```javascript
function(doc, req) {
// !json templates.edit
// !json blog
// !code vendor/couchapp/path.js
// !code vendor/couchapp/template.js
// we only show html
return template(templates.edit, {
doc : doc,
docid : toJSON((doc && doc._id) || null),
blog : blog,
assets : assetPath(),
index : listPath('index','recent-posts',{descending:true,limit:8})
});
}
```
其中,!json 宏用于从 templates 目录加载 edit.html 模板,这些宏由 CouchApp 在部署到 CouchDB 时运行。函数的其余部分是使用从文档中提取的数据渲染 HTML 模板。当文档不存在时,将 docid 设置为 null,这样同一模板可用于创建新文章和编辑现有文章。
#### 4. HTML 框架
保存文档所需的 HTML 部分包含一个用于接受编辑的表单,以下是示例代码:
```html
<!-- form to create a Post -->
<form id="new-post" action="new.html" method="post">
<h1>Create a new post</h1>
<p><label>Titl
```
0
0
复制全文
相关推荐










