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余年的历史,字面上却是城的意思。

相关推荐
张较瘦_26 分钟前
[论文阅读] AI + 数据库 | 拆解智能数据库:交互、管理、内核三层革新,AI 如何重塑数据处理
数据库·论文阅读·人工智能
paperxie_xiexuo1 小时前
如何高效完成科研数据的初步分析?深度体验PaperXie AI科研工具中数据分析模块在统计描述、可视化与方法推荐场景下的实际应用表现
大数据·数据库·人工智能·数据分析
w***4811 小时前
Springboot项目本地连接并操作MySQL数据库
数据库·spring boot·mysql
司铭鸿2 小时前
图论中的协同寻径:如何找到最小带权子图实现双源共达?
linux·前端·数据结构·数据库·算法·图论
友友马2 小时前
『MySQL』 - 事务 (二)
数据库·mysql·oracle
薛晓刚2 小时前
OceanBase的嵌入式数据库:vscode+python+seekdb
数据库
owCode2 小时前
OceanBase训练营miniob提测踩坑
数据库·oceanbase·数据库开发
wind_one12 小时前
16。基础--SQL--DQL-分页查询
数据库·sql
q***42052 小时前
python的sql解析库-sqlparse
数据库·python·sql
last demo2 小时前
nfs服务器
linux·运维·服务器·php