- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看过很多关于如何与 MongoDB 建立多对多关系的帖子,但没有一个提到规模。例如这些帖子:
MongoDB Many-to-Many Association
How to organise a many to many relationship in MongoDB
我发现这种设置的问题是 MongoDB 的 16MB 文档限制。假设我有用户
、组
和帖子
。 帖子
有一个关联的组
和许多可以喜欢它的用户
。一个群组
中包含许多帖子
,以及许多可以关注它的用户
。一个用户
可以拥有多个喜欢的帖子
,并且可以关注多个群组
。如果我用关系数据库构建它,我会这样设置:
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
理论上,一个群组
可以拥有无限数量的帖子
和关注的用户
,一个帖子
可以拥有无限数量的喜欢的用户
,并且用户
可以拥有无限数量的喜欢的帖子
和组
如果 SQL 查询中分页正确完成,他们将遵循这些内容。
如何设置 MongoDB 的架构才能实现这种规模?
最佳答案
这是一个很好的问题,它说明了过度嵌入的问题以及如何处理它。
让我们继续使用用户喜欢帖子的示例,这是一个简单的示例。其他关系依此处理。
您说得完全正确,将点赞存储在帖子中迟早会导致非常受欢迎的帖子达到大小限制的问题。
因此,您正确地回退到创建 post_likes
集合。为什么我说这是正确的?因为它适合您的用例以及功能和非功能需求!
post_id
和 liked_user_id
上创建唯一索引)和使用(用户和帖子都是已知的,因此添加点赞是一个简单的操作)简单插入或更可能是更新插入)但是,我会稍微扩展该集合,以防止对某些频繁使用案例进行不必要的查询。
现在我们假设帖子标题和用户名无法更改。在这种情况下,以下数据模型可能更有意义
{
_id: new ObjectId(),
"post_id": someValue,
"post_title": "Cool thing",
"liked_user_id": someUserId,
"user_name": "JoeCool"
}
现在假设您要显示所有喜欢帖子的用户的用户名。对于上面的模型,这将是一个相当快的单一查询:
db.post_likes.find(
{"postId":someValue},
{_id:0,user_name:1}
)
如果只存储 ID,这个相当常见的任务将需要至少两个查询,并且考虑到帖子可能有无限数量的点赞者的限制 - 可能巨大内存消耗(您需要将用户 ID 存储在 RAM 中)。
当然,这会导致一些冗余,但即使有数百万人喜欢某个帖子,我们也只是谈论几兆字节的相对便宜(且易于扩展)的磁盘空间,同时获得大量性能在用户体验方面。
现在事情来了:即使用户名和帖子标题可能会发生变化,您也只需进行多次更新:
db.post_likes.update(
{"post_id":someId},
{ $set:{ "post_title":newTitle} },
{ multi: true}
)
您认为需要一段时间才能完成一些相当罕见的事情,例如更改用户名或帖子,以实现极其频繁发生的用例的极快速度。
请记住,MongoDB 是一个面向文档的数据库。因此,请记录您感兴趣的事件以及 future 查询所需的值,并相应地对数据进行建模。
关于mongodb - 大规模与 MongoDB 的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31888749/
我正在尝试缩放 :before我的内容 到目前为止,悬停时会应用样式,但没有视觉变化,:before保持相同的比例。 到目前为止我得到了什么: 12 SASS(CSS): .c
我正在使用 CGAffineTransformMake 转换 View 。它可以旋转、缩放和平移。这很好用。但我无法找到一种方法将比例限制为最大尺寸。 如果超出比例,我仍然需要应用当前的旋转和平移。
我想知道当我无法访问存储它的实际硬盘时是否有办法确定我的 svn repo 的大小?我之所以这么问,是因为我们的项目托管在谷歌代码上。有 1GB 的限制。我怀疑我们是否接近它,但我真的不知道并且想密切
抱歉,我已经花了大约 5 个小时来研究这个问题,但无法弄清楚发生了什么。我正在玩 http://bl.ocks.org/mbostock 上的一些示例网站并尝试向堆积条形图添加图例。 为此,我设置了比
我正在使用这个: var response = client.Search(s => s.Query(q => q.Ids(c => c.Values(new List(tempDictionary.
我想扩展一个 wildfly 容器,该容器暴露了多个端口并具有确定性结果。 docker-compose.yml version: '3' services: wildfly-server:
我目前正在使用 Linode 来部署我的应用程序。我有 2 台服务器,1 台数据库服务器,前面有 1 个负载均衡器。 我使用Redis作为数据库和NowJS来实现聊天室。使用 Pub/Sub 一切正常
在开发过程中,我需要经常更新我的 Web 应用程序源代码并将更新后的 war 部署到远程 Tomcat 服务器。上传一场大战 (25MB) 在我的连接上花费的时间太长(大约 30 分钟),这非常低效。
我有一个在生产中需要 websocket 连接的网络服务器。我使用 docker-compose 和 nginx 作为代理来部署它。 所以我的撰写文件如下所示: version: '2' servic
我的 Web 服务是在 Grails/Gradle 中创建的,其中包含许多依赖项 jar,使得部署在 tomcat8 中的 war 规模很大。有没有什么办法可以让我的 war 使用来自不同位置的依赖项
我是一名优秀的程序员,十分优秀!