Лучший способ реализовать репутацию Stackoverflow-стиля

Я реализую подобную Stackoverflow систему репутации на своем сайте объяснения лирики рэпа, Rap Genius:

  • Хорошее объяснение: +10
  • Плохое объяснение:-1
  • Имейте большинство объяснений на песне: +30

Мой вопрос состоит в том, как реализовать это. А именно, я пытаюсь решить, должен ли я составить таблицу reputation_events помочь в перерасчете репутации, или должен ли я просто повторно вычислить с нуля каждый раз, когда я должен.

Таблица reputation_events имел бы столбцы для:

  • имя (например, "good_explanation", "bad_explanation")
  • awarded_to_id
  • awarded_by_id
  • awarded_at

Каждый раз, когда что-то происходит, который влияет на репутацию, я вставляю соответствующую строку в reputation_events. Это помогает повторно вычислить репутацию и генерировать человекочитаемую последовательность событий, которые генерировали репутацию данного человека.

С другой стороны, любое данное действие могло влиять на репутацию нескольких пользователя. Например, предположите, что пользователь A настигает пользователя B на данной песне; на основе "Имеют большинство объяснений на песне" цель, я должен был бы не забыть удалять B исходное "has_the_most_explanations" событие (или возможно я добавлю новое событие для B?)

9
задан Doorknob 3 March 2013 в 13:21
поделиться

2 ответа

В общем, мне никогда не хотелось, чтобы данные располагались более чем в одном месте. Похоже, ваша таблица "replication_events" будет содержать данные, которые можно вычислить из других данных. Если так, я бы пересчитал с нуля, если только влияние на производительность не станет реальной проблемой.

Когда вы рассчитали сохраненные данные, у вас есть вероятность, что они могут некорректно соответствовать базовым данным - в основном это поврежденное состояние. Зачем вообще делать это возможным, если можно этого избежать?

5
ответ дан 4 December 2019 в 23:38
поделиться

Я бы составил список событий репутации с целью пересчета и возможности отследить, почему общее значение репутации такое, какое оно есть.

Но зачем нужен столбец «name», почему бы просто не иметь значение с положительным или отрицательным int?

Эта таблица станет огромной, убедитесь, что вы кешируете.

1
ответ дан 4 December 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: