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



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

#1 fedornabilkin
fedornabilkin
  • Модератор
  • 1 190 сообщений
  • Репутация: 206
3

Обновлено 24 мая 2013 - 15:38  Отправлено 17 мая 2013 - 15:54

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

 

 

  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#2 denis79513
denis79513
  • Неактивные
  • 56 сообщений
  • Репутация: 7

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

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

#3 isvetlichniy
isvetlichniy
  • Неактивные
  • 622 сообщений
  • Репутация: 93

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

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

#4 fedornabilkin
fedornabilkin
    Topic Starter
  • Модератор
  • 1 190 сообщений
  • Репутация: 206

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

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

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#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
  • Модератор
  • 1 190 сообщений
  • Репутация: 206

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

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

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


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

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

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#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

#11 Odmen
Odmen
  • Пользователь PRO
  • 5 275 сообщений
  • Репутация: 56

Отправлено 21 мая 2013 - 17:48

А если пользователь год не заходил на форум, потом зашёл и там тысячи новых тем. Почему-то вдруг он решил не просматривать их все и нажал на кнопочку "Отметить все сообщения прочитанными". Что происходит в этот момент? В таблицу `visit` добавляется тысячи записей?
  • 0

#12 html-ka
html-ka
  • Неактивные
  • 455 сообщений
  • Репутация: 82

Отправлено 22 мая 2013 - 01:40

и в чем нарушение нормализации?


  • 0

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

Отправлено 22 мая 2013 - 18:11

и в чем нарушение нормализации?

Разрушается атомарность данных, хранящихся в одной ячейке. Это первая нормальная форма. Почитайте подробнее ЗДЕСЬ, если интересно

А если пользователь год не заходил на форум, потом зашёл и там тысячи новых тем. Почему-то вдруг он решил не просматривать их все и нажал на кнопочку "Отметить все сообщения прочитанными". Что происходит в этот момент? В таблицу `visit` добавляется тысячи записей?


А что если сделать какую-то метку в таблице для тех случаев, когда пользователь нажимает "Отметить все сообщения прочитанными"? Вот только как её реализовать, не совсем сейчас могу сообразить. Есть у кого-то идеи? А вы, ув. Админ, как бы решили задачу ТС?
  • 1

#14 html-ka
html-ka
  • Неактивные
  • 455 сообщений
  • Репутация: 82

Отправлено 22 мая 2013 - 21:10

и какая атомарность нарушена в данном случае?


  • 0

#15 fedornabilkin
fedornabilkin
    Topic Starter
  • Модератор
  • 1 190 сообщений
  • Репутация: 206

Отправлено 23 мая 2013 - 09:57

Это один из основных принципов работы БД. MEGApixel, в данном случае прав и с этим не поспоришь.
После долгих раздумий и приведенных вариантов в этой теме, представляю себе вот что.
1. Определяем темы, в которых быдут подсвечиваться новые сообщения. Тема, которую создал юзер, тема в которой есть хотя бы один пост юзера. Так через три месяца отсутствия не получится тысяча тем и записей в таблице.
2. Для меня ближе создание отдельной таблицы для этих целей, поэтому вариант MEGApixel вполне подходит. В этой таблице можно делать доп поле, по которому связывать незарегистрированных пользователей куками. В таблицу записывать не время посещения темы, а время последнего поста.
3. Кнопка "Отметить все как прочитанное" работает следующим образом. Если человек нажимает эту кнопку, то дальнейшее развитие тем ему не интересно. Значит удаляем соответствующие записи из таблицы(вариант очистки).

Вот как-то так. Только будет проблема с незарегистрированными, если они почистят куки или другой браузер.
Так же остается вопрос с очисткой таблицы от устаревших данных.


  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



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

Отправлено 23 мая 2013 - 10:02

и какая атомарность нарушена в данном случае?


Ну под атомарностью подразумевается, что в одной ячейке будет храниться только одно значение. id_user - только одна цифра, name - только одно слово, и т.д. А если кучу информации запихать в одну ячейку - это никак не атомарные данные.

Это сделанно для того, я так думаю, чтобы БД в будущем могла легко масштабироваться, могли устанавливаться новые внутренние и внешние связи, была однозначной и самодокументируемая.
  • 0

#17 html-ka
html-ka
  • Неактивные
  • 455 сообщений
  • Репутация: 82

Отправлено 23 мая 2013 - 14:50

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

Если исходить из твоей логике, то запись даты будет тоже нарушена атомарность, т.к. там есть год, месяц, число, часы, минуты и секунды :) хотя это тип данных поддерживаемый MySQL

Теперь по делу, массив, который вы получите собирая для хранения в БД вы не сможете записать в таблицу, т.к. реляционная база данных не поддерживает такой тип данных, следовательно, чтоб записать массив, вам нужно будет преобразовать его в строку, в php это можно будет с помощью 2-х функций:

implode — Объединяет элементы массива в строку
Возвращает строку, содержащую строке представление всех элементов массива в указанном порядке, со строкой glue между каждым элементом.

serialize — Генерирует пригодное для хранения представление переменной
Возвращает строку, содержащую потоковое представление переменной value, которая может быть сохранена где угодно.

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

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

Отправлено 24 мая 2013 - 10:36

что вы не знаете базовый синтаксис SQL это огорчает.


Переходить на личности не очень правильно. Но все же, от куда такая уверенность?

Ваша мысль имеет право на существования.
Но я сторонник того, чтобы все операции с БД выполняла именно СУБД. Она для того и создана. Не совсем правильно перекладывать это на скрипт. Это еще большой вопрос, что сильнее нагрузит сервер.

Если исходить из твоей логике, то запись даты будет тоже нарушена атомарность, т.к. там есть год, месяц, число, часы, минуты и секунды :) хотя это тип данных поддерживаемый MySQL


Во-первых, правила нормализации не я придумал. На этих принципах строится все суть реляционных БД.
Во-вторых, запись даты никак не нарушает атомарность данных. Как раз таки потому, что MySQL имеет такой тип данных и умеет корректно с ним работать.

Интересно, есть еще сторонники теории пользователя html-ka (что все данные нужно сериализовать в строку и занести в одну ячейку для каждого пользователя)?
  • 0

#19 fedornabilkin
fedornabilkin
    Topic Starter
  • Модератор
  • 1 190 сообщений
  • Репутация: 206

Отправлено 24 мая 2013 - 15:38

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

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



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


Похожие темы
  Название темы Автор Статистика Последнее сообщение

Пользователь месяца
Megoydagi Megoydagi 1-й за Август
Очков активности: 30 4 темы, 8 сообщений, 1 балл репутации
Сайт: bank.net.ru
ТОП самых активных за этот месяц
  • Фотография Vmir
    #1

    Vmir
    Очков активности: 22.5 3 темы, 6 сообщений, 1 балл репутации

  • Фотография BLIK
    #2

    BLIK
    Очков активности: 18 Вне конкурса за определение пользователя месяца

  • Фотография kuztoday
    #3

    kuztoday
    Очков активности: 10.5 1 тема, 4 сообщения, 1 балл репутации

  • Фотография SergiuS85
    #4

    SergiuS85
    Очков активности: 10.5 2 темы, 1 сообщение, 1 балл репутации

  • Фотография kolver
    #5

    kolver
    Очков активности: 9 1 тема, 3 сообщения, 1 балл репутации

  • Фотография mkreine
    #6

    mkreine (analiz-krovi.net)
    Очков активности: 9 1 тема, 3 сообщения, 1 балл репутации

  • Фотография Megoydagi
    #7

    Megoydagi (bank.net.ru)
    Очков активности: 9 Вне конкурса за определение пользователя месяца

  • Фотография Totti
    #8

    Totti
    Очков активности: 7.5 0 тем, 5 сообщений, 1 балл репутации

  • Фотография wp01
    #9

    wp01
    Очков активности: 6 0 тем, 4 сообщения, 1 балл репутации

  • Фотография r0mZet
    #10

    r0mZet (rz-style.ru)
    Очков активности: 6 1 тема, 1 сообщение, 1 балл репутации

  • Показать весь ТОП 10

Поддержите форум! =)
Топ 5 участников по репутации

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