Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 基于文档的数据存储(如Mongo)与键值存储是如何实现的?_Mongodb_Language Agnostic_Key Value Store - Fatal编程技术网

Mongodb 基于文档的数据存储(如Mongo)与键值存储是如何实现的?

Mongodb 基于文档的数据存储(如Mongo)与键值存储是如何实现的?,mongodb,language-agnostic,key-value-store,Mongodb,Language Agnostic,Key Value Store,我最近读了一些关于基于文档的数据库和键值存储的文章(这里是一个很好的概述) )我很难找到关于以下内容的好信息 如果我们用 键(或一个附加索引),在机制上没有真正的区别-获取值。我是 不清楚文档存储是如何定义的 这与键值不同 查询非索引时存储 文件/字段。如果我要实施 文档存储在键值之上 商店,我会做一个“表格扫描”(检查 的所有键/值对) 查询中的适当值-do 文档库在封面下做的不仅仅是这些?以这种方式考虑文档数据存储是否合适 这不是一个实际的问题(如果我需要做一些有用的事情,我会在BDB上使用

我最近读了一些关于基于文档的数据库和键值存储的文章(这里是一个很好的概述) )我很难找到关于以下内容的好信息

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


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

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

需要考虑的方面:

-写操作与读操作的频率

-数据分析的必要性

-高可用性的数据冗余

-数据复制/同步

-需要许多瞬态数据

-数据大小

-云端就绪

一些非SQL实现通过单独比其他实现更好地支持这些方面

场景:

-频繁写入、很少读取的数据,如web命中计数器或来自记录设备的数据:|

-频繁读取,很少写入/更新:用于瞬态数据缓存、搜索和数据分析

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

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

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

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

结论:

IMHO您应该关注从使用场景开始选择可伸缩数据存储的问题,而不是它们之间的基础方面和差异


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

MongoDB和CouchDB使用标准JSON(())存储数据。在查询对象的特定值时,它们有优化的算法,据我所知,它们使用s来优化索引()。使用这些工具,他们可以比在键值对数据库中搜索值更快地找到数据

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

编辑:


来自一个解释MongoDB内部的

它们都使用BTree和hash标记来加速某些查询。键值存储基本上只是访问键值,根据引擎的不同,键值可能被视为单个值(允许选择和范围查询)或复合值

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


要查找有关mongoDB内部构件的信息,您可以使用他们的站点并搜索内部构件()。可以找到大量信息。

抱歉,这根本不能回答我的问题-我不是在选择数据存储,问题是具体的实现,我并不真正关心可伸缩性。小细节:我相信MongoDB使用BSON存储,而不是JSON。哦,你说得对,因为它也允许您存储二进制数据。编辑…还有,你知道这两个是否也有针对非索引字段的优化算法吗?我相信OP想知道的是,在文档存储中是否有优化算法比在平面存储中检索每个键值并解析值以匹配查询要好得多。AFAIK,它们利用内存合并数据库操作,并利用固态磁盘在向文件追加数据时检索旧块的能力。我也能猜到一些更原始的系统上的空白对齐,这些系统使用单个模型,但我没有参考资料,因此我的答案中没有包括这些。