Я разрабатываю форум на подобии Stackowerflow и хочу с вами посоветоваться как лучше всего хранить счетчики: количество оценок, просмотров и выбор лучшего ответа.
Я использую Nodejs/MongoDB. Сейчас у меня есть две коллекции:
Posts:
[{
_id: ObjectId(1),
title: 'Untitled',
content: 'empty'
}]
Votes:[{
_post: ObjectId(1),
_user: ObjectId(...),
vote: 1,
}, {
_post: ObjectId(1),
_user: ObjectId(...),
vote: 1,
}]
Когда пользователь голосует за пост с ObjectId(1), то отправляется следующий запрос:
Votes.create({_post: ObjectId(1), vote: 1}).exec(cb);
При получении списка постов мне приходится делать несколько запросов:
1. Запросить все посты, отсортированные по дате создания
2. Запросить все оценки по каждому посту и добавить их в посты в nodejs.
При частом запросе списка постов будут проблемы в постоянном пересчете счетчиков, я бы хотел улучшить путем пересчета сохранения счетчика прямо в посте:
[{
_id: ObjectId(1),
title: 'Untitled',
content: 'empty',
votes: 2
}]
Но в этом случае мне нужно как-то поддерживать целостность данных и гарантированно обновлять актуальные счетчики в посте на основе данных оценок в Votes.
Данную проблему можно решить встраиванием оценок в виде массива и хранить его в постах, но MongoDB не любит обновлять большие документы.
В общем посоветуйте паттерн для гарантированного пересчета счетчиков в посте, что можно использовать, очереди, версионность или что-то еще?