Database design 使用MongoDB制作类似Twitter的时间线

Database design 使用MongoDB制作类似Twitter的时间线,database-design,mongodb,Database Design,Mongodb,我需要什么: 假设您正在使用MongoDB,您有一个名为users的集合,每个用户都有一个“following”数组,其中包含他所跟踪的人的用户id。然后还有另一个集合状态,每个状态都包含其作者的\u id。 您如何向某个用户显示他跟踪的人添加的所有状态 我的尝试: 我将当前用户正在跟踪的所有用户\u id放在一个数组中(我使用的是PHP),然后使用它来查找这些用户使用$in的所有状态 问题: 这是最好的解决方案吗?我也看不到任何其他方法,我以前实现过这样的方法,没有问题 在您的情况下,应该是这

我需要什么:

假设您正在使用MongoDB,您有一个名为
users
的集合,每个用户都有一个“following”数组,其中包含他所跟踪的人的用户id。然后还有另一个集合
状态
,每个状态都包含其作者的
\u id
。 您如何向某个用户显示他跟踪的人添加的所有状态

我的尝试:

我将当前用户正在跟踪的所有用户
\u id
放在一个数组中(我使用的是PHP),然后使用它来查找这些用户使用
$in
的所有状态

问题:


这是最好的解决方案吗?

我也看不到任何其他方法,我以前实现过这样的方法,没有问题

在您的情况下,应该是这样的,您将某些用户的
$follower\u id
数组作为参数传递给函数:

$query  = array("status_owner_id" => array('$in' => $follower_ids));
$cursor = $mongo->yourdb->statuses->find($query);
如果你根据所有者id索引状态(如果你有足够的ram这样做),你会很快得到结果


希南,希望能有帮助。

是的,我也这么做。看看德怀特·梅里曼在他的博客上的建议


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

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

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

一个不方便的地方是,如果你删除一个状态,你必须在任何地方删除它。。。 此解决方案的主要优点是,每个用户都将拥有一系列已排序的状态!在前面的解决方案中,如果您跟踪3个用户,则需要获取他们的所有提要,然后对其进行排序,然后呈现它们


[编辑]正如Shekhar在评论中指出的,Mongo有文档限制。您需要创建状态集合并保存状态两次,一次用于user2,一次用于user1,并且需要具有fromId、toId、status和time

,因为MongoDB中的文档大小不能大于16 MB。是的,这确实是因为我的例子来自使用HBase的Facebook,对于MongoDb,你可以创建一个状态集合,当user2推送状态时,你保存它两次,一次为user2,第二次为user1,你的状态文档将包含一个fromId,一个toId,时间和地位本身。。。