Мой вопрос о денормализации. В базе данных, когда следует хранить производные данные в своем столбце, а не вычислять их каждый раз, когда вам это нужно?
Например, скажите, что у вас есть пользователи, которые получают Upvotes для своих вопросов. Вы показываете репутацию пользователя в своем профиле. Когда пользователь получает поддержку, если вы увеличиваете свою репутацию или вы должны рассчитывать его при получении своего профиля:
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
Насколько интенсивно обрабатывается запрос для получения репутации пользователя, прежде чем было бы целесообразно отслеживать его поэтапно со своим собственным столбцом?
Чтобы продолжить наш пример, предположим, что Upvote имеет вес, который зависит от того, сколько Upvotes (а не сколько репутации) имеет Пользователь, который его создал. Запрос на получение своей репутации внезапно взрывается:
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
Это далеко не пропорционально сложности инкрементного решения. Когда нормализация будет стоить того, и когда преимущества нормализации теряют пользу от денормализации (в данном случае сложность запроса и/или производительность)?