Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.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 为什么不';t大多数NoSQL DBMS都有“;指针”;?_Mongodb_Neo4j_Orientdb_Graph Databases_Database - Fatal编程技术网

Mongodb 为什么不';t大多数NoSQL DBMS都有“;指针”;?

Mongodb 为什么不';t大多数NoSQL DBMS都有“;指针”;?,mongodb,neo4j,orientdb,graph-databases,database,Mongodb,Neo4j,Orientdb,Graph Databases,Database,为什么大多数NoSQL存储解决方案不像前关系型DBMS那样具有超高效联接的“指针”,其客观原因是什么? 我的意思是,我部分理解了为什么经典RDBMS抛弃了指针的理论原因(需要更新它们并对内存和磁盘进行双重同步,没有足够快的“磁盘”可以像现代SSD等某些用例中的随机访问那样处理) 但是,在众多的NoSQL解决方案中,为什么只有那么少的解决方案意识到这种模型对于许多实际情况(我所知道的例外是OrientDB和Neo4j)来说是非常棒的,而不仅仅是那些需要图形遍历的情况。我的意思是,当你需要像多重连接

为什么大多数NoSQL存储解决方案不像前关系型DBMS那样具有超高效联接的“指针”,其客观原因是什么?

我的意思是,我部分理解了为什么经典RDBMS抛弃了指针的理论原因(需要更新它们并对内存和磁盘进行双重同步,没有足够快的“磁盘”可以像现代SSD等某些用例中的随机访问那样处理)

但是,在众多的NoSQL解决方案中,为什么只有那么少的解决方案意识到这种模型对于许多实际情况(我所知道的例外是OrientDB和Neo4j)来说是非常棒的,而不仅仅是那些需要图形遍历的情况。我的意思是,当你需要像多重连接这样的东西时,你需要乒乓Mongo,进行N次查询,而不是一次查询

NoSQL文档数据库的用例与graph数据库的用例重叠是否足够,这样的特性是否有意义,并且只需提供NoSQL解决方案的SQL连接的所有实用特性,而不会产生太多额外的成本,对于大多数查询来说,索引将变得无用,并且占用大量数据集的空间会小得多


(…作为奖励,任何NoSQL解决方案都可以用作graph db,对存储在Mongo中的图形执行~100个节点的路径长度遍历将自动运行得足够快)

我相信关键问题是数据局部性和水平可伸缩性。NoSQL的一个前提是RBDM的重读模型,即那些需要连接的模型,会导致瓶颈

想想推特:最初的数据模型阅读量很大,但你需要加入的数据量却大得惊人(数十亿条推特x数亿用户x数百亿追随者与追随者之间的关系在大小上千差万别[1-10万条,或是现在aplusk拥有的任何东西])

当您想要加入的ID都不适合一台合理的机器的RAM时,计算ID的重叠就变得非常昂贵。如果将实际数据考虑在内,水平可伸缩性几乎是不可能的,因为没有先验知识知道需要攻击哪些碎片/机器。在每个跟随者列表中存储所有跟随者指针需要对琐碎的更改进行疯狂的簿记,同时不利用创建时局部性(或者至少每个提要的创建时局部性)

在多租户应用程序中,您始终可以按租户、销售区域、代理甚至时间进行分片:您可以找到一些适合>95%情况的局部性标准

对于图表来说,这变得复杂得多,尤其是那些具有某些连接属性的图表(小直径无标度网络/小世界现象):一篇简单的帖子,比如一位名人的帖子,可以迅速传播到整个网络的很大一部分,这意味着几乎每个查询都必须命中持有post的一个节点

当然,帖子本身会被网络服务器缓存,但是添加喜欢和评论,或者收藏夹和转发,故事就会变成一场噩梦(写!)再加上通知电子邮件、内容排名和过滤,你真的很害怕

对存储在Mongo中的一个图进行大约100个节点的路径长度遍历,只需要自动运行就足够快了

如果这些数据恰好位于100个不同的节点上,那么网络开销将在50毫秒的范围内,即使在没有拥塞和空闲机器的单个数据中心中也是如此。如果这在世界范围内传播,或者单个查询需要更长的时间,那么很快就会以5000ms结束。此外,如果只有一台机器停机,查询将失败

这在很大程度上取决于网络的细节,这就是为什么问题应该通过应用程序代码而不是数据存储来解决

当您需要诸如多连接之类的东西时,您需要乒乓Mongo和Don查询,而不是一个查询


当您在MongoDB中需要多连接时,您的数据模型使用了错误的工具,反之亦然。多连接意味着规范化意味着读重,这与MongoDB的关键概念格格不入。但是,您甚至可以在MongoDB中使用。但是这个工具在这里几乎变得无关紧要:例如,如果你看一看,它几乎没有技术依赖性。

为什么不使用图形数据库来实现高效的连接呢?你不需要有复杂的图形模型来使用一个图形数据库。@布赖恩安德伍德,我的问题实际上有点颠倒了:为什么使用任何东西,而不是一个图形数据库,为什么其他NoSQL的DBS(我认为图形DBS是NoSQL家族的一部分)甚至存在?当出于所有实际目的,你迟早会需要n级连接…如果你抛弃了关系世界观,那么为什么不为这些连接建立某种“指针”机制呢?谢谢你提醒我道。。。完全忘记了这一点,这可能是解决我现在看到的实际问题的正确想法:)