使用MongoDB制作类似Twitter的时间表

时间:2010-10-01 10:50:11

标签: database-design mongodb

我需要什么:

假设您正在使用MongoDB并且您有一个名为users的集合,并且每个用户都有一个“跟随”数组,其中包含他所关注人员的_id个用户。然后你有另一个集合statuses,每个集合包含其作者的_id。 如何向某个用户显示他所关注的人添加的所有状态?

我尝试了什么:

我将当前用户所关注的所有用户_id放入一个数组中(我使用的是PHP),然后我用它来查找那些使用$in的用户的所有状态。

问题:

这是最好的解决方案吗?

3 个答案:

答案 0 :(得分:3)

我也看不到任何其他方式,我之前实现了这样的事情并且没有问题。

在你的情况下,它应该是这样的,你将某个用户的$follower_ids数组作为参数传递给你的函数:

$query  = array("status_owner_id" => array('$in' => $follower_ids));
$cursor = $mongo->yourdb->statuses->find($query);

如果你在owner_id上索引状态(如果你有足够的ram这样做)你会得到非常快的结果。

希望它有所帮助,思南。

答案 1 :(得分:1)

是的,我做的完全一样。看看Dwight Merriman在他博客上的建议。

http://dmerr.tumblr.com/post/463694595/just-for-fun-a-single-server-twitter-design

答案 2 :(得分:0)

你尝试过的是每个人首先想到的但是它不容易扩展...你可以随时添加更多服务器或使用分片等... 如果你有数百万用户和跟随很多人的人,这个解决方案将变得非常难以执行。

当有人发布状态时,还有另一种解决方案基本上只是进行聚合。 Facebook使用这个想法,它可能更容易扩展,如果有人跟踪25000人,他会很快看到他的状态列表,你的服务器不必“争取”快速检索数据。

您将拥有一个用户集合,每个用户都将拥有一个状态数组。假设你有user1和user2,那个user1跟随user2。当user2推送状态时,其状态将保存在user1数组状态和user2数组状态中。您将使用更多存储,其中mongoDB意味着更多的内存....在Facebook,他们使用Hadoop和HBase作为主存储,然后他们拥有大量的服务器和大量的内存。

一个不方便的是,如果你删除一个状态,你必须在任何地方删除它... 这个解决方案的主要优点是,每个用户都将按顺序拥有一系列状态!在上一个解决方案中,如果你关注3个用户,你需要获取所有的提要然后对它们进行排序,然后渲染它们......

[编辑]就像Shekhar在评论中指出的那样,Mongo有一个文件限制。您需要创建状态集合并保存状态两次,一次针对user2,一次针对user1,需要具有fromId,toId,status和time