博客的 mongodb 架构设计

2024-04-30

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

我希望能够有效地执行这些查询:
1.获取文章A、文章A的评论以及每个评论的投票数
2. 获取用户B对所有文章的所有评论
3.获取用户B投票的所有评论

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

有一些明显的缺点,例如重复用户投票数据,并且查询 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. The Votes只适用于一个Comment,所以它们被存储为一个数组,每个Comment。在本例中,我刚刚存储了 user_id。如果您想存储更多信息(time_created 等),那么您可以对对象数组进行投票:

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

如何有效地执行查询:

  1. 获取文章 A、对文章 A 的评论以及每个评论的投票数
db.articles.find( { _id : 'A' } )

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

  1. 获取用户 B 对所有文章的所有评论
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. 获取用户 B 投票的所有评论
db.articles.ensureIndex( { "comments.votes" : 1 } )
db.articles.find( { "comments.votes" : 987654 } )

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

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

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

大多数时候,查询 #3 会转化为来自以下位置的联接:Votes to Comments to Articles。既然如此,那为什么不直接把文章带回来呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

博客的 mongodb 架构设计 的相关文章

随机推荐

  • 如何使用 hg Convert 将 git 分支导入到 Mercurial 中?

    我的 git 存储库中有许多分支 david Panama app git branch r origin HEAD gt origin master origin master origin newButtons origin newFo
  • 在 Vue 的“选择”选项中显示来自服务器的对象列表

    我收到 grades 变量中格式正确的成绩列表 key gt value 如何使用此变量用 Vue 填充选择选项输入 我想我必须用 绑定 vue 变量 但我才刚刚开始使用 vue 我可以找到很少的基本示例
  • HttpURLConnection (java.net.CookieManager) 和 WebView (android.webkit.CookieManager) 之间的 cookie 双向同步

    不幸的是 Android 有很多 cookie 管理器 饼干为HttpURLConnection由以下人员维护java net CookieManager和饼干WebView由以下人员维护android webkit CookieManag
  • 如何在 Laravel 中使用数据库进行邮件设置

    我想让用户远离编辑配置文件 所以我在管理面板中制作了 Web 界面 用于设置邮件服务器 用户名 密码 端口 加密 我在 Laravel 4 2 中工作得很好 但是现在当应用程序被重写为 Laravel 5 时 出现错误 Class Sett
  • 如何改变Flutter对话框的位置

    我创建了一个对话框 在注册新用户时 Firestore 中存在号码时会显示该对话框 然而 默认情况下 Android 似乎将对话框定位在显示屏的中央 有没有办法将对话框定位在其调用的小部件的位置 对于我的情况 它是 凸起 按钮回调 还想知道
  • 如何在matplotlib中制作具有不同y轴的堆积折线图?

    我想知道如何制作堆积折线图 该图将在 matplotlib 中采用不同的列 关键是当我们进行聚合时 我需要在两个不同的列上进行数据聚合 我想我需要制作一个用于绘图的大数据框 我没有找到更漂亮 更方便的方法来在 pandas matplotl
  • 使用 Google Calendar API 返回 401(未经授权)

    我尝试通过 JavaScript 使用 Google Calendar API 并在使用以下代码时不断收到 401 错误响应 ajax dataType json url https www googleapis com calendar
  • 如何在 HTML 5 Web Worker 中访问 jQuery

    我无法在 HTML5 中访问 jQuery网络工作者 https en wikipedia org wiki Web worker 我有办法做到这一点吗 长话短说 包括这个脚本 http fel 8u cz workerrjs main w
  • 检索 arangodb 中没有链接边的顶点

    检索相关edge collection中没有边的所有顶点的最佳方法是什么 我尝试使用以下代码 但自 arangodb 2 8 以来 它变得非常慢 在以前的版本中并不是很快 但比现在快了大约 10 倍 对于大约 1000 个边和大约 3000
  • 将非泛型类扩展为泛型类

    org apache commons collections buffer 包中的 Java 类 CircularFifoBuffer 是非泛型的 可以存储任何类的对象 我想创建一个通用版本 它只能保存类 T 的对象 我的第一个想法是扩展
  • 为什么我可以通过带有太多参数的指针调用函数?

    假设我有这个功能 int func2 printf func2 n return 0 现在我声明一个指针 int fp double 这应该指向一个函数 该函数需要double参数并返回一个int func2没有任何论点 但当我写时仍然 f
  • str.isdecimal() 和 str.isdigit() 区别示例

    阅读 python 文档我了解到 isdecimal 和 isdigit 字符串函数 但我没有发现文献对它们的可用区别太清楚 有人可以向我提供这两个函数的区别的代码示例吗 类似行为 gt gt gt str isdecimal 1 True
  • DHCP 服务器将任何 url 重定向到登陆页面

    我有一个 Linux DHCP 服务器 我需要将所有网络流量重定向到一个登陆页面 该页面将包含有关如何在网络上注册计算机的说明 无论用户输入什么 URL 都需要将用户重定向到网页 在 DHCP 服务器上 即 用户输入 google com
  • 具有模板的 C++ 类找不到其构造函数

    我有一个问题我不太明白 我有一个节点类 template
  • CSS 背景图像尺寸过渡

    我正在研究一个简单的标记 可以调整 div 背景图像的大小 看小提琴 http jsfiddle net zeYZL http jsfiddle net zeYZL 我需要使用简单的 CSS 过渡来为其设置动画 我尝试这样做 tile ho
  • 如何阻止远程表单提交?

    我有一个可以远程和正常使用的表格 form for comment html class comment form remote request xhr do f f text area body f submit 我希望仅在以下情况下提交
  • 如何将“原始”字符串转换为普通字符串? [复制]

    这个问题在这里已经有答案了 在Python中 我有一个像这样的字符串 x89 n 如何将其解码为普通字符串 例如 x89 n 如果您的输入值为str字符串 使用codecs decode 转换 import codecs codecs de
  • 有 PayPal IPN 的示例吗

    我有一个 Asp Net WEB API 2 项目 我想实现一个即时付款通知 IPN 侦听器控制器 我找不到任何示例和 nuget 包 我所需要的只是确认用户使用 Paypal 上的标准 html 按钮付款 这很简单 所有 nuget 包都
  • 初始化列表中的依赖关系

    这种行为定义明确吗 class Foo int A B public Foo int Bar B Bar A B 123 int main Foo MyFoo 0 return 0 不 它是未定义的 A将首先初始化 它是类定义中的第一个 并
  • 博客的 mongodb 架构设计

    您将如何为具有基于文档的数据库 mongodb 的类似博客的网站设计架构 该站点具有以下对象 用户 文章 评论 用户可以向文章添加评论 每个用户还可以为每个评论投票一次 我希望能够有效地执行这些查询 1 获取文章A 文章A的评论以及每个评论