values tablas into español ejemplo mysql database-design rating-system

mysql - tablas - ¿Cómo modelizo las calificaciones de productos en la base de datos?



mysql union group by (2)

¿Cuál es el mejor enfoque para almacenar calificaciones de productos en una base de datos? Tengo en mente los siguientes dos escenarios (simplificados, y asumiendo un MySQL db):

Cree dos columnas en la tabla de productos para almacenar el número y la suma de todos los votos, respectivamente. Use las columnas para obtener un promedio en tiempo de ejecución o usando una consulta.

Este enfoque significa que solo necesito acceder a una tabla, simplificando las cosas.

Normalice los datos creando una tabla adicional para almacenar las calificaciones.

Esto aísla los datos de clasificación en una tabla separada, dejando la tabla de productos para proporcionar datos sobre los productos disponibles. Aunque requeriría una combinación o una consulta separada para clasificaciones.

¿Qué enfoque es el mejor, normalizado o desnormalizado?


Sé que mi respuesta no es lo que en realidad piden, pero es posible que desee tener la oportunidad de facilitar que los nuevos productos con su sistema casi nunca superen a los productos anteriores. Digamos que obtendrías un producto con una calificación del 99%. Sería muy difícil que los productos nuevos aumentaran si ordena por productos con la calificación más alta.


Se recomienda una tabla diferente para calificar para mantener las cosas dinámicas. No se preocupe por cientos (o miles o decenas de miles) de entradas, eso es todo para las bases de datos.

Sugerencia:

productos de mesa
- carné de identidad
- nombre
- etc

table products_ratings
- carné de identidad
- ID del Producto
- calificación
- fecha (si es necesario)
- ip (si es necesario, p. ej., para evitar la calificación doble)
- etc

Recupere todas las evaluaciones para el producto 1234 :

SELECT pr.rating FROM products_ratings pr INNER JOIN products p ON pr.productId = p.id AND p.id = 1234

Calificación promedio del producto 1234 :

SELECT AVG(pr.rating) AS rating_average -- or ROUND(AVG(pr.rating)) FROM products_ratings pr INNER JOIN products p ON pr.productId = p.id AND p.id = 1234";

Y es tan fácil obtener una lista de productos junto con su calificación promedio:

SELECT p.id, p.name, p.etc, AVG(pr.rating) AS rating_average FROM products p INNER JOIN products_ratings pr ON pr.productId = p.id WHERE p.id > 10 AND p.id < 20 -- or whatever