将MongoDB用于更传统的多对多用例

将MongoDB用于更传统的多对多用例,mongodb,relational-database,nosql,Mongodb,Relational Database,Nosql,在关系数据库阵营呆了几年之后,我对Mongo DB真的很陌生。我理解NoSQL的概念,但不知何故,我不能让自己想象更多的是使用它来缓存和快速检索数据 我有一个典型的多对多情况需要解决。项目被添加到集合中,在集合中可以容纳多个项目,反之亦然。在不复制数据的情况下,如何使用Mongo DB解决此问题?另一方面,我也希望避免创建一个只包含ID的集合,因为之后我必须逐个获取项目。如果是这样的话,我甚至会放弃Mongo,回到一个关系更密切的解决方案 Mongo有什么我不知道的吗?如果是这样,请告诉我。我很

在关系数据库阵营呆了几年之后,我对Mongo DB真的很陌生。我理解NoSQL的概念,但不知何故,我不能让自己想象更多的是使用它来缓存和快速检索数据

我有一个典型的多对多情况需要解决。项目被添加到集合中,在集合中可以容纳多个项目,反之亦然。在不复制数据的情况下,如何使用Mongo DB解决此问题?另一方面,我也希望避免创建一个只包含ID的集合,因为之后我必须逐个获取项目。如果是这样的话,我甚至会放弃Mongo,回到一个关系更密切的解决方案


Mongo有什么我不知道的吗?如果是这样,请告诉我。我很高兴知道

如果你能添加具体的例子(“文档”或“表格”),我认为这是有意义的。处理文档时的基本规则实际上是关注操作数据的方式。(查询与写入/更新…) 基于此,您将复制或不复制数据,但对我来说,在许多文档/集合中,我看不到复制数据的任何问题,尤其是如果您不经常更新它们的话。它使开发人员的生活更加轻松

我邀请您查看以下链接:

  • :
当你开始你的设计时,你应该试着“忘记”你的关系背景,以一个新的思维开始

此外,根据您使用的编程语言,您可能会发现一些ODM(对象文档映射)工具可以帮助您,例如Node.js中的Mongoose、Java中的Morphia等等,您可能会错过这些工具,但正如下面的评论所建议的,不应该使用它们。这也可能是因为您的想法不太像NoSQL,但在关系世界中更是如此

NoSQL DBs如此之快的原因是限制了功能以及处理非规范化的数据集,这样可以节省连接

因此,虽然DBREF应该适合您,但它将比SQL的联接慢得多。相反,你也可以问问自己——当你在a和B之间有一个多对多的关系时,当你使用a时,你真正需要B的哪些数据,反之亦然。但这完全取决于您的用例

这只是一个可以在MongoDB中轻松解决的多对多关系的示例:


用户权限(一个用户拥有多个权限,一个权限由多个用户使用)-但是,在99%的情况下,您希望查看用户拥有哪个权限,因此您需要在用户对象中保存权限或其某些描述。只有在1%的情况下(甚至更少),当你真的想知道哪个用户有权限时,你可以运行一个非常慢的查询,但这并不重要,因为它几乎从未被使用过。

如果在关系数据库中一切正常,你真的不必转向NoSQL。如果关系数据库中存在一些问题,请尝试仅在关系数据库的域中修复它

但是,如果问题是存储在关系数据库中的数据并不总是具有相同的形式,或者您只是想尝试一下NoSQL,那么请继续使用NoSQL DBMS

由于NoSQL数据库没有预设设计,因此设计数据库(以及其中的集合)的最佳方法是查看将在数据库上执行的查询。设计数据库的最佳学习资源是MongoDB数据建模文档,可在MongoDB的第页上找到

您将在网上找到许多使用MongoDB查询现有数据库的教程,但很少有关于在MongoDB中设计数据库的教程。原因:

1) “否”SQL—即,设计时根本没有规则。最好的方法可能是“查询驱动”,这意味着您确定将在DB上运行的查询,然后设计DB,以便这些查询能够以最有效的方式运行

2) MongoDB正处于初级阶段。我看到它很快就会增加新功能。也许那时我们就可以冻结一些设计MongoDB数据库的指导方针了

回到你设计多对多关系的问题上来。在关系型DBMS中,我们在表中的多对多关系中创建表。在MongoDB中,我们为这个场景将一个表嵌入另一个表中。这与反规范化关系数据库相同。除非您决定只嵌入id并将另一个表保留在单独的集合中,否则信息复制是不可避免的。同样,提前了解您的查询是最好的指南


人们在stackoverflow上提出了很多问题,人们试图从社区中的人们那里验证他们的NoSQL设计。您可以看到这些问题,并了解应该如何在MongoDB中设计NoSQL DB。一个示例问题是。它只是简单地重复了一遍我对你说的话。

我试图理解你的问题怎么还没有被问过几百次,回答过几百次?建模数据在MongoDb网站上有很好的文档记录。不清楚你为什么要考虑Mongo。它不一定比现有的基于SQL的解决方案快。在现代MongoDb解决方案中不应使用DBRefs,这就是为什么我建议他可能想重新考虑数据模型,而不是简单地将sql模式映射到MongodBm。我的反馈是,你的答案似乎是建议它们可能会起作用。好的,thx,更新我的答案,明确说明不应该使用它。