3

我正在阅读Citadel文档,它提到它使用 BerkeleyDB来存储数据。由于 BerkeleyDB 是一个键/值存储,我想知道他们如何使用这样一个简单的数据模型来管理所有数据关系(因为 Citadel 做了很多事情)。

CREATE TABLE citadel (
  key LONGBLOB INDEX,
  data LONGBLOB
);

这让我有机会最终看到使用 NoSQL 数据库建模的完整应用程序。然而,我找不到任何关于他们如何做到这一点的文档。

那么,citadel 是如何仅使用 BerkeleyDB 键/值存储来构建数据的呢?

  • 它如何将电子邮件映射到用户?
  • 用户如何与其他用户相关联?
  • 联系人如何存储?
  • 如何找到相关的电子邮件回复?
  • 电子邮件如何标记为已查看?

这样的例子不胜枚举...

4

2 回答 2

2

相当多的 NoSQL 数据库,就其裸露形式而言,可以与文件系统相媲美。给定一个键(=路径),你会得到一个数据块(=文件内容)。其余的大致归结为调整和额外功能;

  • 一个命名空间中有很多(数十亿和数十亿)键?(HBase、Riak、BerkeleyDB、...)
  • 支持多 TB 值?(Amazon S3) 或针对许多较小的 (Zookeeper)
  • 不透明的价值观?有些数据库不查看它们(HBase、BerkeleyDB),有些则查看(CouchDB)。

目前似乎最流行的事情是进行键扫描(HBase、Cassandra、CouchDB,我相信还有 BerkeleyDB),您可以在其中请求您感兴趣的键间隔,例如。“从foo@bar:emails:folderName:00000000foo@bar:emails:folderName:999999999”。这通常会返回在两者之间的 ASCIIbetic 间隔中的键和/或值的列表。因此,您可以在平面命名空间中模拟类似文件的层次结构。

下一个问题是并发。非常简单,大多数 NoSQL 数据库放弃 ACID 以支持可扩展性和/或可用性。查看CAP 定理了解更多详情。

总而言之,在这么短的时间里很难做到主题公正,所以我真的建议你自己研究一下。

挑选一些开源项目(OpenTSDB以一种有趣但显而易见的方式做事)。或者自己在 NoSQL 上构建一些东西。

于 2012-12-19T11:12:31.040 回答
1

不久前我对 Amazon Simple DB 进行了深入研究,我怀疑 BerkleyDB 的做法可能有些相似。

Key 和 Value 都是 BLOBS。基本上你可以在那里存储任何东西。让我们根据您列出的一些观点/问题举一个例子。

我将介绍的要点如下:

  • 它如何将电子邮件映射到用户?
  • 用户如何与其他用户相关联?

与关系数据库一样,键值必须是唯一的,因此假设用户 ID/用户名是唯一的。因此,我们可以将 admin、jdoe、serviceadmin 等键值作为键。由于我们可以在 value 字段中存储任何内容,因此我们可以在 value 字段中存储 XML 文档。

一个示例可能如下所示:

Key:
    admin
Value:
     <user>
           <emaillist>
                <email>admin@server.com</email>
           </emaillist>
           <relatedusers>
                 <relateduser>
                          <name>jdoe</name>
                          <relationship>someidentifier</relationship>
                 </relateduser>
                 <relateduser>
                          <name>serviceadmin</name>
                          <relationship>someidentifier</relationship>
                 </relateduser>
           </relatedusers>
      </user>

由于 XML 可用于以多种方式描述数据,这可能是可以实现的一个非常简单的示例。但是,您可以在其中存储一些与 XML 非常相似的二进制格式的数据,您可以通过某种方式检索和解释这些数据。像位 1 是用户的活动状态等。

NoSQL 的强大之处在于可以存储任何内容,并且行与行的结构也可以不同。这也是不利的一面。由于没有适当的文档就无法解释数据,因此从结构的角度来看,这些类型的数据库很难理解。它们实际上可以包含任何东西。

希望它现在在某种程度上有意义。

于 2012-12-19T10:03:54.123 回答