假设我有博客帖子表。我想将所有评论一起存储在博客文章中。 如果1年后对帖子有新评论,我希望将其添加到该集合的最后评论中。 这是为了确保当我阅读该帖子的评论时,我会进行SEEK操作。
否则,如果该帖子分散,我将不得不扫描该帖子的评论。 加上分片/分区可能会将相同帖子的评论放在不同的部分上。
Comments
{
{post_id: 1, cmt_id:1, usr: 'bob', text: 'Cool!'}
{post_id: 1, cmt_id:2, usr: 'bob', text: 'Cool!'}
{post_id: 2, cmt_id:3, usr: 'rob', text: 'Cool!'}
{post_id: 2, cmt_id:4, usr: 'job', text: 'Cool!'}
}
如果对帖子1有新评论,那么我想要的集合:
Comments
{
{post_id: 1, cmt_id:1, usr: 'bob', text: 'Cool!'}
{post_id: 1, cmt_id:2, usr: 'bob', text: 'Cool!'}
{post_id: 1, cmt_id:5, usr: 'bob', text: 'Cool!'} <-- inserted
{post_id: 2, cmt_id:3, usr: 'rob', text: 'Cool!'}
{post_id: 2, cmt_id:4, usr: 'job', text: 'Cool!'}
}
这是可能的还是我还在想SQL?
如果有其他方法具有相同或更好的性能?
感谢阅读。
答案 0 :(得分:1)
首先你用sql方式思考..在mongodb中实现更好的性能需要嵌入一切。在你的情况下,你应该在博客文章中嵌入评论,如下所示:
Post
{
_id,
PostText,
Comments { cmt_id, usr, text },
...
}
在这种情况下,您不需要关心插入位置和可能的问题(来自不同分片中的一个帖子的注释)和分片。
希望这有帮助!
答案 1 :(得分:0)
无论如何,您无法保证评论按顺序存储在磁盘上。如果帖子1得到评论,然后发布2,然后再次发布1评论将在磁盘上交错,评论之间的时间无关紧要。只要您在评论集合上有post_id
的索引,加载帖子的所有评论总是很快。
保证注释是连续的唯一方法是将它们添加为子文档,但这是不明智的。首先,它意味着post文档必须经常在磁盘上移动(Mongo中的一个非常昂贵的操作,因为全局写锁定在移动的整个持续时间内保持),其次像注释这样的东西是无限的,因为一个非常受欢迎的帖子,你可以很好地达到文档大小限制,并没有办法添加更多的评论。