Как спроектировать модуль звездного рейтинга для списка новостей, постов в блог и т.д. по аналогии к лайкам соцсетей?

Для новости, статьи, записи в блог использую рейтинг в виде звезд. Рейтинг звезд — это модуль, который выводится в шаблоне страницы статьи, новости… Т.е. для рейтинга я передаю тип страницы и ее идентификатор, а на выходе получаю кликабельные звезды. Модуль звезд делает один запрос к БД.



А что делать если эти звезды нужно прицепить к списку статей или новостей и их будет, например, 100 штук на странице? Тогда придется делать 100 запросов в БД, согласно той структуре, которая есть сейчас.



Не хочется делать left join к таблице рейтинга, поскольку тогда придется перемешивать рейтинг с тем, к чему мы его подключаем.



Какие есть варианты?



По сути, это тоже самое что и «лайки» фейсбука или вконтакте. Они тоже цепляются к разным типам контента и выводятся в списке.
  • Вопрос задан
  • 3524 просмотра
Пригласить эксперта
Ответы на вопрос 5
ohmytribe
@ohmytribe
Измените запрос так, чтобы он всегда работал со списком id (даже в случае одного). Тогда свободного сможете грузить хоть по одиночке, хоть все вместе.

Далее, можно сделать так, как описывал @igorvar здесь. А именно, доставать параметры статей из кеша, а те статьи, которые в кеше не лежат, грузить из базы данных описанным выше запросом.

Хотя, если всё, что делает Ваш сайт — это выводит статьи (а значит, их максимум 50 на странице), то можно грузить по одной и класть в кеш. Т.е. делать именно так, как описал @igorvar, без изменения запросов.

Кстати, запросы на получения данных по одному id очень хорошо кешируются базой данных. Поэтому если грузить статьи одиночными запросами и выделить базе данных столько оперативки, чтобы ей хватало для эффективного кеширования (зависит от количества данных в Вашей базе данных и количества реально используемых данных в определённый момент времени), то база данных сама будет неплохо кешировать результаты запросов.

В общем, если Вы дадите чуть больше информации, то может оказаться, что у Вас итак всё хорошо.
Ответ написан
Комментировать
AlexPres
@AlexPres
Рекомендую сразу прикрутить Google Microformats к этому блоку, тогда ваши страницы в результатах поиска будут показаны прямо со звёздочками, очень удобно.

Google исходит из того, что оценка измеряется по шкале от 1 (худшая) до 5 (лучшая)


Вот конкретно что касается звёздочек — support.google.com/webmasters/bin/answer.py?hl=ru&answer=172705&topic=1088474&ctx=topic
Ответ написан
SELECT stars, news_id FROM news_stars WHERE news_id IN ('3', '7', '11')
Ответ написан
Комментировать
@igoravr
Не бери рейтинг каждый раз из базы. В этом нет необходимости. Кешируй результ.
Ответ написан
Комментировать
deleted-Mons
@deleted-Mons
Я делал таким образом.
У меня есть 5 звездочек, то есть пять оценок от 1 до 5 балов. Генерируются JS в базе значения хранить нет смысла. Просто в нужном месте выводится и все.

При голосовании в базу пишется оценка. Указывается кто голосовал (у меня это критично), ID статьи или поста или еще чего то, когда и тип голоса. Соответственно примерно пост тип 1, новость тип 2 и пр. Это позволяет хранить все голоса 1 таблице.

При сохранении в базу текущий рейтинг по формуле пересчитывается с учетом нового голоса и обновляет в статье ее текущую оценку и в пишет в базу сам голос.

Самое сложное тут было правильно высчитывать рейтинг.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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