我有一个拥有50万用户的网站(运行在SQL Server 2008上)。我现在想要包含用户和他们朋友的活动流。在尝试了一些SQL Server的东西后,显然关系型数据库不适合这种功能,即使我大量去规范化数据也很慢。因此,在查看其他NoSQL解决方案后,我发现可以使用MongoDB来实现。我将遵循基于activitystrea.ms的数据结构 活动流json格式说明 所以我的问题是:对于MongoDB中的活动流,哪种是最佳的模式设计(由于有这么多用户,你可以预测它将非常依赖写入,因此我选择了MongoDB——它具有出色的“写入”性能)。我考虑了3种类型的结构,请告诉我是否合理或者我应该使用其他模式设计。
1 - 在同一个文档中存储每个活动和所有好友/关注者:
{ _id:'activ123', actor:{ id:person1 }, verb:'follow', object:{ objecttype:'person', id:'person2' }, updatedon:Date(), consumers:[ person3, person4, person5, person6, ... so on ]
}
2 - 第二种设计:集合名称-activity_stream_fanout
{ _id:'activ_fanout_123', personId:person3, activities:[ { _id:'activ123', actor:{ id:person1 }, verb:'follow', object:{ objecttype:'person', id:'person2' }, updatedon:Date(), }
],[ //activity feed 2 ]
}
3 - 这个方法是将活动项目存储在一个集合中,而消费者则存储在另一个集合中。在活动中,您可能会有一个类似以下的文档:
{ _id: "123", actor: { person: "UserABC" }, verb: "follow", object: { person: "someone_else" }, 更新时间:Date(...)
然后,对于关注者,我将有以下“通知”文档:
{ activityId: "123", consumer: "某人", 更新时间:Date(...)} { activityId: "123", consumer: "其他人", 更新时间:Date(...)} { activityId: "123", consumer: "第三个人", 更新时间:Date(...)}
非常感谢您的提问。