2012-02-10 66 views
5

我目前正在尝试实施类似Tumblr的用户交互,如reblog,follow,followers,commenting,我目前正在关注的人的博客文章等。 还有一个要求显示活动为每个博客文章。创建与NoSQL数据库的关系的有效方式

我坚持为数据库创建适当的架构。有几种方法可以实现这种功能(定义像博客文章和评论一样嵌入的数据结构,为每个动作创建活动文档等),但目前我无法确定哪种方式在性能和可伸缩性方面最好。

例如,让我们看看我关注的人的实施。这里是示例用户文档。

User = { id: Integer, 
     username: String, 
     following: Array of Users, 
     followers: Array of Users, 
     } 

这似乎微不足道。我可以管理每个用户操作的下一个字段(关注/取消关注),但如果我当前关注的用户被删除,该怎么办?更新跟随已删除用户的所有用户记录是否有效。

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

Post = { id: Integer, 
      author: User, 
      body: Text, 
     } 

那么它是有效的查询最新的帖子,如;

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

回答

0

有效的一种方法称为“星型模式”。如果你搜索网页或维基百科,那么你会发现很多信息。

3

看起来(对我)你试图使用单个数据存储(在这种情况下是一个面向文档的NoSQL数据库)来满足(至少)两种不同的需求。你似乎试图做的第一件事是将数据存储在面向文档的商店中。我假设你有这样做的合法理由。

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

我的经验是,要获得一个NoSQL数据库来满足大中型应用程序的所有功能和非功能需求将会很困难(如果不是不可能的话)。例如,我正在使用的最新应用程序除RDBMS外还使用MongoDB,Redis和Neo4j。我花了很多时间试验技术,并且决定采用这种组合。我已经致力于使用Spring 3以及Spring Data项目,迄今为止我的经验非常棒。

+0

感谢您的亲切回答。我实际上非常适合使用适合Node.js的MongoDB。我不想使用任何其他技术(因为我必须学习它并处理其他问题),只要它能够通过有效地使用MongoDB来实现。 – 2012-02-10 16:11:35

+0

我当然可以看到继续尝试使用MongoDB维护文档关系的担忧,因为担心其他技术会造成更多复杂性。然而,在我看来,这将是一个不可扩展的解决方案,除非应用程序非常小,并且总是由单个开发人员维护。随着团队中开发人员的增加,每个人都必须了解更新和删除文档与文档关系的含义。从长远来看,它只会导致更多的错误和复杂性。 – manish 2012-02-12 15:43:29