|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
25.02.2013, 17:10 | #1 |
Регистрация: 25.02.2013
Сообщений: 7
|
Список просмотренных Материалов
Коллеги, добрый день!
Столкнулся с простой, на первый взгляд, ситуацией. Существует сайт. На сайте публикуются материалы пользователей. Необходимо, при выборе пользователем, выводить список новых материалов, которые этот самый пользователь не видел. Пока придумано три решения: 1. Создать дополнительную таблицу в БД, куда складывать ID всех просмотренных материалов и строить вывод исключая эти самые ID. (минус - огромнейшая таблица. На сайте в данный момент >40к материалов и >600 пользователей. 40 000 * 600 = 24 миллиона строк. И это далеко не предел.) 2. В каждом материале в соответствующую ячейку вкладывать через ";" ID пользователей, просмотревщих материал. (минус - очень быстро можно забить ячейку данными настолько, что ее длина станет кртически большой превысит максимальный размер ячейки для любого типа данных) 3. Создать ячейку в таблице пользователей и указывать в ней время последнего посещения сайта. На основании этого строить список новых материалов (минус - неточность) Хотелось бы узнать, реализовывал ли кто подобную задачу или же в какую сторону думать. Заранее благодарен. |
25.02.2013, 18:21 | #2 |
Форумчанин
Регистрация: 28.06.2010
Сообщений: 189
|
можно 1 вариант, только хранить ID непросмотренных материалов. )
|
25.02.2013, 18:36 | #3 |
Регистрация: 25.02.2013
Сообщений: 7
|
|
25.02.2013, 19:35 | #4 |
Старожил
Регистрация: 25.02.2007
Сообщений: 4,179
|
а вы гляньте в сторону форумов..... тем не меньше тем и строк в бд, посмотрите как там решено
|
27.02.2013, 16:13 | #5 |
Пользователь
Регистрация: 29.03.2010
Сообщений: 35
|
Какая СУБД используется?
Использовать первый вариант - Таблица : {user_id, material_id}. Проставить ключи. Как вариант можно запоминать некоторые данные на стороне клиента. Cookies или local storage. Но это в целях небольшей оптимизации. *UPD Ккова логика вывода статей? Вы хотите показывать пользователю только новые статьи, или как-нибудь по-другому? Больше информации. Последний раз редактировалось demeros; 27.02.2013 в 16:18. Причина: UPD |
27.02.2013, 16:51 | #6 | |
Регистрация: 25.02.2013
Сообщений: 7
|
MySQL
Цитата:
Хранить в базе 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. |
|
28.02.2013, 14:49 | #7 |
Пользователь
Регистрация: 29.03.2010
Сообщений: 35
|
MySql - вообще супер!
Можете воспользоваться партициями! Очень хороший и доступный для понимания пример - http://habrahabr.ru/post/66151/ . *UPD. Ранжируете по ид_пользователя. Как я уже говорил можно также стелать оптимизацию на стороне клиента - куки, дата сторедж. И обращаться к бд только в случае если не выполнено/выполнено какоето условие. Например пользователь решил читать статьи с новой категории. Както так. Для начала сделайте рабочий пример posts_read (post_id; user_id) и посмотрите на нагрузку/удобство. Только после этого начинайте оптимизацию, сначала серверную, если всеравно тяжко - подключайте клиентскую. Вариантов решения много - тот же кеш. Банально делайте рабочий прототип в лоб, опробуйте на n - пользователях, и только потом оптимизируйте в узких местах. Последний раз редактировалось demeros; 28.02.2013 в 14:53. |
28.02.2013, 18:40 | #8 | |
Регистрация: 25.02.2013
Сообщений: 7
|
Цитата:
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Программа для расчета стоимости материалов. | 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 |