【发布时间】: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 的优势会变得更加明显。更频繁地发生什么:作者更改了他们的名字或有人查看了评论线程?那么您应该针对哪种情况进行优化?