Непрочитанные темы (помощь)

184
.
a.k.a. Ka2
По какому механизму работают информеры о новых постах и темах на многих форуах (далеко ходить не надо, возьмём к примеру джоновский форум), где для каждого пользователя формируется список непрочитанных сообщений и тем? Притом прочитав определённую тему или новые сообщения в былой теме, такая тема исчезает из списка непрочитанных, а все остальные остаются. Как происходит выборка из базы, запись что та или иная тема прочитана. Притом всё это происходит для каждого пользователя индивидуально. Если создавать дубликаты тем и постов для каждого пользователя, а в их таблицах поля, где можно присваивать значения прочитано или нет, а потом на форуме сравнивать с оригиналами, и посты со статусом непрочитано выводить в списке, после прочтения отмечать как прочитанные записью в базу, то это кажется выглядит не совсем ахти. Особенно при большом количестве юзеров и интенсивности заполнения форума сообщениями. Поэтому вопрос очень волнующий.
.
Я тож разберал непрочитанное, думал себе как то улучшить, но нифига не понял
.
The Frontend-Warrior
за прочитанные темы отвечает таблица cms_forum_rdm
можете покапать файлы форума
forum/includes/new.php (ищем case 'reset')
forum/index.php (строки 200-214)
.
a.k.a. Ka2
$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&amp;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о миллионов таблиц о_О
.
Let Mortal Kombat begin
не таблиц,а записей. Да,принцип примерно такой
.
a.k.a. Ka2
seg0ro, А как то упростить систему возможно?
Всего: 6