Пишем форум. Вопросы, возникающие при его написании.

akxxiv

Новичок
Пишем форум. Вопросы, вознающие при его написании.ик

Форум пишу пока простой. Там будет реализовано не очень много функций. Спросите зачем? - хочу привязать его к собственной системе управления и использовать общуюю таблицу пользователей. И т.д.

И так первый вопрос который возник сегодня - как лучше реализовать систему оповещения об ответе. Т.е. ту галочку, что внизу под формой
Уведомление по Email: Как только появится ответ на Ваше сообщение, Вы получите письмо по Email. Доступно только для зарегистрированных участников.
Есть идея создать таблицу с Id пользователя и Id топика. Если данные занесены, то пользователю отправляется письмо, что есть ответы.

Какие у кого есоь еще идеи?
 

kruglov

Новичок
только предусмотрите, чтобы при поступлении 10 ответов не приходило 10 писем.
 

Фанат

oncle terrible
Команда форума
а зачем такая таблица? почему в той же таблице поле не оставить?
 

whirlwind

TDD infected, paranoid
>Есть идея создать таблицу с Id пользователя и Id топика. Если данные занесены, то пользователю отправляется письмо, что есть ответы.

я бы так и сделал

subscriptions
FK -> user
FK -> topic
FK -> last_post

где last_post ссылка на последний просмотренный пост
 

HEm

Сетевой бобер
Нужно запоминать время просмотра темы подписавшимся на тему и отталкиваться от этого.
 

kruglov

Новичок
Есть 2 подхода:
1) запоминать когда какую тему какой пользователь прочел (круто)
2) запоминать время последнего захода пользователя и считать, что он за свой заход читает все темы (нересурсоемко)
 

White Rabbit

белый кролик
А если так:

user_id | top_id | repl_id - Это таблица подписки (юзер, тема, ответ в теме)
Заносим туда данные при добавлении нового ответа в тему top_id.

Через фиксированные промежутки времени сливаем на мыло пользователю всё, что имеет его user_id.
Очищаем.
Повторяем всё заново.

Если пользователь user_id смотрит тему top_id, очищаем список,
и не заполняем его, пока он в онлайне.

Тогда не надо ничего запоминать, и оповещения уходят не после каждого ответа.

Возможны варианты структуры хранения данных,
но вцелом - смысл таков.
 

whirlwind

TDD infected, paranoid
...а что бы по 10 писем не отправлять, то в subscriptions добавить флажок noticed и сбрасывать его при заходе на форум (или в топик).
 

Krishna

Продался Java
akxxiv: Я думаю, что самое разумное, что ты можешь сделать - это взять какой-нибудь не слишком навороченный, но качественный форум, например phpbb, и посмотреть как там всё работает, и на его примере сделать.
 

akxxiv

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

-~{}~ 10.02.06 15:35:

Автор оригинала: kruglov
Есть 2 подхода:
1) запоминать когда какую тему какой пользователь прочел (круто)
2) запоминать время последнего захода пользователя и считать, что он за свой заход читает все темы (нересурсоемко)
Интересно, если пользователь зашел, и все темы пометились как прочитанные, то он сможет прочитать не более одной помеченной как не прочитанная. (что-то сморозил я)
В этом случае надо ставить какой-то таймаут перед тем как пометить. Или нет?

А вот хранить все прочитанные ... надо подумать над этим.

А как на этом форуме подобное организовано?
 

HEm

Сетевой бобер
akxxiv
Тема не может быть помечена как прочитанная, пока чел явно не зашел на последнюю страницу темы или не пометил в какой нибудь специально сделанной для этого форме, что он якобы прочитал эту тему либо не отписался от темы

В vB 2.3 используется следующая таблица:[sql]CREATE TABLE `subscribethread` (
`subscribethreadid` int(10) unsigned NOT NULL auto_increment,
`userid` int(10) unsigned NOT NULL default '0',
`threadid` int(10) unsigned NOT NULL default '0',
`emailupdate` smallint(5) unsigned NOT NULL default '0',
PRIMARY KEY (`subscribethreadid`),
KEY `threadid` (`threadid`)
);[/sql]
 

whirlwind

TDD infected, paranoid
Вы не путайте "(не)прочитанные темы" и "подписанный на темы с уведомлением по мылу". Прочитано-непрочитано (новые темы и посты) решается элементарно путем сохранения даты последнего посещения.
 

akxxiv

Новичок
Автор оригинала: whirlwind
Прочитано-непрочитано (новые темы и посты) решается элементарно путем сохранения даты последнего посещения.
Т.е. для каждого пользователя нужно хранить дату последнего просмотра топика, а затем сравнить с датой последней записи в топике и отсюда делать выводы? я правильно понял?

А для уведомления делаем таблицу в которой ставим флаг послано сообщение или нет. И когда добавляется сообщение - делается запрос к данной талице, и если там есть запись user_id-topic_id и флаг поставлен как неотправлено, отправляем сообщение, флаг ставим - отправленно. И когда пользователь заходит посмотреть, обнуляем флаг.
...
 

whirlwind

TDD infected, paranoid
>Т.е. для каждого пользователя нужно хранить дату последнего просмотра топика, а затем сравнить с датой последней записи в топике и отсюда делать выводы? я правильно понял?

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

kruglov

Новичок
А если для каждого топика не хранить, получается профанация искусства. Раз залез - читай все топики, иначе потом фиг вспомнишь, что не читал.

Но для игрушечного == никому не нужного форума вполне подойдет...
 

whirlwind

TDD infected, paranoid
>Но для игрушечного == никому не нужного форума
Боюсь что Вы не правы. В данном случае затраты будут неоправданы. Представьте объем такой таблички для этого форума. На _каждого_ юзера по колву топиков!!! Сервер сдохнет. Ласт визит дата обновляется, когда грохается сессия. Так сделано на большинстве форумов.

-~{}~ 10.02.06 18:59:

ЗЫ. для этого форума посчитал для прикола записей 229 647 520
 

ONK

Пассивист PHPСluba
kruglov, значит этот форум игрушечный, т.к. он не хранит этих данных.
 
Сверху