Я знаю, что этот вопрос задали здесь пару раз, но ни один из ответов не понравился мне. Это вызвано тем, что почти все они включают огромное чтение / процесс записи, связанный с базой данных, которой я хотел бы избежать по всей стоимости.
О непрочитанных обсуждениях / темы / сообщения, существует много для размышления. Я не знаю, как системам форума нравятся MyBB, vBulletin, Плата питания Invision, Ваниль, phpBB, и т.д., справьтесь с той проблемой, таким образом, я хотел бы считать от Вас парней Ваш опыт с этим. Я знаю, что использование таблицы базы данных только для этого является самым простым путем, но это включило бы огромное чтение / запись, когда у сообщества есть более чем 10 000 участников и 1 000 новых тем каждый месяц. Это твердо, но должен быть способ избежать перегрузки сервера.
Так, что Вы находите как лучшие практики для этой проблемы, а также как другие системы форума справляются с нею?
Вариантов не так много.
отметить каждую цепочку читателей каждым пользователем.
отмечать каждую непрочитанную цепочку каждого пользователя.
используют временные метки, чтобы определить, показывать его как непрочитанное или нет.
Другой альтернативой является смешивание решений, то есть ,
1 и 3) отображать поток как «непрочитанный», если он не старше X дней и для пользователя нет строки, отмеченной как прочитанная. «Прочитанные» строки могут быть удалены, когда они старше на X дней, без какого-либо влияния.
Преимущества
Недостатки
Преимущества
. Практически любой форум, о котором я знаю, будет используйте какую-то эталонную метку времени, чтобы определить, следует ли считать цепочку / сообщение «непрочитанными» или нет. Эта временная метка обычно представляет собой дату / время последнего действия, которое вы выполнили при предыдущем посещении форума.
Так что оставьте т.е. отметка времени previous_last_action и last_action в вашей пользовательской таблице, last_action обновляется при каждом действии пользователя, столбец previous_last_action один раз устанавливается на last_action при входе в систему (или при создании нового сеанса - если у вас есть функция «запомнить меня»). Чтобы определить, является ли цепочка / сообщение непрочитанной, вы должны сравнить эту метку времени создания (или обновления) цепочки / сообщения со значением в previous_last_action для пользователя, который в данный момент вошел в систему.
Почему вас это беспокоит?
Я не вижу проблем с каким-либо вводом-выводом для получения непрочитанных потоков. Это не обязательно должно быть вживую. 15-минутная задержка, основанная на значении кеша, подойдет.
Итак, для непрочитанных потоков вы просто
Псевдокод ..
$result = SELECT id,viewcount from my_forum_threads
$cache->setThreads($result['id'],$result['viewcount']);
Затем при загрузке страницы вы просто получаете значения кеша, а не снова запрашиваете базу данных. Это совсем не большая проблема.
Средняя страница моего сайта принимает 20 запросов MySQL. Когда я кеширую, это всего два-четыре запроса.