3

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

Followers:
-user_id
-follower_id

Activities:
-id
-user_id
-activity_type
-node_id

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

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

用户 X、Y 和 Z 进行了活动 A 用户 J 进行了活动 B 的 3

4

3 回答 3

4

子选择通常比 JOIN 慢,但这实际上取决于您对它们的具体操作。为了回答您的主要问题,我将通过 JOIN 获得关注者数据:

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

这是假设 follower 表代表一个用户user_id,以及跟随他们的人follower_id恰好是user_idusers 表中的 a 。

只要你有一个索引,它就不会非常followers.user_id慢。但是,这样的查询可能返回的数据量可能会比您真正想要处理的要大。您需要确定应用程序要显示的活动类型,并尝试对其进行相应的过滤,这样您就不会一直进行大量查询,而只使用返回结果的一小部分。

提取数据并将其分组 PHP 端很好,但如果你能避免一开始就选择它,你会更好。在这种情况下,我可能会添加一个ORDER BY f.follower_id,activity_date DESC,假设存在日期,并尝试为活动表提出更多过滤条件。然后我会遍历 PHP 中的行,输出按关注者分组的数据。

于 2009-08-06T01:23:50.340 回答
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

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

于 2009-08-09T19:06:14.203 回答
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# 
于 2009-08-06T01:25:17.687 回答