NoSQL的鼻祖——DBM

NoSQL的鼻祖------DBM

DBM是来自Unix的键值数据库(key-value database)(数据库系统),能够通过主键快速访问数据,可谓现在NoSQL的鼻祖。DBM(D ataB ase Manager的缩写)最初由计算机界的大佬Ken Thompson编写,于1979年发布。DBM现在也泛指一系列由此派生而来的数据库(如ndbm、gdbm、lmdb等),有时也指用于操作这些数据库的代码库(library)或例程(routine)。

不过DBM只是一个简单的数据库引擎,仅以代码库(library)的形式向用户提供一系列API,并不支持SQL语句。我们可以将DBM的数据库看作是存储在硬盘上的哈希表。

数据库引擎(database engine)

也称存储引擎,是支持数据库管理系统 (DBMS)对数据库(文件)进行CRUD的底层组件。大多数数据库管理系统都包含自己的API,允许用户通过API直接与其底层的存储引擎交互。

下面我们使用"世界上最好的语言"PHP来体验一下DBM。之所以使用PHP,是因为PHP内置了一个叫做DBA(www.php.net/manual/en/b...)的扩展,只是估计很少有人用过这个扩展吧。

bash 复制代码
$ php -r "var_dump(dba_handlers());" 
array(5) {
  [0]=>
  string(4) "ndbm"
  [1]=>
  string(3) "cdb"
  [2]=>
  string(8) "cdb_make"
  [3]=>
  string(7) "inifile"
  [4]=>
  string(8) "flatfile"
}

首先通过dba_handlers()函数来看一看系统支持的DBM,这里的ndbm和cdb都派生自DBM。接下来我们再通过一小段代码,看看如何对DBM(ndbm)进行增删改查。

php 复制代码
<?php
$id = dba_open("/tmp/test.db", "n", "ndbm"); // mode `n` for create, truncate and read/write access
if (!$id) {
    echo "dba_open failed\n";
    exit;
}

dba_replace("key", "This is an example!", $id);
if (dba_exists("key", $id)) {
    echo dba_fetch("key", $id), PHP_EOL;
    dba_delete("key", $id);
}
var_dump(dba_fetch("key", $id));

dba_close($id);

dba_open()的第3个参数是"DBM系"数据库的名字(在PHP DBA扩展中叫做handler)。从设计模式的角度看,DBA相当于接口,handler相当于实现类。从MySQL架构的角度看,DBA相当于MySQL Server,handler相当于Pluggable Storage Engine。

在本例中,我们使用ndbm这个handler。执行结果如下所示。

bash 复制代码
/tmp $ php dbm.php
This is an example!
bool(false)

我们还可以通过strings命令查看存储在DBM数据库中的数据。

php 复制代码
// $id resource returned from `dba_open`
dba_replace("key", "This is an example!", $id);
dba_replace("foo", "bar", $id);
dba_sync($id);
bash 复制代码
$ strings test.db.db
barfoo
This is an example!key

关于ndbm这个名字还有个冷笑话,

Although NDBM is now old - like the city named New Town ('Neapolis') by the Greeks in about 600BC and still called Naples today - it remains the baseline DBM.

------ Kew, Nick (2007). The Apache Modules Book: Application Development with Apache. Prentice Hall Professional. ISBN 9780132704502. p.80

NDBM虽然叫New DBM,但也颇有历史了。就好像那不勒斯这座城市,虽然已有2700余年的历史,字面上却是城的意思。

相关推荐
huangdong_20 分钟前
京东商品图片视频批量下载与m3u8视频合并技术完整实现方案
大数据·前端·数据库
倒流时光三十年29 分钟前
PostgreSQL CASE 条件表达式详解
数据库·postgresql
字节跳动数据平台1 小时前
营销视频进入工业化时代,火山引擎多模态数据湖如何助力多米实现内容生产提效 100+ 倍
数据库
健康平安的活着1 小时前
mysql中数据库脚本太大,通过脚本命令修改db名称
数据库·mysql
倒流时光三十年1 小时前
PostgreSQL COALESCE 条件表达式函数详解
数据库·postgresql
让我上个超影吧2 小时前
Claude code:Hooks
java·数据库·ai编程
RH2312112 小时前
2026.6.8Linux
java·数据库·中间件
其实防守也摸鱼2 小时前
软件安全与漏洞--Windows底层原理与软件逆向工程基础
linux·网络·数据库·算法·安全·安全架构·软件安全与漏洞
minji...3 小时前
MySQL数据库 (八) MySQL表的基本查询(下),truncate、group by、聚合函数、分组聚合统计
数据库·mysql·聚合函数·update·分组聚合统计
乐世东方客3 小时前
备份脚本记录(binlog文件+mysql+mongo)
android·数据库·mysql