gpt4 book ai didi

database-design - 用于博客的 mongodb 架构设计

转载 作者:IT老高 更新时间:2023-10-28 13:03:35 25 4
gpt4 key购买 nike

您将如何为具有基于文档的数据库 (mongodb) 的类似博客的网站设计架构。该站点具有以下对象:用户、文章、评论。用户可以在文章中添加评论。每个用户也可以对每个评论进行一次投票。

我希望能够高效地进行这些查询:
1. 获得文章A、文章A的评论和每条评论的票数
2.获取用户B对所有文章的所有评论
3.获取用户B投票给的所有评论

我的第一次尝试是将文章和评论放在单独的集合中,评论可以包含投票给它的用户列表。这使得查询 1 和 2 变得简单。对于 3,我添加了 Vote 集合,用于跟踪用户的投票。

存在一些明显的缺点,例如复制用户投票数据,并且查询 1 需要两次调用数据库。有更好的方法吗?

Article {
"user_id"
}

Comment {
"user_id",
"article_id",
[user_voted],
}

Vote {
"user_id",
"comment_id",
}

最佳答案

Article {
"_id" : "A",
"title" : "Hello World",
"user_id" : 12345,
"text" : 'My test article',

"comments" : [
{ 'text' : 'blah', 'user_id' : 654321, 'votes' : [987654]},
{ 'text' : 'foo', 'user_id' : 987654, 'votes' : [12345, 654321] },
...
]
}

这里的基本前提是我将 Comments 嵌套在 Article 中。 Votes 仅适用于 Comment,因此它们与每个 Comment 一起存储为一个数组。在这种情况下,我刚刚存储了 user_id。如果要存储更多信息(time_created 等),则可以对对象数组进行投票:

... 'votes' : [ { user_id : 987654, ts : 78946513 } ] ...

如何高效地执行查询:

  1. get Article A, comments on Article A and # of votes per comments
db.articles.find( { _id : 'A' } )

这可以通过一个查询获得所有内容。您可能需要执行一些客户端逻辑来计算每条评论的投票数,但这非常简单。

  1. get all comments by User B across all articles
db.articles.ensureIndex( { "comments.user_id" : 1 } )
db.articles.find( { "comments.user_id" : 987654 } ) // returns all document fields

索引将允许有效地搜索文档中的评论。

目前无法仅从子数组中提取匹配项。此查询实际上将返回该用户的所有带有评论的文章。如果这可能是数据过多,您可以进行一些修剪。

db.articles.find( { "comments.user_id" : 987654 }, { "title" : 1, "comments.user_id" : 1 })
  1. get all comments User B voted for
db.articles.ensureIndex( { "comments.votes" : 1 } )
db.articles.find( { "comments.votes" : 987654 } )

同样,这将返回所有文章,而不仅仅是评论。

这里需要权衡取舍。退回文章可能看起来我们带回了太多数据。但是,当您进行查询 #3 时,您打算向用户显示什么?

如果没有评论本身,获取“我投票支持的评论”列表并不是非常有用。当然,如果没有文章本身(或至少只是标题),评论就不是很有用。

大多数时候,查询 #3 会演变为从 VotesCommentsArticles 的连接。如果是这样,那为什么不把文章带回来呢?

关于database-design - 用于博客的 mongodb 架构设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5224811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com