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