PHP/MySQL 活动 (ala facebook)

Posted

技术标签:

【中文标题】PHP/MySQL 活动 (ala facebook)【英文标题】:PHP/MySQL Activity (ala facebook) 【发布时间】:2009-08-06 01:12:06 【问题描述】:

这可能是一个棘手的问题,但是。说我有

Followers:
-user_id
-follower_id

Activities:
-id
-user_id
-activity_type
-node_id

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

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

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

【问题讨论】:

【参考方案1】:

子选择通常比 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

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

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

【讨论】:

我认为日期的概念非常重要,但也许这只是 Josh 的遗漏。【参考方案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

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

【讨论】:

如果我刚刚将您添加为朋友并且想查看您最近的活动怎么办?我们是否必须回顾性地将用户的活动添加到新的关注者? 好点。在上面的示例中,您不会在自己的活动流中看到用户的最后活动。您只会看到新条目。我认为这是可以接受的。您可以随时前往用户的公开页面查看他们自己的活动日志(如果对其他用户公开)。 所以你在说什么,如果我有 5,000 个朋友/追随者并且我发布了一个帖子,我应该为我所做的每个操作在数据库中创建 5,000 个条目?我希望我误解了你的答案,否则这将是一个可怕的答案,没有不尊重。【参考方案3】:

我不知道我是否正确理解了您的需求,但是 我会试试这个选择,如果我是对的,你应该得到#USERID# 的所有关注者的所有活动

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

【讨论】:

以上是关于PHP/MySQL 活动 (ala facebook)的主要内容,如果未能解决你的问题,请参考以下文章

ALA 资产组名称

Smart Text Re sizer ala jQuery(和cookies)

javascript NodeJS模块,用于通过www.jsonstore.io(ala firebase)存储(公共)JSON

FacebookException:无法获取应用名称

django.db.migrations 是不是有“更新迁移”(ala South)选项?

是否有用于在 Django 中实现视图模型装饰器 ala Draper 的库?