我需要什么:
假设您正在使用MongoDB并且您有一个名为users
的集合,并且每个用户都有一个“跟随”数组,其中包含他所关注人员的_id
个用户。然后你有另一个集合statuses
,每个集合包含其作者的_id
。
如何向某个用户显示他所关注的人添加的所有状态?
我尝试了什么:
我将当前用户所关注的所有用户_id
放入一个数组中(我使用的是PHP),然后我用它来查找那些使用$in
的用户的所有状态。
问题:
这是最好的解决方案吗?
答案 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