2012-08-27 15 views
8

Tengo una colección de Posts y Users donde los usuarios pueden votar/rechazar cada publicación. ¿Cuál sería la mejor manera de almacenar esto en una base de datos mongodb para asegurarse de que los usuarios no puedan votar un documento determinado más de una vez?almacenamiento de votos/downvotes en mongodb

La solución más simple nosql-ish que se me ocurrió es almacenar una gran variedad de user_ids que votaron dentro de cada documento Post (o incluso gama de (user_id, vote) donde vote es 1 o -1 para que los usuarios serán capaces de cambiar su voto) ¿Es una buena idea desde el punto de vista del rendimiento dado que cada publicación puede tener miles de votos?

¿Qué hay de los sitios web realmente populares como Reddit, donde los mensajes más importantes pueden tener cientos de miles de votos?

+0

¿cómo harías esto? Intenté almacenar objectids como claves, pero no funciona ... –

Respuesta

5

Los documentos de MongoDB están actualmente restringidos a un máximo de 16 MB, por lo que suponiendo que los cálculos de Gilbert sean precisos, no podrá almacenar los 6 millones de user_id en el documento Post.

Sin embargo, puede considerar almacenar los votos en el documento User en su lugar (es decir, el post_id s que votó el usuario en particular). Es mucho menos probable que un usuario vote en 6 millones de publicaciones diferentes, por lo que de esta manera no alcanzará el límite de tamaño tan rápido.

Otra forma de manejar esto: si espera muchos votos para una publicación en particular, puede guardar los votos fuera de los documentos Post en una colección separada y hacer una consulta adicional, similar a una de muchos a muchos ÚNASE tabla en modo SQL:

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

y cree un índice compuesto en (user_id, post_id).

6

¿Qué pasa con sitios web realmente populares como Reddit, donde los mensajes más importantes pueden tener cientos de miles de votos?

¿Qué hay de ellos? Al usar su idea en una base de datos relacional, tiene un número entero para el puntero de identificación del usuario, un número entero para el puntero del mensaje y un byte para el voto. 9 bytes en total por cada voto.

Claro, hay algunos índices de carga. Haga que sea un total de 15 bytes por voto. 6 millones de votos tomarían 90 megabytes de espacio en disco.

Reddit bloquea las publicaciones después de un período de tiempo, por lo que no se pueden editar ni votar. Entonces, Reddit no tiene que almacenar votos individuales para siempre. Solo vote totales.

Cuestiones relacionadas