PHP / MySQL活动(ala facebook)

时间:2009-08-06 01:12:07

标签: php mysql social-networking

这可能是一个毛茸茸的问题但是。说我有

Followers:
-user_id
-follower_id

Activities:
-id
-user_id
-activity_type
-node_id

拉动用户活动相当容易。但是,追随者活动的最佳方式是什么?一个子选择?随着用户越来越多的关注者,它似乎非常缓慢。有什么想法加快这个速度吗?

此外,在更概念的层面上。分组如何工作。这一切都是用一个查询完成的吗?或者是所有活动数据都被拉入,然后在PHP端进行排序和分组?

用户X,Y和Z执行活动A. 用户J做了活动B中的3个

3 个答案:

答案 0 :(得分:4)

子选择通常比JOIN慢,但它实际上取决于你用它们做了什么。为了回答你的主要问题,我会通过JOIN获得关注者数据:

SELECT * FROM followers f
LEFT JOIN activities a ON f.follower_id=a.user_id
WHERE f.user_id=$followedPerson

假设关注者表代表的用户user_id,并且跟随他们的用户follower_id恰好是用户表中的user_id。< / p>

只要您在followers.user_id上有索引,它就不会令人难以置信地慢。但是,此类查询可能返回的数据量可能会大于您真正想要处理的数据量。您需要确定应用程序要显示的活动类型,并尝试相应地对其进行过滤,以便您不会一直进行大量查询,而只使用返回结果的一小部分。

将数据拉出并对其进行分组PHP方面很好,但是如果你可以避免首先选择它,那你就更好了。在这种情况下,假设存在日期,我可能会添加ORDER BY f.follower_id,activity_date DESC,并尝试为活动表提供更多过滤条件。然后我将遍历PHP中的行,输出由关注者分组的数据。

答案 1 :(得分:2)

活动日志可能存在大量记录,因为它通常混合了当前用户的活动和所有朋友。如果您要加入各种表格,并且用户有100个朋友可能会抽出大量数据。

一种方法是对数据进行非规范化处理,并将其视为一个大日志,其中应出现在用户活动日志页面上的所有条目都存储在针对该用户的活动日志表中。例如,如果用户A有两个朋友,即用户B和用户C,当用户A执行某些操作时会创建三个活动日志记录:

record 1: "I did this" log for user A
record 2: "My friend did this" log for user B
record 3: "My friend did this" log for user C

你会得到重复,但这并不重要。选择速度很快,因为它来自一个表并且只是用户ID索引。而且你很可能会保存一个活动日志表(即删除1个月以上的条目)。

活动日志表可能类似于:

-id
-user_id  (user who's activity log this is)
-action_user_id  (user who took the action, or null if same as user_id)
-activity_type
-date

为单个用户选择所有最近的活动日志非常简单:

SELECT * from activity_log WHERE user_id = ? ORDER by date DESC LIMIT 0,50

要使此方法真正有效,您需要在单个活动日志表中拥有足够的信息,以便不需要任何进一步的选择。例如,您可以存储原始日志消息,而不是动态构建它。

答案 2 :(得分:0)

我不知道我是否理解你需要的东西但是 我会尝试这个选择,如果我是对的,你应该为#USERID#的所有粉丝获得所有活动

SELECT a.* FROM Activities AS a 
INNER JOIN Followers AS f1 
ON a.user_id = f1.follower_id
WHERE f1.user_id = #USERID#