【问题标题】:Mongodb real basic use caseMongodb真实基础用例
【发布时间】:2014-03-08 17:09:06
【问题描述】:

我正在接近 noSQL 世界。 我在网上学习了一点(不是最好的学习方式!),我阅读了 Mongodb 文档。 在网络上,我找不到一个真实的案例(只有大型架构上的奇特飞行,没有得到很好的解释或太基本而无法成为真实世界的例子)。

所以我对 noSQL 和 Mongodb 的理解仍然存在一些巨大的漏洞。

我试图总结其中一个,实际上是最糟糕的一个,如下:

让我们想象一个简单博客结构的帖子的数据结构:

{
"_id": ObjectId(),
"title": "Title here",
"body": "text of the post here",
"date": ISODate("2010-09-24"),
"author": "author_of_the_post_name",
"comments": [
              {
              "author": "comment_author_name",
              "text": "comment text",
              "date": ISODate("date")
              },
              {
              "author": "comment_author_name2",
              "text": "comment text",
              "date": ISODate("date")
              },
              ...
            ]
}

到目前为止一切顺利。

如果author_of_the_post 不更改他的名字(不考虑个人资料图片和描述),一切正常。 所有comment_authors 都一样。

所以如果我想考虑这种情况,我必须使用关系:

"authorID": <author_of_the_post_id>,

对于帖子的作者和

"authorID": <comment_author_id>,

为 cmets 作者。

但是 MongoDB 在查询时不允许连接。所以每个authorID会有不同的查询。

如果我的博文中有 100 个 cmets,会发生什么?

1 query for the post
1 query to retrieve authors informations
100 queries to retrieve comments' authors informations

**total of 102 queries!!!**

我说的对吗?

在这里使用 noSQL 的优势在哪里? 据我了解,102 个查询 VS 1 个更大的查询使用连接。

或者我是否遗漏了什么,并且有不同的方法来模拟这种情况?

感谢您的贡献!

【问题讨论】:

  • 您是否阅读过此处讨论的选项:docs.mongodb.org/manual/data-modeling?有很多非常好的信息,包括各种建模模式的优缺点。
  • 您通常还可以使用$in 运算符一次获取多个文档。
  • 是的,我见过,但我不记得 $in 运算符了。你能解释一下吗?谢谢
  • 哦,我明白了,使用 $in 运算符我总共会有 3 个查询。
  • 当您停止思考关系并忘记规范化时,您试图发现的 NoSQL 的优势会变得更加明显。更频繁地发生什么:作者更改了他们的名字或有人查看了评论线程?那么您应该针对哪种情况进行优化?

标签: mongodb nosql


【解决方案1】:

你见过吗?

http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/

听起来你所做的对 NoSQL 来说不是一个好的用例。使用关系数据库进行基本数据存储以支持应用程序,使用 NoSQL 进行缓存等。

【讨论】:

    【解决方案2】:
    1. NoSQL 数据库用于存储非敏感数据,例如帖子、cmets..
    2. 您可以通过一次查询检索所有数据。示例:不要关心过时的字段,如 author_name、profile_picture_url 或其他任何内容,因为它只是一个帖子,并且在未来这个帖子将不会作为较新的帖子可见。但是,如果您想更新字段,您有两种选择:
      • 第一个选项是使用某种工作服务。如果某个用户更改了他的用户名或个人资料图片,您将向您的服务发出某种信号,以遍历所有帖子和 cmets 并更新他的新用户名的所有字段。
      • 第二个选项使用 authorId 代替作者姓名,而不是 2 次查询,您将进行 N+2 次查询来查询 comment_author_profile。但是使用分页,而不是查询 100 cmets 需要 10 并显示“加载更多”按钮/链接,因此您将进行 12 个查询。

    希望这会有所帮助。

    【讨论】:

    • 当然我的只是一个例子,因为在整个网络上似乎每个人都使用 noSQL 来处理敏感数据。您的第一个解决方案基本上意味着丢失实时数据(背景信号无论如何都会使用硬件资源,并且可能会减慢系统速度)。第二种选择是一种很好的做法,但并不总是适用。在这两种情况下,SQL 都会做得更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多