View
Вы попали на страницу, полную комментариев. Система голосования за комментарии подсвечивается вашими голосами.
![vote up reddit](https://i.stack.imgur.com/ysV6X.png)
База данных
Для поддержки этого требования схема базы данных должна быть как минимум следующей:
Страница
Комментарии
Голоса
- int userId
- int commentId
- enum (вверх, вниз), направление
Контроллер
Если бы идентификатор страницы был 123, а идентификатор пользователя - 456, это была бы наивная реализация контроллера:
1) Запрос всех голосов, сделанных пользователем 456 в комментариях на странице 123:
SELECT c.commentId, v.direction
FROM comments AS c, votes AS v
WHERE c.pageId = 123
AND c.commentId = v.commentId
AND v.userId = 456
2) Построить представление с результатами этого запроса.
Проблема масштабируемости
Запрос к базе данных для поддержки этой системы голосования очень дорогой. Таблица комментариев и голосов будет огромной. На сайте с высоким трафиком тысячи пользователей будут выполнять этот запрос каждую секунду, чтобы получить персонализированный просмотр голосования с комментариями. Как вы масштабируете эту систему голосования, чтобы база данных не перегружалась слишком большим количеством запросов? Вы бы кешировали это в памяти? Разве не стоит практиковать кеширование вещей, общих для большой аудитории? В этом случае эти запросы относятся только к отдельным пользователям. Память будет быстро заполняться на сайте миллионами пользователей. Произойдет промах кэша, и база данных будет уничтожена.