Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

Наличие новых сообщений в теме, как реализовано?

#1 fedornabilkin

fedornabilkin
  • Пользователь
  • 696 сообщений
  • Репутация: 91
3

Отправлено 17 Май 2013 - 15:54

Подскажите пожалуйста сам алгоритм или варианты реализации. Как сделать отображение новых сообщений в темах на форуме.
Я так понимаю надо использовать куки и каждому пользователю писать айди темы и время последнего сообщения. Потом сравнивать.
Но никак не пойму как сделать это для всех тем.

 

 

  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#2 denis79513

denis79513
  • Пользователь
  • 56 сообщений
  • Репутация: 7

Отправлено 17 Май 2013 - 16:31

Не знаю как это реализовано в движках, с форумами тесно не работал, но если рассуждать логически, если мы зайдем на форум в качестве гостя нам все темы показываются новыми, вне зависимости от того смотрели мы их или нет, а если вы авторизированы, и очистить куки темы все равно правильно отображаются поэтому мне кажется куки тут не при чем, подозреваю что в теблице с юзерами хранится поле в котором через запятую хранятся все прочитанные им темы, конечно может я ошибаюсь, но мне так кажется.
  • 0

#3 isvetlichniy

isvetlichniy
  • Пользователь
  • 619 сообщений
  • Репутация: 93

Отправлено 17 Май 2013 - 16:38

если конкретно об этом форуме, то движен называется IPB, поставь его и проанализируй как все работает
  • 0

#4 fedornabilkin

fedornabilkin
    Topic Starter
  • Пользователь
  • 696 сообщений
  • Репутация: 91

Отправлено 17 Май 2013 - 21:44

denis79513, просто через запятую не получится. Тут нужен массив и хранить его наверно придется в json.
Потому что надо будет сверять дату последнего поста в теме и дату в массиве. Например array("theme_id"=>12345678);
В данный момент все это как-то абстракто представляю, никакой конкретики
  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#5 MEGApixel

MEGApixel
  • Пользователь
  • 105 сообщений
  • Репутация: 6

Отправлено 20 Май 2013 - 10:19

Если будет в одной ячейке храниться вся эта инфа через запятую или в json-формате, то я сильно разочаруюсь в движке. Это прямое нарушение нормализации данных таблиц в реляционных БД. По идее в серьезных движках такого быть не должно. Так как такая досадная вещь очень сильно влияет на производительность при больших объемах информации.
  • 0

#6 html-ka

html-ka
  • Пользователь
  • 455 сообщений
  • Репутация: 82

Отправлено 20 Май 2013 - 10:31

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

// создаем массив данных
$fruits = array (
    "fruits"  => array("a" => "orange", "b" => "banana", "c" => "apple"),
    "numbers" => array(1, 2, 3, 4, 5, 6),
    "holes"   => array("first", 5 => "second", "third")
);
// сереализуем данные
$fruits = serialize($fruits);
echo "<h2>выводим сереализованные данные, смотрим на тип переменной</h2>";
echo "<pre>";
var_dump(serialize($fruits));
echo "</pre>";
// преобразуем сереализованные данные
$fruits = unserialize($fruits);
echo "<h2>выводим данные</h2>";
echo "<pre>";
print_r($fruits);
echo "</pre>";

  • 0

#7 fedornabilkin

fedornabilkin
    Topic Starter
  • Пользователь
  • 696 сообщений
  • Репутация: 91

Отправлено 21 Май 2013 - 09:53

Это прямое нарушение нормализации данных таблиц в реляционных БД

Вот и меня это тоже смущает.


сереализацию никто не отменял

Получается то же самое что ли? В плане производительности.
Кто-нибудь самостоятельно реализовывал подобную задачу?
  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#8 MEGApixel

MEGApixel
  • Пользователь
  • 105 сообщений
  • Репутация: 6

Отправлено 21 Май 2013 - 12:19

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

Предположим, что у каждого пользователя в таблице, допустим, `users` есть поле `themes`, куда сохраняется вся информация о посещенных темах, прочитанных сообщениях и пр. Если по этому полю в дальнейшем не планируется поиск, а данные из него нужно будет только извлечь зная id пользователя - то такой вариант будет приемлемым. А если в движке в будущем предусматриваются запросы типа `SELECT `id` FROM `users` WHERE `themes` LIKE (...) ` - то такая структура уже подходить не будет, в виду низкого быстродействия. Если такого не предвидится, то можно хранить в одной ячейке всю инфу. А формат хранения (сериализация, json, банально через запятую, массив и пр.) можно выбрать самостоятельно.

Согласен, что кривовато и тема остается открытой. Если кому не жалко времени, можно покопаться в исходниках движка.
  • 0

#9 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 21 Май 2013 - 13:20

MEGApixel, И чем этот вариант отличается от того, который описан в заминусованном Вами посте?
То, что данные о посещенных темах хранятся не в куках - это логично, поскольку форум может быть весьма объемным и на все темы может и кук не хватить... да и привязка должна быть именно к юзеру, а не к клиенту.
Но тема алгоритма действительно интересна. Здесь предлагается несколько интересных вариантов решения.


  • 0


#10 MEGApixel

MEGApixel
  • Пользователь
  • 105 сообщений
  • Репутация: 6

Отправлено 21 Май 2013 - 14:00

И чем этот вариант отличается от того, который описан в заминусованном Вами посте?


Ничем. Был не прав. Жаль нельзя минусы исправить обратно :D

А по поводу вопроса ТС, то пришло такое решение.
Создать отдельную таблицу, в которой будут записываться все "атомарные" действия юзеров по поводу посещения тем. Назовем её, к примеру, `visit`. Она предположительно будет иметь такую структуру:
  • user_id;
  • theme_id;
  • visit_time;
Думаю, что в разъяснениях особо не нуждается. Теперь по порядку.
  • Запись в таблицу `visit` происходит, когда юзер заходит в определенную тему. Если в таблице присутствует запись с таким же `user_id` и `theme_id`, то она апдейтится новым `visit_time`.
  • При построении страницы для каждой темы проверяется время последнего сообщения. Полученное время сравнивается с временем последнего посещения (из таблицы `visit`). Если первый операнд больше, то значит в теме появились новые непрочитанные сообщения (для этого юзера). Если нет - то все сообщения прочитаны.
Вот как-то так. Алгоритм можно дополнять и расширять, но его основу я вижу такой.
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru