【问题标题】:How are document-based datastores (e.g., Mongo) implemented vs a key-value store?与键值存储相比,基于文档的数据存储(例如 Mongo)如何实现?
【发布时间】:2011-09-23 21:31:15
【问题描述】:

我最近阅读了一些关于基于文档的数据库与键值存储的对比(这里有一个很好的概述 Difference between Document-based and Key/Value-based databases? ) 并且我无法找到有关以下内容的好信息。

如果我们使用 键(或附加索引),机制没有真正的区别 - 获取价值。我是 不清楚文档存储如何 与键值不同 查询非索引时存储 文件/字段。如果我要实施 文档存储在键值之上 商店,我会做一个“表扫描”(检查 所有键/值对) 查询中的适当值 - 执行 文件商店在幕后做的还不止这些吗?以这种方式考虑文档数据存储是否合适?

这不是一个实际问题(如果我需要做一些有用的事情,我是否会在 BDB 上使用 Mongo,最有可能),而是一个旨在理解底层技术的问题。我只对适用于底层实现的特定系统的扩展方面感兴趣。

【问题讨论】:

    标签: mongodb language-agnostic key-value-store


    【解决方案1】:

    MongoDB 和 CouchDB 使用标准 JSON (or BSON (spec)) 来存储数据。当您查询对象的特定值时,他们已经优化了算法,据我所知,他们使用Binary Trees 来优化索引(MongoDB certainly does)。使用这些,他们可以比在键值对数据库中搜索值更快地定位数据。

    (从键值对数据库实现来看,Redis 有一种非常有趣的方式来提高性能,它将数据存储在内存中,磁盘 I/O 很少。)

    编辑:

    来自great video,其中解释了 MongoDB 的内部结构。 Check it out.

    【讨论】:

    • 小细节:我相信 MongoDB 使用 BSON 进行存储,而不是 JSON。
    • 哦,您当然是对的,因为它也允许您存储二进制数据。正在编辑...
    • 另外,你知道其中任何一个是否也有针对非索引字段的优化算法吗?我相信 OP 想知道 doc 存储中是否存在优化算法,这些算法比仅检索平面存储中的每个键值并解析值以匹配查询要好得多。
    • AFAIK,它们利用内存合并数据库操作,并利用固态磁盘在将数据附加到文件时检索旧块的能力。我也可以猜到一些空白对齐在一些更原始的系统上,这些系统与单个模型一起工作,但我没有参考,因此我的答案中没有包含这些。
    【解决方案2】:

    它们都使用 BTree 和哈希索引来加速某些查询。键值存储基本上只是简单地访问取决于引擎的键,它可能被视为单个值(允许选择和范围查询)或复合值。

    基于文档的引擎增加了对文档中元素路径的支持(或者他们在概念上称之为的任何东西)。基本上,您可以通过从键值创建文档 {key, value} 来模拟键值存储。如果您只使用键结构查询文档,则在查找方面基本上具有相同的结果和类似的优化。

    要查找有关 mongoDB 内部的信息,您可以使用他们的网站并搜索内部 (https://www.mongodb.com/search?search=internals)。可以找到很多信息。

    【讨论】:

      【解决方案3】:

      对可扩展性的兴趣意味着您必须仔细考虑设计中的使用场景。对于可扩展的 NonSQL 部署,需要考虑多个变量,该部署跨越底层实现是基于键的还是面向文档的。这是一个简短的列表:

      需要考虑的方面:

      -写入与读取操作的频率

      -需要数据分析

      -高可用性的数据冗余

      -数据复制/同步

      -需要很多瞬态数据

      -数据大小

      -云就绪

      一些 NonSQL 实现比其他实现更好地鼓励这些方面。

      场景:

      -频繁写入,很少读取网络命中计数器等数据,或来自日志设备的数据:Redis | MongoDB

      -经常读取,很少写入/更新:Memcached 用于临时数据缓存,Cassandra | HBase 用于搜索,HadoopHive 用于数据分析

      -需要最少停机时间的高可用性应用程序在集群冗余数据存储方面表现出色:Riak | Cassandra

      -跨多个位置的数据同步:CouchDB

      -瞬态数据(网络会话和缓存)在瞬态键值数据存储中表现良好:Memcached

      -来自可能不遵循任何明显模式的业务或网络分析的大数据:Hadoop

      结论:

      恕我直言,您应该关注从使用场景而不是底层方面和它们之间的差异开始选择可扩展数据存储的问题。

      我还建议您查看Couchbase,这是两个世界的完美结合:基于键和面向文档。

      【讨论】:

      • 抱歉,这根本不能回答我的问题 - 我不是在选择数据存储,问题是关于实施的,我并不真正关心可扩展性。
      猜你喜欢
      • 1970-01-01
      • 2022-08-05
      • 2011-02-03
      • 2011-02-25
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多