使用 PouchDB 作为爱知乎的数据库(Nodejs版)

使用 PouchDB 作为爱知乎的数据库(Nodejs版)

博客: 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 作为爱知乎的数据库(Nodejs版)

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

最近一直很忙,没时间弄自己的东西。周末的时候抽了半天时间为 爱知乎 添加了数据库支持,数据库采用 PouchDB

没有使用数据库之前

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

存储一篇内容

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 存储数据之后

使用 PouchDB 存储数据之后,操作变得更加简单。以下是使用 PouchDB 存储和读取数据的示例代码:

存储一篇内容

const PouchDB = require('pouchdb');
const db = new PouchDB('mydatabase');

// 存储数据
db.put({
  _id: 'story-' + item.id,
  title: item.title,
  content: item.content
}).catch(function (err) {
  console.error(err);
});

读取一篇内容

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

使用 PouchDB 的好处

  1. 数据文件空间占用降低:PouchDB 将数据存储在本地数据库中,减少了文件系统的负担。
  2. 不需要进行 JSON 数据处理:PouchDB 自动处理数据的序列化和反序列化。
  3. 数据查询更加简单:PouchDB 提供了丰富的查询接口,如 Map/Reduce,使得数据检索更加高效。

为什么选择 PouchDB

我选择 PouchDB 主要考虑以下几点:

  1. 不需要开启额外服务:MongoDB、MySQL 需要额外的服务支持,而 PouchDB 是一个纯 JavaScript 实现的数据库,无需额外服务。
  2. 不需要写 SQL 查询:SQLite 虽然简单,但仍然需要编写 SQL 查询语句。
  3. 支持 Node.js:PouchDB 完全兼容 Node.js 环境,并且提供了丰富的 API。

此外,PouchDB 支持离线数据同步,这对于需要频繁更新数据的应用来说非常有用。尽管网上关于 PouchDB 的资料较少,但它在实际生产环境中表现良好。

总结

使用 PouchDB 作为爱知乎的数据库是一个简单有效的解决方案。它不仅简化了数据存储和检索的过程,还提升了应用的整体性能。希望这些示例代码能帮助你在项目中顺利集成 PouchDB。


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

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

使用PouchDB作为爱知乎的数据库可以让应用在不需要额外服务的情况下实现更高效的存储和查询操作。下面是具体的一些代码示例:

安装PouchDB

首先,你需要安装PouchDB。在Node.js环境中,可以使用pouchdb包:

npm install pouchdb

存储数据

存储一篇内容到PouchDB:

const PouchDB = require('pouchdb');
const db = new PouchDB('local');

// 示例数据
const item = {
  id: '123',
  title: '如何使用PouchDB',
  content: 'PouchDB是一个轻量级的JavaScript数据库...'
};

db.put(item, 'story-' + item.id)
  .then(function (response) {
    console.log('文档已保存:', response);
  })
  .catch(function (err) {
    console.error('错误:', err);
  });

读取数据

从PouchDB中读取一篇内容:

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

查询数据

虽然PouchDB主要通过ID来获取文档,但也可以使用Map/Reduce方式来执行更复杂的查询。例如,如果想按标题查询:

db.createIndex({
  index: {fields: ['title']}
}).then(function () {
  return db.find({
    selector: {title: {$eq: '如何使用PouchDB'}}
  });
}).then(function (result) {
  console.log(result);
}).catch(function (err) {
  console.error(err);
});

总结

使用PouchDB让爱知乎的开发变得更简单,数据管理也更加高效。相比之前的纯文件存储方案,PouchDB提供了更好的数据检索能力,而且无需启动额外的服务。希望这些示例代码能帮助你在项目中顺利集成PouchDB。

回到顶部