为了实现博客系统,又撸了个JSON数据库……

有不少程序员朋友都喜欢使用 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 --

相关推荐
xiaofeichaichai20 分钟前
Webpack
前端·webpack·node.js
问心无愧051338 分钟前
ctf show web入门111
android·前端·笔记
唐某人丶1 小时前
模型越来越强,我们还需要 Agent 工程吗?—— 从价值重估到 Harness 实践
前端·agent·ai编程
智码看视界1 小时前
现代Web开发基础:全栈工程师的起航点
前端·后端·c5全栈
JS菌1 小时前
手写一个 AI Agent 全栈项目:从沙箱执行到子智能体的完整实现
前端·人工智能·后端
excel2 小时前
HLS TS 文件损坏的元凶:Git 提交与拉取
前端
Aphasia3113 小时前
https连接传输流程
前端·面试
徐小夕3 小时前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
threelab3 小时前
Three.js 物理模拟着色器 | 三维可视化 / AI 提示词
开发语言·前端·javascript·人工智能·3d·着色器