¿Usar contar o tener un campo que cuente?

Concepto bastante simple, haciendo un sistema de tablero de mensajes extremadamente básico y quiero que los usuarios tengan un recuento de publicaciones. Ahora estaba debatiendo si tener o no un recuento en su fila que se agrega cada vez que se crea una publicación, o se resta uno cada vez que se elimina una publicación suya. Sin embargo, estoy seguro de que realizar una consulta de recuento cuando se solicita el recuento de publicaciones sería más preciso debido a circunstancias imprevistas (digamos que un hilo se elimina y no reduce su recuento correctamente), sin embargo, esto parece que sería menos eficiente para ejecutar una consulta CADA vez que se carga su recuento de publicaciones, especialmente en el caso de que tengan 10 publicaciones en la misma página y enumera su recuento de publicaciones en cada publicación.

Pensamientos / Consejos?

Muchas Gracias

preguntado el 09 de enero de 11 a las 07:01

6 Respuestas

Solo ve a contar cada vez. A menos que su carga sea astronómica, COUNT no debería ser un problema y reduce la cantidad de esfuerzo involucrado en guardar y actualizar datos.

Solo asegúrese de poner un índice en su columna user_id, para que pueda filtrar los datos con una cláusula WHERE de manera eficiente.

Si llega al punto en el que esto no lo hace por usted, puede implementar estrategias de almacenamiento en caché, pero dado que es un tablero de mensajes simple, no debería encontrar ese problema por un tiempo.

EDIT:

Acabo de ver su segunda preocupación acerca de la misma consulta que se repite 10 veces en una página. No hagas eso :) Simplemente extrae los datos una vez y guárdalos en una variable. No es necesario repetir la misma consulta varias veces.

Respondido el 09 de enero de 11 a las 10:01

2 votos en contra sin comentarios: / ¿admiradores secretos de la desnormalización quizás? - majelbstoat

post_count definitivamente debería ser una columna en la tabla de usuarios. el pequeño esfuerzo adicional para hacerlo bien es mínimo en comparación con la carga de base de datos adicional que produce al ejecutar algunas consultas de conteo en cada vista de subproceso.

si usa algún tipo de abstracción de orm o de base de datos, debería ser bastante simple agregar el conteo a sus filtros de creación / eliminación.

Respondido el 09 de enero de 11 a las 10:01

Solo usa COUNT. Será más preciso y evitará posibles casos perdidos.

El caso que mencione de mostrar el recuento de publicaciones varias veces en una página no será un problema a menos que tenga un sitio de tráfico extremadamente alto.

En cualquier otro caso, el caché de consultas de su servidor de base de datos ejecutará la consulta, luego mantendrá un caché de la respuesta hasta que cambie alguna de las tablas en las que se basa la consulta. En el transcurso de la carga de una sola página, nada más debería cambiar, por lo que solo ejecutará la consulta una vez.

Si realmente necesita preocuparse por ello, puede almacenarlo en caché usted mismo en una variable y ejecutar la consulta una vez.

Respondido el 09 de enero de 11 a las 10:01

En términos generales, las consultas de su base de datos siempre serán extremadamente eficientes en comparación con la lógica de su aplicación. Como tal, el tiempo perdido en mantener el post_count en la tabla de usuarios probablemente será mucho menor que el necesario para ejecutar una consulta para actualizar la tabla de usuarios cada vez que se publica un comentario.

Además, generalmente se considera una estructura de base de datos incorrecta tener un campo como el que está describiendo.

Respondido el 09 de enero de 11 a las 10:01

Hay argumentos para ambos, por lo que, en última instancia, depende del volumen de tráfico que espere. Si su código es sólido y tiene las capas adecuadas, puede mantener con confianza un recuento de filas en el registro de sus usuarios sin preocuparse por perder precisión y, con el tiempo, count() potencialmente se volverá pesado, pero la actualización de un recuento de filas también agrega sobrecarga.

Para un sitio pequeño, no hay prácticamente ninguna diferencia, por lo que si (y solo si) eres un riguroso con la eficiencia, la única forma de obtener una respuesta útil es ejecutar algunos puntos de referencia y descubrirlo por ti mismo. De una forma u otra, serán 3/10 de 2/8 de sentadilla diddley, así que haz lo que te parezca correcto :)

Respondido el 09 de enero de 11 a las 10:01

Es totalmente razonable almacenar los recuentos de publicaciones en una columna en su tabla de Usuarios. Luego, para asegurarse de que sus recuentos de publicaciones no se vuelvan cada vez más inexactos con el tiempo, ejecute una tarea programada (por ejemplo, todas las noches) para actualizarlos en función de su tabla de Publicaciones.

Respondido el 09 de enero de 11 a las 10:01

Esto significa que acepta que los recuentos de sus publicaciones serán inexactos hasta por 24 horas. El interlocutor afirma que esto es para "un tablero de mensajes extremadamente básico". Un trabajo cron para hacer algo que SQL puede hacer de forma nativa por usted no parece tan básico :) - majelbstoat

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.