让我马上说,我知道这不是最佳解决方案。我知道这很糊涂并且是功能的骇客。但这就是为什么我在这里!
这个问题/工作建立在与Facebook新闻提要的创建者Andrew Bosworth在Quora上的一些讨论之上。
我正在建立各种各样的新闻提要。它仅内置于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来生成推荐,但似乎对于新闻提要之类的推荐器将不起作用(因为以前没有喜欢任何东西!)。