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;