Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запоминание просмотренных тем форума 
:(
    Опции темы
Gold Dragon
Дата 6.3.2013, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Подобные темы уже всплывали. Но вот в очередной раз у меня делема: Как учитывать просмотренные темы форума..?
Т.е. пока пользователя не было на форуме, кто-то отвечал. Человек заходит и видит что есть темы где без него что-то ответили.. Заходит в темы и она помечается прочитанной..

Как такое организовать и какие вообще решения на сегодня есть?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 6.3.2013, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



В данных пользователя храниться список ID тем через запятую, по этому списку строится массив читаных тем. Установка флага читал-нечитал ставится после получения дерева тем, сравнением в цикле id-шек с этим массивом. В дополнение  этому есть дата, после которой все темы считаются прочитанными. Когда массив прочитанных тем становится очень большим - он сокращается в два раза, при этом дата прочитанных сдвигается  вверх.

Как-то так...  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
mark2011
Дата 6.3.2013, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 28.6.2011

Репутация: 2
Всего: 2



ksnk
Интересно, как вы это себе представляете?

Мой вариант такой: у пользователя есть дата последнего посещения на форуме. Правильно? Когда он заходит следующий раз, делается опрос всех тем на форуме на предмет: есть ли сообщения с датой позже даты последнего посещения пользователя на форуме. Если такие сообщения есть, соответственно помечаем такие темы непрочитанными. 
PM WWW ICQ Skype   Вверх
Arantir
Дата 6.3.2013, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



mark2011, вообще-то, если добавить в конец вашего варианта вариант ksnk, то получится именно то, что вы оба, судя по всему, и имели ввиду =)

То есть, имеется некий список непрочитанных тем. Но обновляется он только при активности пользователя (а не при создании новой темы или еще чего). Темы, написанные позже даты последней активности, - непрочитанные де факто. Остается только хранить список непрочитанных тем и просто удалять из него прочитанные. Таким образом и минимум операций и минимум данных.

Это сообщение отредактировал(а) Arantir - 6.3.2013, 22:33


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
ksnk
Дата 7.3.2013, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(mark2011 @  6.3.2013,  21:41 Найти цитируемый пост)
ksnk, 
Интересно, как вы это себе представляете?

У пользователя в данных хранится текстовое поле `seen_topics`/ и поле даты `past_seen_date`.

-- при выборе тем из базы выполняется что-то вроде такого запроса
 
Код

 $sql=' select topic.ID, topic.`DATE`,..., (topic.`DATE`<'.$user['past_seen_date'].' or topic.ID in ('. $user['seen_topics'].') as seen from ...';

  значение seen и будет просмотрена или нет тема. 
  Или просто весь выбранный массив проверяется отдельным циклом.

-- каждый раз, когда открывается новая, непросмотренная тема, в поле `seen_topics` добавляется ID этого топика. `seen_topics` .=','.ID ;

-- если длина (текстовая) поля `seen_topics` становится больше 4к (среднепотолочное значение) - это примерно 4к/6=600 уникальных ID, делается такой запрос 
   
Код

 $sql=' select topic.ID, topic.`DATE` from topics where topic.ID in ('. $user['seen_topics'].') order by topic.`DATE` limit 300,100000';  
(300 - это 600/2. 100000 - это заведомо бОльшее, чем количество топиков в `seen_topics`, значение) Первое значение этой выборки даст нам новое значение параметра `past_seen_date`. Все полученные таким образом ID дадут нам новое значение поля `seen_topics`.

Это сообщение отредактировал(а) ksnk - 7.3.2013, 08:06


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 7.3.2013, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(mark2011 @  6.3.2013,  22:41 Найти цитируемый пост)
есть ли сообщения с датой позже даты последнего посещения пользователя на форуме.

Я зашёл на форум и мне показали непрочитанные темы. При этом обновилась таблица о моём последнем посещении. Я обновляю страницу и все стемы становятся прочитанными smile

Arantir, что-то запутался... Я зашёл на сайт и должен сформироваться список непрочитанных тем. Каким образом?

ksnk, так я не понял что учитывать, прочтённые или не прочтённые  smile 

И опять же вопрос встаёт в нагрузке на БД


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 7.3.2013, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  7.3.2013,  08:00 Найти цитируемый пост)
так я не понял что учитывать, прочтённые или не прочтённые

 smile Прочтенные - проще, не нужно менять ВСЕ записи ВСЕХ юзеров с попявлением новых тем. 
К тому же, удаленные темы никак не сказываются на этой схеме.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 7.3.2013, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



ну  это самый простой вариант.. а теперь примени его например к этому форуму.. Сколько тут тем, сколько тут пользователей и какой объём эта таблица будет и скорость её обработки?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
mark2011
Дата 7.3.2013, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 28.6.2011

Репутация: 2
Всего: 2



Цитата(Gold Dragon @  7.3.2013,  08:00 Найти цитируемый пост)
Я обновляю страницу и все стемы становятся прочитанными

Не-а....

Тема становится прочитанной только тогда, когда ты реально вошёл в неё, т.е. затребовал страницу типа topic.php?topic_id=1. При этом таблица обновится и тема будет считаться прочтённой.

Цитата(Gold Dragon @  7.3.2013,  08:00 Найти цитируемый пост)
И опять же вопрос встаёт в нагрузке на БД 

memcached? apc? eaccelerator? mysql optimize?? ))

PM WWW ICQ Skype   Вверх
ksnk
Дата 7.3.2013, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  7.3.2013,  08:10 Найти цитируемый пост)
ну  это самый простой вариант.. а теперь примени его например к этому форуму.. Сколько тут тем, сколько тут пользователей и какой объём эта таблица будет и скорость её обработки? 

Количество тем, которые юзер просмотрел - конечно. Количество тем, которые юзер не видел - несчетно  smile  

Причем тут скорость обработки? Выборка по ключевому полю довольно быстрая штука, конструкция in в запросе тоже не сильно тормозит. 
Для экономии места для хранения прочитанных тем - можно чистить темы у неактивных юзеров, оставляя им поменьше, или оставляя только `нижнюю дату`. 

А вообще - все познается на практике. Можно спросить у Wowa как оно сделано тут.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Aliance
Дата 7.3.2013, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Цитата(ksnk @  6.3.2013,  22:18 Найти цитируемый пост)
В данных пользователя храниться список ID тем через запятую

Цитата(ksnk @  7.3.2013,  08:43 Найти цитируемый пост)
У пользователя в данных хранится текстовое поле `seen_topics`

мне кажется так делать не стоит.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 7.3.2013, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Aliance, а почему? Текстовая строка используется кк запчасть в sql запросах.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Arantir
Дата 7.3.2013, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Цитата(Gold Dragon @  7.3.2013,  07:00 Найти цитируемый пост)
Я зашёл на сайт и должен сформироваться список непрочитанных тем. Каким образом?

Новые темы/сообщения гарантированно непрочитанные. Новые — созданные после последней активности пользователя.
Список не создается, а дополняется такими темами. При этом в списке хранятся еще и все прошлые непрочитанные немы.
Прочтение темы означает удаление ее из списка непрочитанных.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Gold Dragon
Дата 7.3.2013, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



хоть убейте, никак не могу нащупать мыль...

В общем делаю предварительное резюмирование

Пользователь зашёл на сайт:
- считывается дата его последнего пребывания
- считываются новые сообщения ДАТА_ПОСЛЕДНЕГО_ВИЗИТА < ДАТА_СООБЩЕНИЯ
- считываем данные у пользователя по форумам
- синхронизируем: добавляем недостающие id форумов
- изменяем дату последнего пребывания

Пользователь заходит на форум:
- считывается дата его последнего пребывания
- считываются новые сообщения ДАТА_ПОСЛЕДНЕГО_ВИЗИТА < ДАТА_СООБЩЕНИЯ
- считываем данные у пользователя по форумам
- синхронизируем: добавляем недостающие id форумов + удаляется форум в который зашёл
- изменяем дату последнего пребывания

Так?




--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Arantir
Дата 7.3.2013, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



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


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1247 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.