Mi pregunta es sobre la desnormalización. En una base de datos, ¿cuándo debe almacenar datos derivados en su propia columna, en lugar de calcularlos cada vez que los necesite?En una base de datos, ¿cuándo debe almacenar los datos derivados?
Por ejemplo, supongamos que tiene Usuarios que reciben votos a favor por sus preguntas. Muestra la reputación de un usuario en su perfil. Cuando un usuario está upvoted, en caso de que incrementas su reputación, o en caso de que calcularlo cuando recupera su perfil:
SELECT User.id, COUNT(*) AS reputation FROM User
LEFT JOIN Question
ON Question.User_id = User.id
LEFT JOIN Upvote
ON Upvote.Question_id = Question.id
GROUP BY User.id
Cómo uso intensivo del procesador que hace la consulta para obtener la reputación de un usuario tiene que ser antes de que valdría la pena mantener un seguimiento de forma incremental con su propia columna?
Para continuar nuestro ejemplo, supongamos que un voto a favor tiene un peso que depende de la cantidad de votos a favor (no de la cantidad de reputación) que tiene el usuario que lo emitió. La consulta para recuperar su reputación de repente explota:
SELECT
User.id AS User_id,
SUM(UpvoteWeight.weight) AS reputation
FROM User
LEFT JOIN Question
ON User.id = Question.User_id
LEFT JOIN (
SELECT
Upvote.Question_id,
COUNT(Upvote2.id)+1 AS weight
FROM Upvote
LEFT JOIN User
ON Upvote.User_id = User.id
LEFT JOIN Question
ON User.id = Question.User_id
LEFT JOIN Upvote AS Upvote2
ON
Question.id = Upvote2.Question_id
AND Upvote2.date < Upvote.date
GROUP BY Upvote.id
) AS UpvoteWeight ON Question.id = UpvoteWeight.Question_id
GROUP BY User.id
Esto es mucho fuera de proporción con la dificultad de una solución gradual. ¿Cuándo valdría la normalización y cuándo los beneficios de la normalización se reducen a los beneficios de la desnormalización (en este caso, dificultad de consulta y/o rendimiento)?