La mia domanda riguarda la denormalizzazione. In un database, quando è necessario archiviare i dati derivati nella propria colonna piuttosto che calcolarlo ogni volta che è necessario?In un database, quando è necessario memorizzare i dati derivati?
Ad esempio, supponiamo di avere utenti che ottengono gli Upvotes per le loro domande. Visualizza la reputazione di un utente sul suo profilo. Quando un utente è upvoted, dovrebbe si incrementa la loro reputazione, o si dovrebbe calcolare quando si recupera il loro profilo:
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
Come intensivo del processore fa la query per ottenere la reputazione di un utente deve essere prima che varrebbe la pena di tenerne traccia in modo incrementale con la sua colonna?
Per continuare il nostro esempio, supponiamo che un Upvote abbia un peso che dipende dal numero di Upvotes (non da quanta reputazione) dell'utente che lo ha lanciato. La query per recuperare la loro reputazione esplode all'improvviso:
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
Questo è lontano dalla proporzione con la difficoltà di una soluzione incrementale. Quando vale la normalizzazione, e quando i benefici della normalizzazione perdono i benefici della denormalizzazione (in questo caso, difficoltà e/o rendimento della query)?