mongodb模式设计

mongodb模式设计,mongodb,database-schema,Mongodb,Database Schema,我正在努力为一个应用程序找到最好的数据库设计。我有SQL背景,倾向于创建或多或少的非规范化数据库设计 我有以下问题。我有一个“文章”集合,包含大约2000篇文章。每篇文章都有相当多的信息。实现一个推荐系统,我想为每个“文章”与每个“用户”关联一个“预测”。 在SQL中,我将使用三个表对此进行建模:“Articles”、“Users”、“UserToArticle”。 查询应该如下:我想为每个“文章”关联当前登录用户的“PredictedRating”。在SQL中,我会在“Article”和“Us

我正在努力为一个应用程序找到最好的数据库设计。我有SQL背景,倾向于创建或多或少的非规范化数据库设计

我有以下问题。我有一个“文章”集合,包含大约2000篇文章。每篇文章都有相当多的信息。实现一个推荐系统,我想为每个“文章”与每个“用户”关联一个“预测”。 在SQL中,我将使用三个表对此进行建模:“Articles”、“Users”、“UserToArticle”。 查询应该如下:我想为每个“文章”关联当前登录用户的“PredictedRating”。在SQL中,我会在“Article”和“Users”之间建立一个连接,预先选择相应的用户。 拥有正确的索引非常快

我如何以mongo的方式实现这一点?当我以所描述的方式实现这一点时,我不得不为每一篇文章放置一个findOne()查询,这是非常低效和缓慢的(即使在使用索引时)


你有什么想法吗?重要的是,只发布当前用户的预测评分。

经验法则

MongoDB博客有一些:

  • 尽可能使用嵌入式文档
  • 如果子文档经常是自己读取的,最好不要嵌入它
  • 保持数组小。如果嵌入的文档数组不断增长,则将其替换为引用ID数组。如果引用数组不断增长,请尝试反转引用或将引用提取到它自己的集合中
  • 应用程序级联接仍然是一种选择。正确使用索引和投影时,性能不应该下降
  • 您可以嵌入很少更新但经常读取的文档,即使这意味着冗余数据。如果您需要频繁更新数据,请不要嵌入冗余数据,因为它可能超过读取优势
  • 为应用程序优化数据模型。需要一起读或写的内容应该移近一些(进入更少的集合)
  • 因此,对文档数据库进行建模并不像规范化关系数据模型那样简单。当你掌握了这些经验法则,你应该阅读


    示例

    我们需要将三个域对象放入MongoDB:用户、文章和预测评级。我假设有很多用户,甚至更多的文章。很明显,我们不应该将用户和文章放在一个集合中(项目符号2、4和5)。因此,我们只需要决定将预测评级放在哪里

    将评级嵌入文章

    由于您的用例是为一个用户获得所有预测的评分,因此将其放入文章(6)中会适得其反。您需要搜索所有文章以获得评级。此外,如果你删除了一个用户,你需要更新每一篇文章

    将评级嵌入用户

    将评级嵌入到用户中的优点是,您只需要一个查询即可获得用户和评级数据。但是您可能希望为每个用户的每一篇文章添加一个评级,因此数组将增长到更多(3)

    将收视率放入自己的收藏中

    因此,将评级放入他们自己的收藏中是可行的

    {
        _id: ObjectId("f01..."),
        userId: ObjectId("123..."),
        articleId: ObjectId("abc..."),
        predictedRating: 5.4
    }
    

    如前所述,这取决于你的数量结构。如果你只有很少的用户或文章,那么嵌入预测的评分可能是一个更简单、更快的解决方案。

    不清楚你需要什么类型的查询。例如,一个用户的所有评分或一篇文章的所有评分或两者都有?好的观点:我需要一个用户的所有评分。