【发布时间】:2011-05-08 21:38:30
【问题描述】:
让我从一开始就说我知道这不是最好的解决方案。我知道它很笨拙并且是一个功能的破解。 但这就是我在这里的原因!
这个问题/工作建立在some discussion on Quora with Andrew Bosworth,Facebook 新闻提要的创建者。
我正在构建一个新闻提要。它仅在 PHP 和 MySQL 中构建。
MySQL
提要的关系模型由两个表组成。一张表用作活动日志;事实上,它被命名为activity_log。另一个表是newsfeed。 这些表几乎完全相同。
日志架构是activity_log(uid INT(11), activity ENUM, activity_id INT(11), title TEXT, date TIMESTAMP)
...供稿的架构是newsfeed(uid INT(11), poster_uid INT(11), activity ENUM, activity_id INT(11), title TEXT, date TIMESTAMP)。
任何时候用户做了与新闻提要相关的事情,例如提出问题,它会立即记录到活动日志中。
生成新闻提要
然后每 X 分钟(目前为 5 分钟,将更改为 15-30 分钟后),我运行一个 cron 作业,它执行下面的脚本。此脚本循环访问数据库中的所有用户,找到该用户所有朋友的所有活动,然后将这些活动写入新闻源。
目前,剔除活动的SQL(在ActivityLog::getUsersActivity() 中调用)有一个LIMIT 100,出于性能*原因。 *我不知道我在说什么。
<?php
$user = new User();
$activityLog = new ActivityLog();
$friend = new Friend();
$newsFeed = new NewsFeed();
// Get all the users
$usersArray = $user->getAllUsers();
foreach($usersArray as $userArray) {
$uid = $userArray['uid'];
// Get the user's friends
$friendsJSON = $friend->getFriends($uid);
$friendsArray = json_decode($friendsJSON, true);
// Get the activity of each friend
foreach($friendsArray as $friendArray) {
$array = $activityLog->getUsersActivity($friendArray['fid2']);
// Only write if the user has activity
if(!empty($array)) {
// Add each piece of activity to the news feed
foreach($array as $news) {
$newsFeed->addNews($uid, $friendArray['fid2'], $news['activity'], $news['activity_id'], $news['title'], $news['time']);
}
}
}
}
显示新闻提要
在客户端代码中,当获取用户的新闻提要时,我会执行以下操作:
$feedArray = $newsFeed->getUsersFeedWithLimitAndOffset($uid, 25, 0);
foreach($feedArray as $feedItem) {
// Use a switch to determine the activity type here, and display based on type
// e.g. User Name asked A Question
// where "A Question" == $feedItem['title'];
}
改进新闻提要
现在请原谅我对开发新闻提要的最佳实践的有限理解,但我理解我使用的方法是所谓的写入时扇出的有限版本,仅限于感觉我正在运行一个 cron 作业作为中间步骤,而不是直接写入用户的新闻提要。但这与拉取模型有很大不同,因为用户的新闻提要不是在加载时编译,而是定期编译。
这是一个大问题,可能值得大量反复讨论,但我认为它可以作为像我这样的新开发人员需要进行的许多重要对话的试金石。我只是想弄清楚我做错了什么,我该如何改进,或者我应该如何从头开始尝试不同的方法。
让我对这个模型感到困扰的另一件事是,它是基于新近度而不是相关性来工作的。如果有人可以建议如何改进这方面的工作相关性,我会全神贯注。我正在使用 Directed Edge 的 API 来生成推荐,但对于新闻提要之类的东西,推荐器似乎不起作用(因为之前没有任何东西被收藏!)。
【问题讨论】:
-
什么?这次没有附上幽默图片?你可以做得比这更好! :P
-
@Josh Try this :)
-
@Josh Smith 每个用户都有一个新闻源表吗?
-
@josh smith 如果您重建上述算法,请发布。谢谢
-
@JoshSmith,您是否为每个朋友执行一个 SQL 查询以获取他们的活动?
标签: php mysql web-applications feed