使用NoSQL数据库创建关系的有效方法

使用NoSQL数据库创建关系的有效方法,nosql,Nosql,我目前正在尝试实现类似Tumblr的用户交互,如reblog、follow、followers、评论、我当前关注的人的博客帖子等。 此外,还需要显示每个博客文章的活动 我一直在为数据库创建合适的模式。有几种方法可以实现这种功能(定义嵌入的数据结构,如博客帖子和评论,为每个动作创建活动文档等),但我目前无法决定哪种方法在性能和可伸缩性方面是最好的 例如,让我们看看我所关注的人的实现。下面是示例用户文档 User = { id: Integer, username: String

我目前正在尝试实现类似Tumblr的用户交互,如reblog、follow、followers、评论、我当前关注的人的博客帖子等。 此外,还需要显示每个博客文章的活动

我一直在为数据库创建合适的模式。有几种方法可以实现这种功能(定义嵌入的数据结构,如博客帖子和评论,为每个动作创建活动文档等),但我目前无法决定哪种方法在性能和可伸缩性方面是最好的

例如,让我们看看我所关注的人的实现。下面是示例用户文档

User = { id: Integer, 
         username: String, 
         following: Array of Users,
         followers: Array of Users,
       }
这似乎微不足道。我可以管理每个用户操作的以下字段(follow/unfollow),但如果我当前跟踪的用户被删除怎么办。更新跟踪已删除用户的所有用户记录是否有效

另一个问题是创建我关注的人的博客文章视图

 Post = { id: Integer, 
          author: User, 
          body: Text,
        }
那么,查询最新帖子是否有效

 db.posts.find( { author: { $in : me.followers} } )

一种有效的方法叫做“星型模式”。如果你搜索web或wikipedia,你会发现很多信息。

在我看来,你试图使用单个数据存储(在本例中是面向文档的NoSQL数据库)来满足(至少)两个不同的需求。您似乎要做的第一件事是将数据存储在面向文档的存储中。我假设你有合法的理由这么做

第二件您似乎要做的事情是在您存储的文档之间建立关系。您的示例显示了以下关系。我建议将此视为与在面向文档的NoSQL数据库中存储数据不同的需求,并考虑在面向图形的NoSQL数据库(如Neo4j)中存储关系。这样,您的实体可以仅使用文档ID存储在文档存储中,关系存储在图形存储中


我的经验是,很难(如果不是不可能的话)获得一个NoSQL数据库来满足中大型应用程序的所有功能性和非功能性需求。例如,我正在开发的最新应用程序除了使用RDBMS外,还使用了MongoDB、Redis和Neo4j。我花了很多时间试验各种技术,最终决定采用这种组合。我已承诺使用Spring 3以及Spring数据项目,到目前为止,我的经验非常丰富。

感谢您的友好回答。我实际上使用的是非常适合Node.js的MongoDB。我不想使用任何其他技术(因为我必须学习它并处理其他问题),只要它可以通过有效地使用MongoDB来实现。我当然可以看到继续尝试使用MongoDB来维护文档关系的诱惑,担心另一种技术会造成更大的复杂性。然而,在我看来,这将是一个不可扩展的解决方案,除非所讨论的应用程序非常小,并且总是由单个开发人员维护。随着团队中开发人员数量的增加,每个人都必须了解更新和删除文档对文档关系的影响。从长远来看,这只会导致更多的错误和复杂性。