Я реализую подобную Stackoverflow систему репутации на своем сайте объяснения лирики рэпа, Rap Genius:
Мой вопрос состоит в том, как реализовать это. А именно, я пытаюсь решить, должен ли я составить таблицу reputation_events
помочь в перерасчете репутации, или должен ли я просто повторно вычислить с нуля каждый раз, когда я должен.
Таблица reputation_events
имел бы столбцы для:
Каждый раз, когда что-то происходит, который влияет на репутацию, я вставляю соответствующую строку в reputation_events
. Это помогает повторно вычислить репутацию и генерировать человекочитаемую последовательность событий, которые генерировали репутацию данного человека.
С другой стороны, любое данное действие могло влиять на репутацию нескольких пользователя. Например, предположите, что пользователь A настигает пользователя B на данной песне; на основе "Имеют большинство объяснений на песне" цель, я должен был бы не забыть удалять B исходное "has_the_most_explanations" событие (или возможно я добавлю новое событие для B?)
В общем, мне никогда не хотелось, чтобы данные располагались более чем в одном месте. Похоже, ваша таблица "replication_events" будет содержать данные, которые можно вычислить из других данных. Если так, я бы пересчитал с нуля, если только влияние на производительность не станет реальной проблемой.
Когда вы рассчитали сохраненные данные, у вас есть вероятность, что они могут некорректно соответствовать базовым данным - в основном это поврежденное состояние. Зачем вообще делать это возможным, если можно этого избежать?
Я бы составил список событий репутации с целью пересчета и возможности отследить, почему общее значение репутации такое, какое оно есть.
Но зачем нужен столбец «name», почему бы просто не иметь значение с положительным или отрицательным int?
Эта таблица станет огромной, убедитесь, что вы кешируете.