Il tuo codice non mi dice molto; Penso che sarebbe utile se potessi disporre la tua struttura di dati in un semplice JSON / SQL.
Ad ogni modo, serializzerei il flusso di ogni utente su MongoDB. Non memorizzerei l'HTML nel database per vari motivi (almeno non a quel livello del software); invece, dovresti salvare i dati rilevanti in una raccolta (possibilmente polimorfica). Recuperare il newsfeed è quindi molto semplice, l'indicizzazione è semplice, ecc. La struttura della vista essenzialmente non cambierebbe. Se in seguito desideri modificare l'HTML, anche questo è facile.
Lo svantaggio è che questo duplicherà molti dati. Se le persone possono avere molti follower, questo potrebbe diventare un problema. L'utilizzo di array di ID utente invece di un singolo ID utente potrebbe essere d'aiuto (se le informazioni sono le stesse per tutti i follower), ma è anche limitato.
Per problemi di associazione molto grandi, c'è solo la memorizzazione nella cache. Per come la capisco, la magia sia di Facebook che di Twitter è che non colpiscono il db molto spesso e mantengono molti dati nella RAM. Se stai associando miliardi di elementi, farlo è una sfida anche nella RAM.
Gli aggiornamenti dovrebbero essere scritti continuamente anziché su base oraria. Supponiamo che tu abbia molto traffico e che l'aggiornamento orario richieda 30 minuti. Ora, il caso peggiore è un 90 min. ritardo. Se elabori le modifiche just-in-time, puoi ridurle a probabilmente 5 minuti.
Ad un certo punto dovrai inserire ipotesi, usare la memorizzazione nella cache e alcune euristiche. Alcuni esempi:
- Più un tweet è recente, più traffico vedrà. Ha una maggiore possibilità di essere ritwittato e viene visto molto più spesso. Tienilo nella RAM.
- La tua pagina di panoramica della sequenza temporale di Facebook del 1991 probabilmente non cambierà su base giornaliera, quindi questo è un candidato per la memorizzazione nella cache di output a lungo termine.
- È probabile che l'attuale attività su Facebook subisca molte scritture. La memorizzazione nella cache di output non aiuterà molto qui. Anche in questo caso, l'oggetto dovrebbe essere mantenuto nella RAM.