有不少程序员朋友都喜欢使用 Hexo 作为自己的 blog 系统,Hexo 采用纯文本保存数据,Markdown 文章格式,使用渲染引擎,允许按照用户的自定义主题进行渲染,将文章和表现进行了彻底的分离,高度允许定制化,受到了广大程序员朋友的欢迎。
最近,我在实现一款 Hexo 博客的客户端软件,不得不研究了一下 Hexo 的原理。原来 Hexo 下面藏了一个轻量级文本数据库 ------ warehouse,正是靠着这个数据库,才实现了对互相关联的博客内容数据进行有效的管理。
数据库用法展示
毕竟这个 JSON 数据库只是一个 Hexo 的副产品,用于解决博客内容实体关系管理,以及快速索引查询等问题,所以,作为一个独立的库,竟然几乎不提供什么文档。导致如果想上手去理解这个东西,变得很累人,还好,代码不是太多,硬着头皮看了点。
js
var Database = require('warehouse');
var db = new Database();
var Post = db.model('posts', {
title: String,
created: {type: Date, default: Date.now}
});
Post.insert({
title: 'Hello world'
}).then(function(post){
console.log(post);
});
这是官方版本库首页提供的一个用例,可能这就是唯一有力的一份文档了。
核心概念
下面,就我阅读代码后的理解,对一些核心概念进行解释。
1. Database
Database 对象,是整个数据库的持久化引擎。虽然起名叫 DB,但是不能像 MySQL 或者 Redis 那样去理解,这个 DB 本质上就是一个单个的 json 文件的逻辑封装。
Database 对象,提供了如何载入(load)和保存(save)的方法,负责跟磁盘交互数据。
2. Model
Model 是一个抽象概念,象征着逻辑的模型,就是数据库里实际管理的对象。这个对象,提供了抽象对象层面的增删改查操作,有点像的我们一般谈及的 MVC 编程模型里的 M。
3. Schema
Schema 顾名思义,就是指一个对象的物理结构,比如有哪些字段,这些字段是什么类型的,都在 Schema 里指定。不难想象,一个 Model 里必然会包含一个 Schema,Model 只是规范了逻辑层面的结构,而 Schema 则具体定义了里面的每个字段,
4. Document
Document 是对数据的抽象,相当于 MySQL 数据库里的一行数据。Model 是所有这一类数据的抽象,Schema 是这一类数据的字段定义,而 Document 就是具体的一行数据了。
5. Query
Query 是对查询的抽象,提供了数据库查询的常见接口,不难想象,Model 里面除了包含一个 Schema,肯定也会包含一个 Query,因为对 Model 的各种操作,最后都要作用在 Query 上来实现。
源码分析
js
var Database = require('warehouse');
var db = new Database();
var Post = db.model('posts', {
title: String,
created: {type: Date, default: Date.now}
});
Post.insert({
title: 'Hello world'
}).then(function(post){
console.log(post);
});
再次看一遍这个代码,现在就很好理解了。
首先,创建一个 Database 实例,当然,这里没有指定文件的存储路径,实际项目里,不会这么用。
在数据库上,我们首先定义了一个 Model 就是 Post,可以理解成一张表,这个表有两个字段,一个是 title,另一个是 created,前者是字符串类型,后者是 Date类型。
然后,我们调用 Model 上的 insert 方法,插入了一行数据,只指定了 Post 的 title 字段。
应用
实际上,这个类库的应用场景是非常小的,可能仅用于 Hexo 一个系统中。不过,我觉得这跟他几乎不提供文档也有关系。
在处理小量的实体关系模型,又不方便使用数据库的情景下,可以使用这样一款基于本地存储的 JSON 数据库,提供了很轻量的实现和简单的查询接口。用起来非常方便。
不过因为没有考虑分布式存储的问题,不合适大规模应用,只适合单机应用,或者适合离线应用场景。
最后,我要实现一款 Hexo 的客户端软件,通过 warehouse 的 API,我就可以直接读取数据库建立的信息,而不用很辛苦地去分析磁盘上的文件了。
-- End --