Un journal d'activité a le potentiel pour un très grand nombre d'enregistrements car il présente généralement un mélange d'activité de l'utilisateur actuel et de tous ses amis. Si vous rejoignez plusieurs tables et qu'un utilisateur a des centaines d'amis, il est possible que beaucoup de données soient retirées. Une approche consiste à dénormaliser les données et à les traiter comme un grand journal dans lequel toutes les entrées qui doivent apparaître sur la page du journal d'activité d'un utilisateur doivent être stockées dans la table du journal des activités pour cet utilisateur. Par exemple, si l'utilisateur A deux amis, l'utilisateur B et C utilisateur, lorsque l'utilisateur A fait quelque chose de trois enregistrements du journal d'activité sont créés:
record 1: "I did this" log for user A
record 2: "My friend did this" log for user B
record 3: "My friend did this" log for user C
Vous obtiendrez des doublons, mais cela n'a pas vraiment d'importance. Il est rapide à sélectionner car il provient d'une table et est indexé uniquement sur l'ID utilisateur. Et il est probable que vous conserviez une table de journal d'activité (c'est-à-dire que vous supprimiez les entrées datant de plus d'un mois).
La table de journal d'activité pourrait être quelque chose comme:
-id
-user_id (user who's activity log this is)
-action_user_id (user who took the action, or null if same as user_id)
-activity_type
-date
Pour sélectionner tous les journaux d'activité récente pour un seul utilisateur est alors facile:
SELECT * from activity_log WHERE user_id = ? ORDER by date DESC LIMIT 0,50
Pour rendre cette approche vous avez vraiment efficace besoin de avoir suffisamment d'informations dans la table de journal d'activité unique pour ne pas avoir besoin d'autres sélections. Par exemple, vous pouvez stocker le message de journal brut, plutôt que de le créer à la volée.
Je pense que la notion de date est assez cruciale, mais c'est peut-être juste une omission de Josh. – Wookai