Comment puis-je améliorer cette PHP/MySQL fil d'actualité?

Permettez-moi de commencer dès le départ en disant que je sais que ce n'est pas la meilleure solution. Je sais que c'est encombrants et d'un hack d'une fonctionnalité. Mais c'est pourquoi je suis ici!

Cette question/travail repose sur une discussion sur Quora avec Andrew Bosworth, le créateur de Facebook du flux d'actualités.

Je suis en train de construire un flux d'actualités de toutes sortes. Il est construit uniquement dans PHP et MySQL.

Comment puis-je améliorer cette PHP/MySQL fil d'actualité?


MySQL

Le modèle relationnel de l'alimentation est composée de deux tables. Une table fonctionne comme un journal d'activité; en fait, il est nommé activity_log. L'autre tableau est newsfeed. Ces tables sont presque identiques.

La schéma pour le journal est activity_log(uid INT(11), activity ENUM, activity_id INT(11), title TEXT, date TIMESTAMP)

...et la schéma de l'alimentation est newsfeed(uid INT(11), poster_uid INT(11), activity ENUM, activity_id INT(11), title TEXT, date TIMESTAMP).

Chaque fois qu'un utilisateur fait quelque chose de pertinents pour le flux d'actualités, par exemple en posant une question, il sont consignés dans le journal d'activité immédiatement.


Générer le flux de nouvelles

Puis toutes les X minutes (5 minutes au moment du changement de 15 à 30 minutes plus tard), - je exécuter une tâche cron qui exécute le script ci-dessous. Ce script fait une boucle par tous les utilisateurs dans la base de données, trouve toutes les activités pour tous que l'utilisateur amis, puis écrit ces activités à l'actualité.

À l'heure actuelle, la SQL que les résidus de l'activité (appelé dans ActivityLog::getUsersActivity()) a un LIMIT 100 imposées pour la performance* raisons. *Pas que je sais de quoi je parle.

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

Afficher le flux de nouvelles

Dans le code du client, lors de l'extraction de l'utilisateur du fil d'actualité, je fais quelque chose comme:

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

}

Améliorer le flux d'actualités

Maintenant, pardonne ma compréhension limitée des meilleures pratiques pour l'élaboration d'un flux d'actualités, mais je comprends la démarche, je suis en utilisant une version limitée de ce qu'on appelle fan-out sur l'écriture, limitée dans le sens que je suis en cours d'exécution d'une tâche cron comme une étape intermédiaire au lieu d'écrire pour les utilisateurs de nouvelles rss directement. Mais c'est très différent d'un modèle d'extraction, dans le sens que l'utilisateur du fil d'actualité n'est pas compilé sur la charge, mais plutôt sur une base régulière.

C'est une grande question qui mérite sans doute une grande quantité de va-et-vient, mais je pense qu'il peut servir de pierre de touche pour de nombreuses conversations importantes que les nouveaux développeurs, comme moi, ont besoin d'avoir. Je suis juste essayer de comprendre ce que je fais mal, comment je peux l'améliorer, ou comment je devrais peut-être même commencer à partir de zéro et de tenter une approche différente.

Une autre chose qui me dérange à propos de ce modèle est qu'il travaille en se fondant sur l'expérience récente plutôt que de pertinence. Si quelqu'un peut suggérer comment cela peut être amélioré pour les travaux de pertinence dans le, je serais à toutes les oreilles. Je suis Orientée à Bord de l'API pour générer des recommandations, mais il semble que quelque chose comme un flux d'actualités, prescripteurs ne fonctionne pas (car rien de ce qui a été précédemment ajoutés à vos favoris!).

  • Quoi? Aucun humour image ci-jointe de ce temps? Vous pouvez faire mieux que ça! 😛
  • Oh, l'homme, vous avez raison. Je dois être vieux.
  • Essayez ceci 🙂
  • Je vais le faire maintenant. Vous tentatrice.
  • Geddit? Haha!
  • Si vous êtes intéressé, édité ici pour ajouter un lien à une discussion intéressante sur Quora avec Andrew Bosworth, à partir de laquelle ce travail a été inspiré quora.com/...
  • vous êtes à 3 de 3 ce soir.
  • 3 pour 3? Mon vendredi après-midi, le cerveau ne fait pas de calcul...
  • cela signifie 3 succès sur 3 tentatives.
  • Un inconvénient de l'utilisation d'ENUM, c'est que si vous voulez ajouter de nouveaux types d'activité, alors vous aurez besoin pour effectuer une commande ALTER table, qui sera prohibitif si vous avez un grand nombre de lignes. (un ALTER table des verrous pour l'écrit, et pendant une partie du processus, il permet pour les lectures).
  • Je ne connaissais pas ce sujet ENUM. Est-il une alternative vous suggère à la place?
  • Smith est-ce que chaque utilisateur d'avoir un fil d'actualité de la table?
  • smith Si vous reconstruisez votre algorithme ci-dessus, veuillez la publier. Merci
  • avez-vous d'exécuter une requête SQL pour chaque ami à saisir leurs activités?
  • Je suis en train de faire les news, basée sur l'utilisateur suivant. L'utilisateur peut avoir 1000s de disciples. Mon idée est de créer un tableau distinct pour chaque utilisateur (lors de l'enregistrement de l'utilisateur) qui permet de stocker de l'activité de tous les utilisateurs, il sera la suite. Ma question est de savoir quand une personne frappe bouton j'aime et il a disons 1000 followers. Pour stocker des données dans chacun des disciples "mangeoire", je vais utiliser une boucle foreach. Est l'aide de boucle foreach bon ou mauvais? Que faire si les boucles de pauses et cesse de répondre? Si l'utilisateur est d'avoir un nombre élevé d'adeptes boucle foreach peut prendre trop de temps sur chaque activité de l'utilisateur effectue. Toute solution?
  • Peut-être en utilisant une table de jointure, puis un user_id dans (ami de l'id).

InformationsquelleAutor Josh Smith | 2010-11-12