3

对于非常简单的问题(或不是非常),我找不到“最佳”解决方案

拥有一组经典的数据:附加到用户的帖子、附加到帖子和用户的评论。

现在我无法决定如何构建方案/类

方法是将 user_id 存储在评论和内部。
但是当我在页面上有 200 条评论时会发生什么?
或者当我在页面上有 N 个帖子时?
我的意思是显示用户信息(如姓名、头像)应该是对数据库的 200 个额外请求

另一种解决方案是将用户数据嵌入到每个评论和每个帖子中。

但首先 -> 这是巨大的开销,第二 -> 模型系统正在损坏(使用 mongoalchemy),第三 -> 用户可以更改他的信息(如头像)。然后呢?据我了解,对大量评论或帖子进行更新操作并不是简单的操作......

你有什么建议?每页 200 个对 mongodb 的请求是否可以(必须以性能为目标)?

或者我可能只是错过了一些东西......

4

4 回答 4

3

您可以N+1使用 -queries 避免数百个请求的$in-problem。考虑一下:

Post {
  PosterId: ObjectId
  Text: string
  Comments: [ObjectId, ObjectId, ...] // option 1
}

Comment {
  PostId: ObjectId // option 2 (better)
  Created: dateTime,
  AuthorName: string,
  AuthorId: ObjectId,
  Text: string
}

现在您可以通过查询找到帖子评论$in,您还可以轻松找到特定作者发表的所有评论。

当然,您也可以将评论作为嵌入数组存储在 post 中,并$in在获取评论时对用户信息进行查询。这样,您不需要对用户名进行反规范化,也不需要数百个查询。

如果您选择非规范化用户名,您将不得不在用户更改(例如他的姓名)时更新该用户曾经发表的所有评论。另一方面,如果此类操作不经常发生,那应该没什么大不了的。或者,根据您的要求,存储用户发表评论时的姓名可能会更好。

嵌入的一个普遍问题是不同的作者将写入同一个对象,因此您将不得不使用原子修饰符(例如$push)。这有时更难与映射器一起使用(虽然我不知道 mongoalchemy),而且通常不太灵活。

于 2012-06-07T12:49:13.020 回答
1

我对 mongodb 所做的是将用户 ID 嵌入到评论中(这是“发布”文档结构的一部分)。

获得更好性能的三个简单提示:

1) 确保在 user_id 上有一个索引

2)使用评论分页方式,避免查询200次数据库

3)缓存是你的朋友

于 2012-06-07T12:42:04.150 回答
0

您可以缓存您的用户对象,这样您就不必每次都查询数据库。

我喜欢将用户数据嵌入每个帖子的想法,但是您必须考虑更新用户个人资料时会发生什么?必须确保没有错过任何帖子。

我建议从略读 mongo 建议您如何处理模式开始。

一般来说,对于实体之间的“包含”关系,应该选择嵌入。不使用链接时使用链接会导致数据重复。

http://www.mongodb.org/display/DOCS/Schema+Design

于 2012-06-07T12:48:09.483 回答
0

MongoDB 文档中有一个非常好的用例:http ://docs.mongodb.org/manual/use-cases/storing-comments/ 它也是用 Python 编写的 :-)

于 2012-06-07T23:32:15.250 回答