2012-08-27 6 views
8

Ho una raccolta di Posts e Users dove gli utenti possono upvotare/downvotare ogni post. Quale sarebbe il modo migliore per archiviarlo in un database mongodb per assicurarsi che gli utenti non possano votare per un determinato documento più di una volta?memorizzando upvotes/downvotes in mongodb

La soluzione più semplice nosql-ish ho fornito è memorizzare una serie di user_ids hanno votato dentro ciascun documento Post (o matrice di (user_id, vote) dove vote è +1 o -1 in modo che gli utenti saranno in grado di cambiare il loro voto). E 'una buona idea dal punto di vista delle prestazioni dato che ogni post può avere migliaia di voti?

Che dire di siti Web molto popolari come Reddit, dove i post più importanti possono avere centinaia di migliaia di voti?

+0

come faresti? Ho provato a memorizzare gli objectid come chiavi ma non funziona .. –

risposta

5

Attualmente i documenti MongoDB sono limitati a un massimo di 16 MB, pertanto, supponendo che i calcoli di Gilbert siano accurati, non sarà possibile memorizzare tutti i 6 milioni di user_id s nel documento Post.

Tuttavia, è possibile considerare l'archiviazione dei voti nel documento User (vale a dire gli post_id s per cui l'utente ha votato in particolare). È molto meno probabile che un utente voti su 6 milioni di post diversi, quindi in questo modo non si raggiungerà il limite di dimensioni più rapidamente.

Un altro modo per gestire questa situazione: Se si prevede che molti voti per un posto particolare, si consiglia di memorizzare i voti al di fuori dei Post documenti in una raccolta differenziata e fare una query aggiuntiva, simile ad un molti molti-a- Tabella JOIN in SQL:

user_votes { user_id: ObjectId(...), post_id: ObjectId(...), vote:-1 } 

e creare un indice composto su (user_id, post_id).

6

Che dire di siti Web molto popolari come Reddit dove i post più importanti possono avere centinaia di migliaia di voti?

E loro? Usando la tua idea in un database relazionale, hai un intero per il puntatore ID utente, un intero per il puntatore del post e un byte per il voto. 9 byte totali per ciascun voto.

Certo, c'è qualche overhead dell'indice. Rendilo 15 byte totali per voto. 6 milioni di voti occuperebbero 90 megabyte di spazio su disco.

Reddit blocca i messaggi dopo un periodo di tempo, quindi non possono essere modificati o votati. Quindi Reddit non deve conservare i voti individuali per sempre. Basta votare i totali.