#database #scoring
#База данных #подсчет очков
Вопрос:
Stackoverflow отображает вашу репутацию рядом с вашим именем пользователя. Я полагаю, что она не попадает в базу данных для вычисления вашего балла при каждом рендеринге страницы (или, возможно, попадает?). Будет ли в таблице users поле total score, которое обновляется, когда кто-то голосует за меня?
Какова наилучшая практика для такого рода систем? Извините, если это очевидный вопрос, я новичок в базах данных.
Комментарии:
1. 1. Задавая этот вопрос самому себе в течение длительного времени.
Ответ №1:
При входе в систему номер извлекается из базы данных вместе со всей информацией о ваших пользователях.
Это может быть пользовательский объект. Этот пользовательский объект имеет свойство score, которое инициализируется любым числом, которое есть в базе данных, когда вы просто входите в систему.
Когда вы просматриваете веб-сайт и что-то делаете, свойство обновляется, но не база данных.
Затем вы можете обновить базу данных только один раз, когда пользователь объекта будет уничтожен (либо путем выхода из системы, либо закрытия браузера), либо через определенное время.
Комментарии:
1. Свойство обновляется в кэше в памяти, а также передается или ставится в очередь на уровень сохранения (в данном случае db)… вы не можете полагаться на выход пользователя из системы или закрытие браузера для обновления ваших объектов.
Ответ №2:
Я думаю, что общий ответ на такой общий вопрос таков: кэширование! Идея кэширования может быть простой, но не всегда легко сделать это правильно. Я бы предположил, что SO хранит не только ваш общий балл. В ней хранятся все «события», которые увеличивают ваш счет. Ваш общий балл рассчитывается на основе этих «событий». Таким образом, к общему баллу уже добавляется какое-то предварительно вычисленное или кэшированное значение. Если вы не хотите обращаться к базе данных для каждого запроса, вы можете кэшировать значения в памяти. Memcached часто используется для таких заданий, но, конечно, есть и другие варианты.