【问题标题】:Mongodb - most efficient way to structure my db?Mongodb - 构建我的数据库的最有效方法?
【发布时间】:2014-02-13 01:56:57
【问题描述】:

我对 mongodb 有点陌生,我正在尝试设置一个简单的服务器,我将在其中拥有用户、帖子、cmets、喜欢和不喜欢的东西等等。我想知道应该以哪种方式最有效地设置?

我是否应该有一张表用于添加 userId 和 postId(对于 dislike 和 cmets 表或多或少相同)

或者如果喜欢、不喜欢和 cmets 是帖子的一部分会更好吗?喜欢:

//Post structure
{
    "_id":"kljflskds",
    "field1":"content",
    "field2":"content",
    "likes":[userId,userId,userId],
    "dislikes":[userId,userId,userId],
    "comments":[{comment object},{comment object},{comment object}]
}

因为对于每个帖子,当我检索它们时,我想知道它有多少喜欢,有多少不喜欢,有多少 cmets。对于第一个版本,我需要在服务器(不必要的处理器能力?)或电话(不必要的带宽)上进行多个查询。但第二个只需要一个查询。我相信将 cmets 作为帖子的一部分的第二种选择似乎更有效,但我不是专业人士,所以我想听听其他人对此有何看法?

【问题讨论】:

  • 在面向对象的数据库中,没有表。通过一些技巧,您可以在帖子之外使用 cmets,但仅在一个请求中使用 cmets 查询帖子。集合不必包含相同的对象,因此您可以将 cmets 和帖子保存在同一个集合中并查询所有内容。此外,将 cmets 放在外面可以查询一定数量的 cmets。
  • 你在这里绑定了 mongo 吗?我认为像 Neo4j 这样的graph database 更适合这类数据模型。
  • @Loïc Faure-Lacroix 如果我将所有内容都保存在一个集合中,我可以查询哪些帖子的 cmets 最多吗?还是从所有帖子中获得总喜欢的用户?
  • @RickyA 看起来很有趣,我现在不能为这个项目做这件事,但我一定会在以后的项目中检查它。
  • Likes in mongoDB的可能重复

标签: mongodb


【解决方案1】:

正如已经指出的,面向文档的数据库中没有表。您还会发现,与通常有“正确方法”来构建数据库的关系数据库不同,MongoDB 并非如此。您的架构应根据您最经常访问信息的方式来构建。与表格中的行不同,文档非常灵活。

您可以创建一个 cmets 集合或将它们直接放在发布文档中。有两个考虑因素: 1. 您是否需要在不访问帖子的情况下访问 cmets?以及 2. 您的文档会变得太大且笨重吗?

在您的博客的这两种情况下,嵌套 cmets 很可能会更好,因为您的大部分流量将搜索帖子,并且您将拉取与帖子相关的所有 cmets。此外,一条评论不会被多个表拥有;此外,MongoDB 并不像关系数据库那样被非规范化,因此在多个文档中存在重复信息(即标签名称、城市名称等)是正常的。

另外,收藏likes 是一种非常“关系”的思维方式。在 MongoDB 中,我想不出你想要一个 likes 集合的用例。当您来自关系世界时,您真的必须退后一步,重新考虑您是如何创建数据库的,否则您将不断与它作斗争。

只有两个集合,postsusers,获取您正在寻找的信息将是微不足道的,因为您只需获取喜欢和 cmets 的计数,它们就在那里。

【讨论】:

  • 嗯,我想到了 16mb 的文档限制。还有更新文档的成本。不理想。
  • 好吧,如果它很受欢迎,likes 数组将为您填充它。
猜你喜欢
  • 2017-03-14
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多