Внедрение системы тегов с помощью PHP и mySQL. Кеширование в помощь!

Со ссылкой на этот пост: Как реализовать подсчет тегов

Я полностью реализовал предложенную систему тегов из 3 таблиц. Чтобы подсчитать количество статей на тег, я использую другой столбец с именем tagArticleCount в таблице определения тегов. (остальные столбцы: tagId, tagText, tagUrl, tagArticleCount).

Если я реализую редактирование этой таблицы в реальном времени, так что всякий раз, когда пользователь добавляет другой тег в статью или удаляет существующий тег, таблица tag_definition_table обновляется для обновления счетчика добавленного/удаленного тега. Это будет стоить дополнительного запроса каждый раз, когда вносятся какие-либо изменения. (при этом запись связанной ссылки для тега и статьи удаляется из tagLinkTable).

Альтернативой этому является запрет на редактирование счетчика в реальном времени, вместо этого используйте CRON для обновления счетчика каждого тега по истечении указанного периода времени. А вот и проблема, которую я хочу обсудить. Это можно рассматривать как кэширование количества статей в базе данных. Не могли бы вы помочь мне найти способ представить статьи в списке, когда тег изучен и когда счетчик статей для этого тега не актуален. Например: 1. Счетчик показывает 50 статей, но на самом деле в таблице ссылок тегов (которая связывает теги и статьи) 55 записей. 2. Счетчик показывает 50 статей, но на самом деле в таблице ссылок тегов 45 статей.

Как обрабатывать эти 2 сценария, приведенные в примере. Я собираюсь использовать APC для хранения кеша этих счетчиков. Учтите это и в своем решении. Также обсудите производительность в режиме реального времени/обновления счетчика CRONNED.


person Hamid Sarfraz    schedule 17.06.2010    source источник


Ответы (1)


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

На самом деле недавно я столкнулся с той же проблемой в системе, которую разрабатывал, но в конечном итоге решил, что решение, использующее поле для хранения количества тегов, не будет работать. Возможно, стоит рассмотреть причину, по которой я пошел другим путем, если это применимо к вашей ситуации:

С полевым методом у вас есть только один счет. Для моей системы я хотел иметь несколько доступных уровней глубины. Итак, используя теги в этой статье в качестве примера, я хотел узнать больше, чем общее количество «php», «mysql», «лучших практик», «производительности» и «тегов». Я также хотел знать количество различных комбинаций.

Я решил использовать count(*) следующим образом:

SELECT count(*)
FROM items i, categories c
WHERE c.Id = i.Id
AND (c.category IN ('php', 'mysql', 'tagging'))
GROUP BY i.Id
HAVING COUNT( i.Id )=3

Чтобы снизить вероятность замедления, я использую AJAX для заполнения сегментов страницы, в которых отображаются связанные данные.

person Jeffrey Blake    schedule 24.06.2010