Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2013, 17:10   #1
maximus825
 
Аватар для maximus825
 
Регистрация: 25.02.2013
Сообщений: 7
По умолчанию Список просмотренных Материалов

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

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

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

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

Заранее благодарен.
maximus825 вне форума Ответить с цитированием
Старый 25.02.2013, 18:21   #2
buriat
Форумчанин
 
Регистрация: 28.06.2010
Сообщений: 189
По умолчанию

можно 1 вариант, только хранить ID непросмотренных материалов. )
buriat вне форума Ответить с цитированием
Старый 25.02.2013, 18:36   #3
maximus825
 
Аватар для maximus825
 
Регистрация: 25.02.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от buriat Посмотреть сообщение
можно 1 вариант, только хранить ID непросмотренных материалов. )
Слишком много времени займет генерация списка. Да и хранить для каждого нового пользователя более 46 тысяч строк в базе данных (а количество материалов растет каждый час) не лучший выход из ситуации.
maximus825 вне форума Ответить с цитированием
Старый 25.02.2013, 19:35   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,159
По умолчанию

а вы гляньте в сторону форумов..... тем не меньше тем и строк в бд, посмотрите как там решено
ADSoft вне форума Ответить с цитированием
Старый 27.02.2013, 16:13   #5
demeros
Пользователь
 
Регистрация: 29.03.2010
Сообщений: 35
По умолчанию

Какая СУБД используется?
Использовать первый вариант - Таблица : {user_id, material_id}.
Проставить ключи.
Как вариант можно запоминать некоторые данные на стороне клиента. Cookies или local storage. Но это в целях небольшей оптимизации.

*UPD

Ккова логика вывода статей?
Вы хотите показывать пользователю только новые статьи, или как-нибудь по-другому?
Больше информации.

Последний раз редактировалось demeros; 27.02.2013 в 16:18. Причина: UPD
demeros вне форума Ответить с цитированием
Старый 27.02.2013, 16:51   #6
maximus825
 
Аватар для maximus825
 
Регистрация: 25.02.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от demeros Посмотреть сообщение
Какая СУБД используется?
MySQL
Цитата:
Сообщение от demeros Посмотреть сообщение
Ккова логика вывода статей?
Вы хотите показывать пользователю только новые статьи, или как-нибудь по-другому?
Больше информации.
Логика работает следующим образом. Пользователь сам выбирает что хочет видеть. Он может видеть весь список материалов, может выбрать определенную категорию материала и читать только материалы этой категории, может выбрать только новые материалы и даже новые строго в определенной категории. Со всем уже разобрались, кроме списка новых материалов.

Хранить в базе IDшники просмотренных материалов для каждого пользователя (зарегистрированного и авторизованного естественно) было первичным решением, но подсчитав текущее количество пользователей и опубликованных материалов мы получили внушительную сумму. Сайт медленно но верно набирает некую популярность и количество строк в базе просмотренных будет все время расти с очень большой скоростью.

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

В данный момент думаем над следующим решение: таблица со списком просмотренных материалов (например posts_read (post_id; user_id)) и таблица со значением последнего времени входа на сайт.

Логика работы такова:
Когда пользователь входит на сайт, ему создается сессия, в которой будет храниться время входа. Таблица со списком просмотренных материалов остается пустой. Просмотр каждого материала будет добавлять в таблицу posts_read ID просмотренного материала. При последующем обновлении страницы или переходе на другую страницу, из списка новых материалов будут исключены те материалы, id которых совпадают с id материалов из таблицы posts_read. Когда список с начала сессии, путем исключения материалов из таблицы posts_read, будет равен 0, сессия будет сдвинута до текущего времени, а из таблицы posts_read будут удалены все записи для текущего пользователя.

Последний раз редактировалось maximus825; 27.02.2013 в 16:55.
maximus825 вне форума Ответить с цитированием
Старый 28.02.2013, 14:49   #7
demeros
Пользователь
 
Регистрация: 29.03.2010
Сообщений: 35
По умолчанию

MySql - вообще супер!
Можете воспользоваться партициями!
Очень хороший и доступный для понимания пример - http://habrahabr.ru/post/66151/ .
*UPD. Ранжируете по ид_пользователя.

Как я уже говорил можно также стелать оптимизацию на стороне клиента - куки, дата сторедж. И обращаться к бд только в случае если не выполнено/выполнено какоето условие. Например пользователь решил читать статьи с новой категории. Както так.
Для начала сделайте рабочий пример posts_read (post_id; user_id) и посмотрите на нагрузку/удобство. Только после этого начинайте оптимизацию, сначала серверную, если всеравно тяжко - подключайте клиентскую.
Вариантов решения много - тот же кеш. Банально делайте рабочий прототип в лоб, опробуйте на n - пользователях, и только потом оптимизируйте в узких местах.

Последний раз редактировалось demeros; 28.02.2013 в 14:53.
demeros вне форума Ответить с цитированием
Старый 28.02.2013, 18:40   #8
maximus825
 
Аватар для maximus825
 
Регистрация: 25.02.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от demeros Посмотреть сообщение
MySql - вообще супер!
Можете воспользоваться партициями!
Очень хороший и доступный для понимания пример - http://habrahabr.ru/post/66151/ .
*UPD. Ранжируете по ид_пользователя.

Как я уже говорил можно также стелать оптимизацию на стороне клиента - куки, дата сторедж. И обращаться к бд только в случае если не выполнено/выполнено какоето условие. Например пользователь решил читать статьи с новой категории. Както так.
Для начала сделайте рабочий пример posts_read (post_id; user_id) и посмотрите на нагрузку/удобство. Только после этого начинайте оптимизацию, сначала серверную, если всеравно тяжко - подключайте клиентскую.
Вариантов решения много - тот же кеш. Банально делайте рабочий прототип в лоб, опробуйте на n - пользователях, и только потом оптимизируйте в узких местах.
Куки в нашем случае отпадают мгновенно, т.к. я не хочу чтоб пользователь чувствовал дискомфорт сидя на домашнем и рабочем компьютерах. А вот с партициями попробуем. Спасибо!
maximus825 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для расчета стоимости материалов. nachonovo Фриланс 13 15.01.2013 17:04
Дополнительный мета-тег в менеджер материалов ekvador WordPress и другие CMS 1 19.10.2012 10:46
Вид материалов поиска Yura111 HTML и CSS 0 05.05.2012 22:36
Joomla 1.5 Сортировка материалов по дополнительному полю new player WordPress и другие CMS 0 16.02.2012 11:20
скрипт оценки материалов kspasha PHP 16 24.09.2010 12:47