Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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建立多对多关系_Mongodb - Fatal编程技术网

大规模与MongoDB建立多对多关系

大规模与MongoDB建立多对多关系,mongodb,Mongodb,我看过很多关于如何与MongoDB建立多对多关系的帖子,但都没有提到规模。例如,这些职位: 我看到这种设置的问题是MongoDB的16MB文档限制。假设我有users、groups和postsposts有一个相关的组和许多可以喜欢它的用户。一个组中有许多posts,以及许多可以跟随它的用户。一个用户可以有许多喜欢的帖子s,并且可以跟随许多组s。如果我要用关系数据库构建它,我会这样设置: user: user_id username post: post_id

我看过很多关于如何与MongoDB建立多对多关系的帖子,但都没有提到规模。例如,这些职位:

我看到这种设置的问题是MongoDB的16MB文档限制。假设我有
user
s、
group
s和
post
s
post
s有一个相关的
和许多可以喜欢它的
用户。一个
中有许多
post
s,以及许多可以跟随它的
用户。一个
用户
可以有许多喜欢的
帖子
s,并且可以跟随许多
s。如果我要用关系数据库构建它,我会这样设置:

user:
    user_id
    username

post:
    post_id
    group_id
    message

group:
    group_id
    name

post_likes:
    post_id
    liked_user_id

group_followers:
    group_id
    follower_user_id
理论上,一个
可以有数量有限的
post
s和后续
用户
s,一个
post
可以有数量无限的
用户
s,如果在SQL查询中正确完成分页,则
用户可以拥有无限数量的post
s和
group
s


如何设置MongoDB的模式以实现这种规模?

如果您只是将关系的ID存储在reach集合的数组中,那么在单个文档中应该不会有太多问题。GridFS可以使用,但通常更多的是用于文件、音乐、视频等媒体。使用GridFS会让更新变得很痛苦

这是一个很好的问题,说明了过度渲染的问题以及如何处理

例如:喜欢发帖 让我们继续使用用户喜欢帖子的例子,这是一个简单的例子。其他关系必须相应地处理

你是绝对正确的,在帖子中存储喜欢的内容迟早会导致非常受欢迎的帖子达到大小限制的问题

因此,您正确地回过头来创建一个
post\u likes
集合。为什么我认为这是正确的?因为它适合您的用例以及功能性和非功能性需求

  • 它的比例是不确定的(好吧,理论上是有限制的,但它是巨大的)
  • 它易于维护(在
    post\u id
    liked\u user\u id
    上创建唯一索引)和使用(用户和帖子都是已知的,因此添加like是一个简单的插入,或者更可能是一个upsert)
  • 您可以轻松找到哪些用户喜欢哪些帖子,以及哪些用户喜欢哪些帖子
不过,我会稍微扩展集合,以防止对某些频繁出现的用例进行不必要的查询

现在让我们假设帖子标题和用户名不能更改。在这种情况下,下面的数据模型可能更有意义

{
_id:new ObjectId(),
“post_id”:someValue,
“post_title”:“酷的东西”,
“喜欢的用户id”:someUserId,
“用户名”:“JoeCool”
}
现在让我们假设您希望显示所有喜欢帖子的用户的用户名。使用上述模型,这将是一个单一的、相当快速的查询:

db.post\u.find(
{“postId”:someValue},
{{u id:0,用户名:1}
)
如果只存储ID,这个相当常见的任务将需要至少两个查询,并且-考虑到一个帖子可能有无限多的喜欢者-潜在的巨大的内存消耗(您需要将用户ID存储在RAM中)

诚然,这会导致一些冗余,但即使数百万人喜欢一篇文章,我们也只谈论几兆字节相对便宜(且易于扩展)的磁盘空间,同时在用户体验方面获得大量性能

现在问题来了:即使用户名和帖子标题可能会更改,您也只需进行多次更新:

db.post\u.update(
{“post_id”:someId},
{$set:{“post_title”:newTitle}},
{multi:true}
)
你在交易,它需要一段时间来做一些相当罕见的事情,如改变用户名或极端速度的使用情况下,发生非常频繁的帖子

底线
请记住,MongoDB是一个面向文档的数据库。因此,请用您未来查询所需的值记录您感兴趣的事件,并相应地对您的数据进行建模。

再看一看,GridFS似乎是一种可行的方法?Grifds是处理这个问题最可怕的解决方案。正确的数据建模,当您开始详细描述时,会更好。