我正在研究构建 Activity Feed 的后勤工作,类似于 Facebook 或 Twitter 的时间线。
在 StackOverlfow 和 Quora 以及我在 google 上找到的其他文章中,有大量的答案描述了阅读或写作时的扇形展开。这一切都是有道理的。您将所有事件记录在一个主要事件表/集合中,然后在某个时候,将该数据的副本写入到单独的、适合每个用户的表中。
我不完全理解的是为什么需要扇出?也就是说,为什么需要记录个人用户订阅源上的事件?您不能只使用一个事件表/集合有什么原因吗?它将具有适当的索引,并具有执行用户的 ID。然后,当有人想查看他们的事件流时,只需查询当前用户正在关注的用户的事件流。
我知道这可能效率不高,因为事件的数量比数据库中的实际对象多了好几倍。也就是说,数据库中可能有 100 个帖子,但对帖子执行的操作超过 1,000 个,因此当行数非常高时,事件表/集合上的查询可能会很慢。
但这行不通吗?您能否只扩展数据库以便更有效地处理查询?是否真的需要展开?
最佳答案
不一定总是扇出,但决定取决于许多因素。
例如。 Twitter 两者都做,但 Facebook 遵循加载时扇出。
您可以想象,Facebook 的事件流比 Twitter 的要复杂得多。 FB 需要为每个用户/组应用大量过滤器/隐私设置,因此对他们来说,动态拉取和构建流是有意义的。他们的 TAO 图基础设施(在 MySQL + 缓存之上绘制图)使他们可以轻松地为每个用户快速构建和获取提要。
关于mysql - 为什么在构建事件源时应该扇出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28175192/