首先我要说的是,我知道这不是最好的解决方案。我知道这很复杂,而且只是个小插曲。但这就是我来这里的原因!
这个问题/工作建立在 和 Andrew Bosworth 在 Quora 上讨论的基础上,和 Andrew Bosworth 在 Quora 上讨论是 Facebook 新闻订阅的创建者。
我正在构建一个类似于 的新闻源,它完全是用 PHP
和 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分钟后) ,我经营一家老古董公司执行下面的脚本。这个脚本循环遍历数据库中的所有用户,查找该用户所有朋友的所有活动,然后将这些活动写入新闻提要。
目前,剔除活动(在 ActivityLog::getUsersActivity()
中调用)的 SQL
由于性能 * 的原因强加了一个 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 来生成推荐,但似乎对于像新闻提要这样的东西,推荐不起作用(因为以前没有什么是受欢迎的!).