博客: http://liteneo.com/2014/07/14/izhihu-with-pouchdb/
最近一直很忙,没时间弄自己的东西。周末的时候抽了半天时间为 爱知乎 添加了数据库支持,数据库采用 PouchDB 。
我一直认为像 [爱知乎][izhihu] 这种结构极其简单的网站完全没必要用上数据库,所以经过不断的迭代进化,包括添加 [七牛](http://qiniu.com) 云储存,添加 [拼图模式](/2014/06/23/mosaic-mode/) (都需要引入相应的 module ),我也一直没有给 [爱知乎][izhihu] 添加数据库支持的打算,这次之所以使用了数据库完全是为了给我的下一个网站做准备,练练手。在没有使用数据库之前,爱知乎 的所有数据都是以文本的形式存储在硬盘里,对于需要经常访问的数据则是直接放到内存,比如:
存储一篇内容
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 方式的查询功能,能够满足我的需求,简单对比了下 PouchDB 跟 SQLite3 的性能,SQLite3 完败,于是就这么愉快的决定了,采用 PouchDB 作为数据库。
以后有时间再补上我使用 PouchDB 的一些体会