使用 PouchDB 作为爱知乎的数据库
发布于 10 年前 作者 nihgwu 11008 次浏览 最后一次编辑是 8 年前

博客: http://liteneo.com/2014/07/14/izhihu-with-pouchdb/

最近一直很忙,没时间弄自己的东西。周末的时候抽了半天时间为 爱知乎 添加了数据库支持,数据库采用 PouchDB 。 <!-- more --> 我一直认为像 爱知乎 这种结构极其简单的网站完全没必要用上数据库,所以经过不断的迭代进化,包括添加 七牛 云储存,添加 拼图模式 (都需要引入相应的 module ),我也一直没有给 爱知乎 添加数据库支持的打算,这次之所以使用了数据库完全是为了给我的下一个网站做准备,练练手。

在没有使用数据库之前,爱知乎 的所有数据都是以文本的形式存储在硬盘里,对于需要经常访问的数据则是直接放到内存,比如:

存储一篇内容

var path = 'story/' + id + '.json';
var story = JSON.stringify(item);
fs.writeFile(path, story);

读取一篇内容

router.get('/story/:id', function (req, res, next) {
  var file = "story/" + req.params.id + ".json";
  if(!fs.existsSync(file))  return next();
  var json = JSON.parse(fs.readFileSync(file));
  res.render('story',{title:json.title, story: json});
});

数据检索采用系统自带的文件检索功能,是不是很简单。


使用 PouchDB 存储数据之后:

存储一篇内容

db.put(item, 'story-' + item.id).catch(function (err) {});

读取一篇内容

router.get('/story/:id', function (req, res, next) {
  db.get('story-' + req.params.id).then(function (json) {
    res.render('story', {title: json.title, story: json});
  }).catch(function (err) { return next(err) });
});

也很简单,所以为 爱知乎 添加数据库支持也很简单,主要是需要注意 PouchDB 一些特别的地方以及异步处理就OK了。

采用了数据库之后最明显的好处有:

  • 数据文件空间占用降低
  • 不需要进行 JSON 数据处理
  • 数据查询更加简单

PouchDB 是什么大家可以自行搜索(不过网上关于 PouchDB 的内容真的很少,基本上都是一段极其简短的介绍,很少有生产使用方面的资料),我就不赘述了,我只简单讲讲我为什么会选择 PouchDB 作为数据库。

首先,因为我本来就不打算用数据库,所以即便是采用数据库,我也不想太复杂,越简单越好,所以我我选数据库主要考虑一下几点:

  • 不需要开启额外服务,MongoDB、MySql 被排除
  • 不需要写 SQL 查询,SQLite 被排除(不是决定性因素,我最开始想到的就是 SQLite)
  • 支持 Node.js

于是就在 Github 上搜,找到了一个 levelup,采用了 leveldown 作为 LevelDB 的后端绑定,不过因为 LevelDB 是一个键值对数据库,不方便做稍微复杂一点的查询,于是就找到了以 PouchDB ,一个受 CouchDB 启发的 javascript 数据库,同样采用了 leveldown 作为 Node.js 环境的后端服务,除了通过 id 获取数据之外还提供了 Map/Reduce 方式的查询功能,能够满足我的需求,简单对比了下 PouchDBSQLite3 的性能,SQLite3 完败,于是就这么愉快的决定了,采用 PouchDB 作为数据库。

以后有时间再补上我使用 PouchDB 的一些体会

4 回复

期望能够看到更多关于PouchDB的信息。

你也用过 PouchDB?国内这方面的资料几乎等于0

@nihgwu 好像这个站点没开源?

@kingapple 这种站也就那点事,加起来也就不到500行代码而已

回到顶部