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

时间:2014-06-01 11:15:01

标签: mongodb relational-database nosql

在关系数据库阵营中度过几年之后,我对Mongo DB真的很陌生。我理解NoSQL的想法,但不知何故,我不能让自己想象用于缓存和快速检索数据。

我有一个典型的多对多情况需要解决。项目会添加到集合中,其中多个项目可以放在一个集合中,反之亦然。如何使用Mongo DB解决这个问题,而不重复数据?另一方面,我也想避免仅创建一个充满id的集合,因为之后我必须逐个获取这些项目。如果是这样的话,我甚至会放弃Mongo并回到更关系的解决方案。

Mongo还有什么我想念的吗?如果是这种情况,请告诉我。我很乐意学习。

3 个答案:

答案 0 :(得分:0)

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

我邀请您查看以下链接:

当你开始设计时,你应该试着“忘记”你的关系背景,从头脑开始。

另外,根据您使用的编程语言,您可能会找到一些可以帮助您的ODM(对象文档映射)工具,例如Node.js中的Mongoose,Java中的Morphia,......

答案 1 :(得分:0)

您可能错过了DBrefs,但正如下面评论中提到的WiredPrairie一样,它不应该被使用。也许你只是在考虑非常类似NoSQL,但在关系世界中仍然更多。

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

因此,虽然DBrefs应该适合你,但它会比SQL的Joins慢得多。相反,你也可以问自己 - 当你在A和B之间有多对多的关系时,当你使用A时你真正需要B的哪个数据,反之亦然。但这取决于你的用例。

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

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

答案 2 :(得分:0)

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

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

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

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

1)'否' SQL - 即根本没有设计规则。最好的方法可能是“查询驱动”,这意味着您可以识别将在数据库上运行的查询,然后设计数据库,以便这些查询能够以最有效的方式运行。

2)MongoDB处于初期阶段。我很快就会看到它添加新功能。也许那时我们将能够冻结一些设计MongoDB数据库的指南。

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

在stackoverflow上已经提出了很多问题,人们试图从社区中的人那里验证他们的NoSQL设计。您可以看到这些问题,并了解如何在MongoDB中设计NoSQL数据库。一个示例问题是here。它只是再次背诵我对你说的话。

相关问题