Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6082109
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 23, 20262026-05-23T11:15:09+00:00 2026-05-23T11:15:09+00:00

Let me start right off the bat by saying that I know this is

  • 0

Let me start right off the bat by saying that I know this is not the best solution. I know it’s kludgy and a hack of a feature. But that’s why I’m here!

This question/work builds off some discussion on Quora with Andrew Bosworth, creator of Facebook’s news feed.

I’m building a news feed of sorts. It’s built solely in PHP and MySQL.

alt text


The MySQL

The relational model for the feed is composed of two tables. One table functions as an activity log; in fact, it’s named activity_log. The other table is newsfeed. These tables are nearly identical.

The schema for the log is activity_log(uid INT(11), activity ENUM, activity_id INT(11), title TEXT, date TIMESTAMP)

…and the schema for the feed is newsfeed(uid INT(11), poster_uid INT(11), activity ENUM, activity_id INT(11), title TEXT, date TIMESTAMP).

Any time a user does something relevant to the news feed, for example asking a question, it will get logged to the activity log immediately.


Generating the news feeds

Then every X minutes (5 minutes at the moment, will change to 15-30 minutes later), I run a cron job that executes the script below. This script loops through all of the users in the database, finds all the activities for all of that user’s friends, and then writes those activities to the news feed.

At the moment, the SQL that culls the activity (called in ActivityLog::getUsersActivity()) has a LIMIT 100 imposed for performance* reasons. *Not that I know what I’m talking about.

<?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']);
      }
    }
  }
}

Displaying the news feeds

In the client code, when fetching the user’s news feed, I do something like:

$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'];

}

Improving the news feed

Now forgive my limited understanding of the best practices for developing a news feed, but I understand the approach I’m using to be a limited version of what’s called fan-out on write, limited in the sense that I’m running a cron job as an intermediate step instead of writing to the users’ news feeds directly. But this is very different from a pull model, in the sense that the user’s news feed is not compiled on load, but rather on a regular basis.

This is a large question that probably deserves a large amount of back and forth, but I think it can serve as a touchstone for many important conversations that new developers like myself need to have. I’m just trying to figure out what I’m doing wrong, how I can improve, or how I should maybe even start from scratch and try a different approach.

One other thing that bugs me about this model is that it works based on recency rather than relevancy. If anyone can suggest how this can be improved to work relevancy in, I would be all ears. I’m using Directed Edge’s API for generating recommendations, but it seems that for something like a news feed, recommenders won’t work (since nothing’s been favorited previously!).

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-23T11:15:10+00:00Added an answer on May 23, 2026 at 11:15 am

    Really cool question. I’m actually in the middle of implementing something like this myself. So, I’m going to think out loud a bit.

    Here’s the flaws I see in my mind with your current implementation:

    1. You are processing all of the friends for all users, but you will end up processing the same users many times due to the fact that the same groups of people have similar friends.

    2. If one of my friends posts something, it won’t show up on my news feed for at most 5 minutes. Whereas it should show up immediately, right?

    3. We are reading the entire news feed for a user. Don’t we just need to grab the new activities since the last time we crunched the logs?

    4. This doesn’t scale that well.

    The newsfeed looks like the exact same data as the activity log, I would stick with that one activity log table.

    If you shard your activity logs across databases, it will allow you to scale easier. You can shard your users if you wish as well, but even if you have 10 million user records in one table, mysql should be fine doing reads. So whenever you lookup a user, you know which shard to access the user’s logs from. If you archive your older logs every so often and only maintain a fresh set of logs, you won’t have to shard as much. Or maybe even at all. You can manage many millions of records in MySQL if you are tuned even moderately well.

    I would leverage memcached for your users table and possibly even the logs themselves. Memcached allows cache entries up to 1mb in size, and if you were smart in organizing your keys you could potentially retrieve all of the most recent logs from the cache.

    This would be more work as far as architecture is concerned, but it will allow you to work in real-time and scale out in the future…especially when you want users to start commenting on each posting. 😉

    Did you see this article?

    http://bret.appspot.com/entry/how-friendfeed-uses-mysql

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Let me start off by saying I know this is probably not the correct
Let me start by saying that I do not advocate this approach, but I
Let me start out by saying that I'm not a JavaScript developer so this
Let me start out by saying that I'm not a C developer and I
Preface Let me start off by saying that I'm a relatively new programmer and
I love LaTeX. Let's get that straight right off the bat. The only thing
Let me start off with a bit of background. This morning one of our
Let me start by saying I'm a huge fan of the elegance of this
I'm having difficulty using reinterpret_cast. Lets just say right off the bat that I'm
Let me start out by saying that I feel like there should be a

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.