如何改进此 PHP/MySQL 新闻源?
让我马上说,我知道这不是最好的解决方案。我知道这是笨拙的,并且是一个功能的黑客。但这就是我在这里的原因!
这个问题/工作建立在与Facebook新闻提要的创建者安德鲁·博斯沃思(Andrew Bosworth)关于Quora的一些讨论之上。
我正在构建某种新闻提要。它仅内置于 和 中。PHP
MySQL
The 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来生成推荐,但对于像新闻提要这样的东西,推荐器似乎不起作用(因为以前没有收藏过任何东西!