По какому механизму работают информеры о новых постах и темах на многих форуах (далеко ходить не надо, возьмём к примеру джоновский форум), где для каждого пользователя формируется список непрочитанных сообщений и тем? Притом прочитав определённую тему или новые сообщения в былой теме, такая тема исчезает из списка непрочитанных, а все остальные остаются. Как происходит выборка из базы, запись что та или иная тема прочитана. Притом всё это происходит для каждого пользователя индивидуально. Если создавать дубликаты тем и постов для каждого пользователя, а в их таблицах поля, где можно присваивать значения прочитано или нет, а потом на форуме сравнивать с оригиналами, и посты со статусом непрочитано выводить в списке, после прочтения отмечать как прочитанные записью в базу, то это кажется выглядит не совсем ахти. Особенно при большом количестве юзеров и интенсивности заполнения форума сообщениями. Поэтому вопрос очень волнующий.
Я тож разберал непрочитанное, думал себе как то улучшить, но нифига не понял
за прочитанные темы отвечает таблица cms_forum_rdm
можете покапать файлы форума
forum/includes/new.php (ищем case 'reset')
forum/index.php (строки 200-214)
$req = mysql_query("SELECT `forum`.`id`
FROM `forum` LEFT JOIN `cms_forum_rdm` ON `forum`.`id` = `cms_forum_rdm`.`topic_id` AND `cms_forum_rdm`.`user_id` = '" . $user_id .
"'
WHERE `forum`.`type`='t'
AND `cms_forum_rdm`.`topic_id` Is Null");
while ($res = mysql_fetch_array($req)) {
mysql_query("INSERT INTO `cms_forum_rdm` SET
`topic_id`='" . $res['id'] . "',
`user_id`='" . $user_id . "',
`time`='" . $realtime . "'");
}
$req = mysql_query("SELECT `forum`.`id` AS `id`
FROM `forum` LEFT JOIN `cms_forum_rdm` ON `forum`.`id` = `cms_forum_rdm`.`topic_id` AND `cms_forum_rdm`.`user_id` = '" . $user_id .
"'
WHERE `forum`.`type`='t'
AND `forum`.`time` > `cms_forum_rdm`.`time`");
while ($res = mysql_fetch_array($req)) {
mysql_query("UPDATE `cms_forum_rdm` SET `time`='" . $realtime . "' WHERE `topic_id`='" . $res['id'] . "' AND `user_id`='" . $user_id . "'");
}
$_SESSION['fnew'] = 0;
$_SESSION['fnewtime'] = time();
echo '<p>Все темы приняты как прочитанные</p>';
break;
case 'select' :
echo '<div class="phdr"><b>Показать за период</b></div>';
echo '<div class="menu"><p><form action="index.php?act=new&do=all" method="post">Период(в часах):<br/>';
echo '<input type="text" maxlength="3" name="vr" value="24" size="3"/>';
echo '<input type="hidden" name="act" value="all"/><input type="submit" name="submit" value="Показать"/></form></p></div>';
echo '<div class="phdr"><a href="index.php?act=new">Назад</a></div>';
break;
судя по этому куску, дубликаты постов создаются для каждого.
только непонятно как-то.. Эт же какя нагрузка идёт. неее. Тут что-то не так
while ($res = mysql_fetch_array($req)) {
mysql_query("INSERT INTO `cms_forum_rdm` SET
`topic_id`='" . $res['id'] . "',
`user_id`='" . $user_id . "',
`time`='" . $realtime . "'");
}
этот цикл создаёт мноооого таблиц для любого запустившего этот процесс юзверя, записывает ид прочитанных тем, ид пользователя и время. пипец сколько хлама в базе.. при тысячи пользователей и 1оооо тем, в таблице cms_forum_rdm будет 1о миллионов таблиц о_О
не таблиц,а записей. Да,принцип примерно такой
seg0ro, А как то упростить систему возможно?