与NoSQL数据库建立关系的有效方法

Bur*_*yer 5 nosql

我目前正在尝试实现类似Tumblr的用户交互,例如reblog,关注者,关注者,评论,我目前关注的人的博客帖子等.此外,还需要显示每篇博文的活动.

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

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

User = { id: Integer, 
         username: String, 
         following: Array of Users,
         followers: Array of Users,
       }
Run Code Online (Sandbox Code Playgroud)

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

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

 Post = { id: Integer, 
          author: User, 
          body: Text,
        }
Run Code Online (Sandbox Code Playgroud)

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

 db.posts.find( { author: { $in : me.followers} } )
Run Code Online (Sandbox Code Playgroud)

man*_*ish 5

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

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

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