Ottenere post dagli utenti che vengono seguiti: due diverse implementazioni

3

Ho due diverse implementazioni per il recupero dei post dagli utenti che qualcuno sta seguendo e voglio sapere quale si consiglia di utilizzare. Per prima cosa ti mostrerò le tabelle e poi le due implementazioni.

post table

id (PK)| poster_id (FK) | value | created_on

tabella di ripubblicazione - necessaria per entrambe le implementazioni

reposter_id (FK) | post_id (FK) | created_on

seguente tabella

follower_id (FK) | followee_id (FK)

tabella user_feed - necessaria solo per la seconda implementazione

user_id (FK) | post_id (FK) | created_on

Prima implementazione: richiede la tabella repost, ma nessuna tabella user_feed. Ogni volta che un utente pubblica qualcosa, non devo aggiungere una riga per ciascuno dei suoi follower nella tabella user_feed, ma la query sembra molto più dispendiosa dal punto di vista computazionale.

SELECT * FROM (
    SELECT p.id, p.poster_id, p.value, p.created_at
    FROM post AS p
    WHERE p.'user_id'=23 OR (p.'user_id' IN SELECT 'followee' FROM following WHERE 'follower'=23)
    UNION
    SELECT p.id, p.poster_id, p.value, rp.reposter_id, rp.created_at
    FROM post AS p
    INNER JOIN repost AS rp
    ON rp.post_id = p.id
    WHERE p.'user_id'=23 OR (p.'user_id' IN SELECT 'followee' FROM following WHERE 'follower'=23)))
ORDER BY created_at DESC
LIMIT 80;

Seconda implementazione: richiede la tabella user_feed e la tabella repost. Aggiungo un record alla tabella user_feed ogni volta che qualcuno post / ripristina qualcosa. Il record viene aggiunto per ciascuno dei follower del poster. Io tengo, diciamo, solo 120 record per ogni utente particolare nella tabella user_feed. Se viene creato un post e un utente ha già 120 record nella tabella user_feed, il record più vecchio per quell'utente viene cancellato e quello nuovo prende il suo posto. Se un utente richiede più record di quelli presenti nella tabella user_feed per loro, la prima implementazione viene utilizzata per recuperarli.

SELECT * FROM (
    SELECT p.id, p.poster, p.value, p.created_at
    FROM post As p
    WHERE p.'id' IN (SELECT 'post_id' FROM user_feed WHERE 'user_id'=23)
ORDER BY created_at DESC
LIMIT 80;
    
posta khakis 17.04.2016 - 01:01
fonte

1 risposta

1

Una domanda interessante.

Lasciamo da parte la questione su come rappresentare i reposts. Presumibilmente avrai molti tipi di "post" alcuni condivideranno una sorta di metadati.

L'obiettivo principale del tuo problema è se memorizzare i dati del post più volte, una volta per follower, o avere una singola copia per il poster e generare dinamicamente "feed" quando richiesto.

Anche se la singola copia in passato sarebbe considerata di gran lunga il modo migliore. Corrispondenza con il concetto di un database relazionale normalizzato su cui si esegue una query. In questi giorni, soprattutto per le app di social network in scala massiva, dovresti scegliere l'approccio in stile No-SQL con più copie.

Sebbene tu stia utilizzando un db relazionale con un feed per utente è un approccio non relazionale.

Il vantaggio è un accesso più rapido per gli utenti al loro feed e la possibilità di mettere tali dati su un server da solo, senza dover includere anche tutti i feed degli utenti seguiti.

Lo svantaggio è che utilizza più spazio su disco e ci sarà un ritardo tra la pubblicazione di un utente e i suoi follower che vedono quel post.

Lo svantaggio critico dell'approccio relazionale è che il tuo singolo database diventa troppo grande per poter archiviare qualsiasi singolo computer in modo rapido e accessibile.

    
risposta data 17.04.2016 - 23:09
fonte