我目前正在尝试实施类似Tumblr的用户互动,例如我正在关注的人员的关注日期,关注者,关注者,评论,博客帖子等。 此外,还需要显示每篇博文的活动。
我坚持为数据库创建适当的架构。有几种方法可以实现这种功能(定义嵌入的数据结构,如博客帖子和评论,为每个动作创建一个活动文档等),但我目前无法确定哪种方式在性能和可扩展性方面是最好的。
例如,让我们看看我关注的人的实施情况。以下是用户文档示例。
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项目,到目前为止我的经验非常棒。
答案 1 :(得分:0)
一种有效的方法称为“星型模式”。如果您搜索网络或维基百科,那么您将找到大量信息。