2010-05-23 11 views
15

¿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):¿Cómo modelo las calificaciones de productos en la base de datos?

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 mesa, simplificando las cosas.

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

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?

Respuesta

24

Se recomienda encarecidamente una tabla diferente para clasificaciones 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:

mesa productos
- Identificación del
- nombrar
- etc

mesa products_ratings
- Identificación del
- productId
- rating
- fecha (si es necesario)
- ip (si es necesario, p. para evitar la doble calificación)
- etc

Recuperación de todos los notas de producto 1234:

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

Puntuación media de 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 de 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
+0

Gracias Alec, tu enfoque tiene más sentido. Pero también tengo que pensar en cómo integrarlo mejor con una revisión de usuario.Entonces, no solo un usuario puede calificar un producto, sino que también puede dejar un comentario. Creo que puedo convertir la tabla de calificaciones en una tabla de reseñas ... esencialmente solo extenderé su funcionalidad. Gracias – Mohamad

+1

Se me acaba de ocurrir un problema con este enfoque: si lo convierto en una tabla de "reseñas", entonces la mayoría de los usuarios solo votarán y no necesariamente agregarán una revisión. Esto dejará muchas celdas vacías en una tabla donde deberían ir el título de revisión y el texto de revisión. ¿Es esto un problema? – Mohamad

+0

@Mel: con el enfoque anterior, también debe crear una tabla de revisiones separada y usar una combinación, de la misma manera que con las calificaciones. Entonces, su consulta típica buscaría el producto, sus calificaciones y sus revisiones. – Tom

1

Sé que mi respuesta no es la que realmente pide, 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.

+1

David, evito ese problema tomando la calificación promedio (voteSum/voteCount). Si decidí destacar los productos más nuevos, puedo ordenar primero por fecha de lanzamiento y luego ordenar por calificación. Pero, en general, no me preocupa la antigüedad del producto. – Mohamad

Cuestiones relacionadas