虽然我还没有使用任何新的 NoSQL 数据库,但我试图通过阅读 Wikipedia 文章、博客和查看一些 NoSQL DBs 文档来让自己了解情况。
我刚刚(重新)阅读了 2009 年 8 月版的 php|architect,特别是关于非关系数据库的文章,我的脑海中突然出现了一些问题,我知道这篇文章对这个主题很轻,但它是足以让我感到困惑...
沙发数据库
我关于 CouchDB 的主要问题是为什么这么多炒作?. 据我了解,CouchDB 提供了一个 Web 服务,可让您在数据库中创建数据库和文档,这些文档可以具有多个 JSON 编码的属性,并且还具有用于跟踪文档修订的特殊属性_id
和属性。_rev
我真的没有对此大惊小怪,几年前我为一个宠物项目编写了一个类似的(?)系统来存储文档,结构是这样的:
documents/
document-name/
(revision) timestamp/
(contents) md5-hash.txt
PHP Serialized Data
我确定我错过了一些非常基本的东西,否则(从 PHP 开发人员的角度来看)这将具有与 CouchDB 相同的好处并且速度更快 - 无需对 JSON 进行编码和解码。
亚马逊简单数据库
现在这个真的让我头晕目眩......作者(Russell Smith)给出了以下示例:
$sdb->putAttributes('phparch', 'may', array('title' => array('value' => 'May 2009'), 'have' => array('value' => false)));
$sdb->putAttributes('phparch', 'june', array('title' => array('value' => 'June 2009'), 'have' => array('value' => true)));
$sdb->putAttributes('phparch', 'july', array('title' => array('value' => 'July 2009'), 'have' => array('value' => true)));
然后他说亚马逊现在支持类似 SQL 的界面,然后执行以下查询:
$sdb->select('phparch', 'SELECT * FROM phparch WHERE have = "1"');
他没有给出任何类似的例子来说明如何在 CouchDB 中进行查询(但是他在 Views 和 Map/Reduce 上留下了一些提示),但我想这也是可能的,所以我的问题是:亚马逊(和 CouchDB)如何做它?
我的第一个猜测是他们打开所有文档(可能在分布式环境中),然后应用 reduce 操作来过滤属性与搜索条件不匹配的文档,但这不会过于昂贵(CPU 和磁盘I/O)甚至在并行计算中?
我知道我忽略了一些重要的东西,比如分布、一致性等,但我只是想掌握 NoSQL 存储的非常基本的内部工作原理。
PS:另外,谁能解释一下为什么 CouchDB 和 Amazon SimpleDB 都是用 Erlang 构建的?