0

例如我有模型UserPost

用户

{
    "_id": ObjectId("pretendThisIsAUserObjectId"),
    "name": "someUser"
}

邮政

{
    "_id": ObjectId("pretendThisIsAUserObjectId"),
    "title": "blah blah",
    "user_id": ObjectId("pretendThisIsAUserObjectId"),
    "content": "more blah"
}

用户有很多帖子。所以我们已经user_id存储在Post.

因此,当我们为每个用户列出帖子时,我们将有 N+1 个查询(N 个帖子加上 1 个用户名查询),因为我们在 MongoDB 中没有加入。

我们也可以将用户名存储在Post, 以进行优化吗?

4

2 回答 2

2

简短的回答是肯定的。您可以将数据非规范化到您认为适合您的特定需求的任何程度。您甚至可以将整个User文档存储在 each 中Post,但这将是一种愚蠢的重复。

然而,我的第一个倾向是考虑在应用程序端缓存与每个用户 ID 关联的用户名,而不是尝试在Post文档中包含名称或每次需要时都查询它。

如果您的用户名是唯一的,您可以考虑将用户名设置_idUser文档的,而不是标准的ObjectId. 这使您的用户 ID 更加有用,因为您不再需要执行额外的查询来查找每个用户的姓名,因为他们的姓名就是他们的 ID。

于 2012-12-22T19:05:35.417 回答
0

如果您启用了身份映射includes,则可以照常使用。

Post.includes(:user)...

请参阅急切加载

于 2012-12-22T18:54:38.640 回答