• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Список Просмотренных Материалов

  • Автор темы maximus825
  • Дата начала
M

maximus825

Коллеги, добрый день!

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

Пока придумано три решения:
1. Создать дополнительную таблицу в БД, куда складывать ID всех просмотренных материалов и строить вывод исключая эти самые ID. (минус - огромнейшая таблица. На сайте в данный момент >40к материалов и >600 пользователей. 40 000 * 600 = 24 миллиона строк. И это далеко не предел.)
2. В каждом материале в соответствующую ячейку вкладывать через ";" ID пользователей, просмотревщих материал. (минус - очень быстро можно забить ячейку данными настолько, что ее длина станет кртически большой превысит максимальный размер ячейки для любого типа данных)
3. Создать ячейку в таблице пользователей и указывать в ней время последнего посещения сайта. На основании этого строить список новых материалов (минус - неточность)

Хотелось бы узнать, реализовывал ли кто подобную задачу или же в какую сторону думать.

Заранее благодарен.
 
M

maximus825

Очень простая. Добавим в таблицу с пользователями два столбца (last_time и this_time). Все новые материалы будем определять по значению ячейки last_time. Формировать ее будем исходя из сессии. Время сессии 15 минут. Время каждого последующего действия пользователя на странице материалов, будем хранить в ячейке this_time. Если между значениями ячейки this_time и текущим временем менее 15 минут - значение ячейки last_time оставляем без изменений. Если же пройдет более 15 минут - в ячейку last_time вносим значение ячейки this_time, а в this_time вносим значение текущего времени.

Неточность заключается в следующем. Допустим входит пользователь на сайт и выбирает просмотр только новых материалов. Ему строится список новых публикаций с момента его последнего входа (для примера 5 страниц по 15 материалов). Пользователь просматривает первую и вторую страницы, а далее его кто-то отвлекает на срок более 15 минут. При попытке прочитать 3ю страницу новых материалов, его перебросит на первую страницу, где будет всего (для примера) 2 новых публикации. Вот именно это меня и не устраивает.
 
M

-master-

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

maximus825

Вы какой-то огород нагородили.
Хватит одного столбца с записанным туда время последнего прочитанного, или еще чего, к примеру время последней считки.
Проще надо быть, проблем меньше...
И как вы предлагаете обновлять время последнего прочитанного материала? Если при обновлении страницы то это не вариант. Страниц может быть более одной.
 
M

-master-

Да хоть мильён, разница какая?
начните с начала, с определения - что такое прочитанный?
 
M

maximus825

Да хоть мильён, разница какая?
начните с начала, с определения - что такое прочитанный?
Прочитанный это значит что пользователь этот материал видел. На странице материала, в общем списке. Без разницы где именно. Если человек посетил страницу, на которой публиковался материал, значит этот материал пользователь видел. В каком порядке выводятся материалы, тоже не должно быть важно. Если пользователь смотрит главную страницу, то материалы выходят строго по ID (3966/3967/3968 и т.д.), но если пользователь видит материал на странице категории, то материалы не факт что будут идти последовательно. Следовательно если запомнить номер последнего просмотренного, можно проморгать пару материалов.
 
M

-master-

Ничего не понятно. если чел видит список из надцати страниц, считается что все видел или как?
 
M

-master-

тогда вам надо новая таблица куда скидывать прочитанные айдишники
 
M

maximus825

Размер таблицы, получающийся в данный момент меня очень сильно смущает.
 
M

-master-

5000 ? это можно сказать пустая таблица.
 
M

maximus825

5000 ? это можно сказать пустая таблица.
Да там не 5000. Сейчас 44 тысячи постов. 600 пользователей. На выходе имеем таблицу в 24 миллиона строк. Учитывая что количество пользователей растет так же, как и количество материалов - Неособо маленькая таблица получится.
 
M

maximus825

это не намного больше 5000, пустая
44 тысячи это количество материалов. А вот количество просмотренных (если писать в базу потоково) более 24х миллионов. Но мы нашли решение. Проверка будет вестись по дате последнего прочитанного поста и списку просмотренных постов, которые будут один за другим добавляться в базу, а при достижении 100% просмотра материалов на сайте (или нажатии кнопки "я все прочитал") дата последнего прочитанного поста будет обновляться на текущую, а все записи изи списка просмотренных - удаляться.
 
M

-master-

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

maximus825

данных у вас всего 44 тыс, откуда вы миллионы взяли одному богу известно, да и при миллионе это не так и страшно. не важно сколько штук в таблице, важнее сколько их у чела, у чела 44 тыс.
а дальше опять непонятно про что разговор. поток сознания...
А вы посчитайте сами. 44 тысячи материалов. 600 пользователей. 44000 на 600 умножьте.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!