Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ASP.NET Новый топик    Ответить
 Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
yardie
Member

Откуда: Кокосовые острова
Сообщений: 316
Привет всем.
Реализую сервис где пользователи выкладывают свои фотографии и могут ставить друг другу лайки.
использую asp.net mvc c#, все полностью пишу с нуля.
для вывода блоков с фотографией использую автоподгрузку, с начало выгружаю 9 блоков с фото, когда пользователь прокручивает до конца экрана отправляется последний Id на сервер, и выбираются следующие фото где lastId < IdPhoto
Тут все работает как часы!

Но так же хочу отсортировать фото по количеству лайков и выводить их.
Само кол-во лайков у фото может меняться в любой момент времени и это значит что блоки с фотографиями будут задваиваться или пропускаться.....
Посоветуйте как мне делать выборку последующих фотографий? мне по идее проще всего где-то хранить Id уже выгруженных фотографий и при последующем запросе удалять те что уже выгрузил, так? Или есть другие варианты?
10 янв 17, 18:22    [20090701]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Парамон
Member

Откуда:
Сообщений: 1278
yardie
и выбираются следующие фото где lastId < IdPhoto page = 2

выводить постранично

yardie
Само кол-во лайков у фото может меняться в любой момент времени и это значит что блоки с фотографиями будут задваиваться или пропускаться...

проблема...
10 янв 17, 18:58    [20090812]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Парамон
Member

Откуда:
Сообщений: 1278
можно просто
следующие фото где skip 20

не суть
10 янв 17, 19:10    [20090847]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
yardie
Member

Откуда: Кокосовые острова
Сообщений: 316
Парамон,

по странично нельзя именно автоподгрузка!

Skip() пропускает определенное количество элементов, в моем случае не подходит...
дело в том что я каждый раз делаю запрос, и вывожу порциями по 9 фото. в моем случае лайки могут ставиться и убираться ежесекундно, это задает некую динамику. и сортировка фото по кол-ву лайков будет при каждом запросе новая.
хранить в памяти миллион, а со временем и несколько миллионов выбранных элементов тоже не правильно...
11 янв 17, 10:21    [20092433]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Парамон
Member

Откуда:
Сообщений: 1278
yardie
по странично нельзя именно автоподгрузка!

не вижу противоречий!

yardie
в моем случае лайки могут ставиться и убираться ежесекундно, это задает некую динамику. и сортировка фото по кол-ву лайков будет при каждом запросе новая.

придется с этим жить )
11 янв 17, 10:38    [20092480]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
yardie
Member

Откуда: Кокосовые острова
Сообщений: 316
Парамон
yardie
по странично нельзя именно автоподгрузка!

не вижу противоречий!

yardie
в моем случае лайки могут ставиться и убираться ежесекундно, это задает некую динамику. и сортировка фото по кол-ву лайков будет при каждом запросе новая.

придется с этим жить )


во первых такая идея чтобы была автоподгрузка, постраничная разбивка не катит

с этим жить не придется, вконтакте так реализовали, не могу разобрать что они сделали, значит реализовать можно
11 янв 17, 10:47    [20092512]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 20141
yardie
Парамон
пропущено...

не вижу противоречий!

пропущено...

придется с этим жить )


во первых такая идея чтобы была автоподгрузка, постраничная разбивка не катит

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

Страница - это 9 блоков. Пользователь проматывает вниз, подгружается следующая страница: следующие 9 блоков.

А насчёт "вконтакте так реализовали"... Так откройте вкладку Network в браузере и посмотрите запрос с какими параметрами уходит на сервер при прокрутке страницы.
11 янв 17, 11:29    [20092754]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Парамон
Member

Откуда:
Сообщений: 1278
yardie
с этим жить не придется, вконтакте так реализовали

видать кэшируют )
11 янв 17, 12:37    [20093180]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Парамон
Member

Откуда:
Сообщений: 1278
skyANA
Страница - это 9 блоков. Пользователь проматывает вниз, подгружается следующая страница: следующие 9 блоков.

еще подсказка - page = 3 это skip 18 )
11 янв 17, 12:53    [20093281]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Rocketeer88888
Member

Откуда:
Сообщений: 51
Вот есть тюториал. https://msdn.microsoft.com/en-us/library/aa581771.aspx
Конкретно, всё же, я думаю, постраничный вывод вам нужен https://msdn.microsoft.com/en-us/library/bb445504.aspx . Там по ссылке в том числе и постраничный вывод динамически меняющихся данных разобран (только там удаление разобрано). Не факт, что вам поможет, но всё же.

Вообще, Вконтакте тот же - там часто в галареях попадаются дубликаты. Причём и по три раза (не уверен) могут быть. Но двойки видел совершенно точно, и очень много. Также могут быть пустышки, на которых явно должна была быть фотка, но она не непрогрузилась, а просто была исключена из запроса, судя по всему.

Вывод - вконтактщики просто оставили такой баг. Можно, конечно, придумать сложный механизм, который путём заведения кучи кешей и списков "уже просмотрено" и тому подобных будет эффективно удалять дубликаты и вставлять новые элементы, которые вдруг стали удовлетворять запросу, потому что кто-то прямо сейчас поставил лайк или дизлайк, но проще объявить это фичей и оставить как есть. Если глаза сильно не мозолит, то всем будет плевать.

Идём в ВК, ищем юзера с фотками
https://vk.com/search?c[age_from]=18&c[age_to]=18&c[name]=1&c[photo]=1&c[q]=%D0%B0%D0%BD%D1%8F&c[section]=people&c[sex]=1&c[status]=6

Смотрим фотки https://vk.com/anna_egorova_2000?z=albums203670003

Крутим немного вниз и видим повторяющиеся фотки
https://vk.com/photo203670003_368722064?all=1
https://vk.com/photo203670003_368722049?all=1

их полно, и они подряд, что ещё хуже

По какой причине это произошло? - Неважно. Скорее всего, дело не в лайках или дизлайках, а в чём-то другом (фотки по умолчанию по дате добавления сортируются). Главное, что ВК пофиг, что у юзеров аж подряд могут одинаковые фотки идти. Число юзеров ВК от этого явно не уменьшается. Вывод - забить.
11 янв 17, 18:41    [20095197]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Rocketeer88888
Member

Откуда:
Сообщений: 51
автор
Конкретно, всё же, я думаю, постраничный вывод вам нужен

Т. е. вы предыдущую страницу не убираете, а добавляете новую к старым страницам.
11 янв 17, 18:42    [20095203]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Rocketeer88888
Member

Откуда:
Сообщений: 51
Rocketeer88888
автор
Конкретно, всё же, я думаю, постраничный вывод вам нужен

Т. е. вы предыдущую страницу не убираете, а добавляете новую к старым страницам.

Но это только на клиенте. Запрос к БД, конечно, постраничный.
11 янв 17, 18:43    [20095207]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Rocketeer88888
Member

Откуда:
Сообщений: 51
Проблемы начнутся только при очень активном изменении набора. Например, сотня юзеров очень быстро лайкает-дизлайкает список из тысячи фоток, а другие этот список активно прокручивают.
11 янв 17, 18:49    [20095233]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Rocketeer88888
Member

Откуда:
Сообщений: 51
Вообще, в зависимости от требований и желания углубляться в проблемы, можно по-разному формализовать задачу. Ну вот несколько разных подходов, которые можно ещё на подварианты разбить.


1.
Чисто логически, если сортировка по числу лайков, а фотка получила другое число лайков, то это теперь новая фотка с точки зрения запроса. И пусть на ней изображено то же самое, но запрос же по лайкам, а не по содержимому. То, что юзер прокрутил - это уже история. 10 секунд назад фотка имела 20 лайков, а теперь - 21. Значит, её надо показать снова - вместе с теми, которые имеют 21 лайк.


2.
Вот если бы пользователь попросил 1) сортировать по лайкам, 2) не дублировать старые, 3) учитывать новые, то это другое дело. Но здесь без запоминания "уже просмотренных" и "новых, попавших в диапазон по числу лайков" не обойтись - т. е. надо хранить эти дополнительные списки и динамически их обновлять, в засисимости от активности пользователей в данной галерее. Также надо решить вопрос с добавлением-удалением фоток. Т. е. юзеры же могут не только смотреть, лайкать и дизлайкать фотки во время просмотра другим юзером, а и обычные CRUD операции совершать ещё над ними. Так что вопрос лайков-дизлайков тут ещё не самый сложный.


3.
Таки сделать слепок списка фоток и заморозить его на время запроса пользователя. Т. е. пока юзер листает галерею, сохраняется где-то слепок списка фоток на время первого захода юзера в эту галерею. Слепок действует только относительно этого юзера, а для других - свой слепок.


4.
Таки кешируем вообще всю галерею и обновляем кеш периодически.
11 янв 17, 19:06    [20095277]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Rocketeer88888
Member

Откуда:
Сообщений: 51
Ну а по дубликатам есть, вроде, вполне решения - от использования distinct в запросе, до каких-то кастомных правил. Гуглите "paging without duplicates"
https://skelia.com/articles/pagination-with-dynamic-data-loading-2/
http://stackoverflow.com/questions/10187066/how-do-i-remove-duplicates-in-paging
11 янв 17, 19:18    [20095316]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Нахлобуч
Member

Откуда: https://hglabhq.com
Сообщений: 3890
Может оказаться дорого с точки зрения вычислительных ресурсов, но будет работать точно.

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

select 
  p.Name,
  (select count(*) from Like l where l.PhotoID = p.ID and l.Date <= @initialDate) as Likes
from Photos p
order by Likes desc
11 янв 17, 19:43    [20095384]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
yardie
Member

Откуда: Кокосовые острова
Сообщений: 316
Rocketeer88888,
Спасибо, достаточно много информации дли, буду разбираться
11 янв 17, 21:38    [20095815]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
hVostt
Member

Откуда:
Сообщений: 9108
yardie
Само кол-во лайков у фото может меняться в любой момент времени и это значит что блоки с фотографиями будут задваиваться или пропускаться.....


Всё зависит от того, как хранятся лайки. Если каждый лайк это запись с временной меткой, значит можно брать временную метку начала просмотра и пейджить считая лайки относительно неё, т.е. не учитывать изменения по лайкам после загрузки страницы. В целом, я считаю, это наиболее адекватное решение. Любое изменение сортировки и направления, в том числе обновление страницы сбрасывает временную метку.
11 янв 17, 21:59    [20095891]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
hVostt
Member

Откуда:
Сообщений: 9108
Нахлобуч,

а, ты уже предложил )
11 янв 17, 21:59    [20095893]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Rocketeer88888
Member

Откуда:
Сообщений: 51
Кстати, а такая ситуация нормальная? Заходим на главную страницу пользователя. Видим, что у него столько-то фотографий. Жмём на них - "пользователь не разрешил показывать свои фотографии". Крутим ленту пользователя до первой фотки из его галереи. Жмём на эту фотку. Внизу есть ссылка на галерею, в которой эта фотка. А вверху - "хлебные крошки" до самого корня галереи - до всех фоток пользователя. И что толку, что "пользователь не разрешил"? Как минимум, уже несколько лет такое вижу. Тоже "не баг, а фича"?

Это к вопросу "а как там у больших дядей?". Правда, не факт, что то, что прощают большим дядям, простят и вам.
12 янв 17, 07:33    [20096539]     Ответить | Цитировать Сообщить модератору
 Re: Вывод постов сортированных по количеству лайков (Автоподгрузка)  [new]
Rocketeer88888
Member

Откуда:
Сообщений: 51
То же самое - когда поиск пользователей из ВК. Если юзер поставил фотку на свою аватару, то, даже если он не разрешил смотреть свои фотки, можно кликом по этой аватаре перейти в галерею и всё посмотреть. Причём главная пользователя может быть вообще чистая - явно пользователь думает, что "спрятался" и никому ничего не видно, только для "своих" видно. А на самом деле любая фотка (хоть на аватаре, хоть в комменте) ведёт в галерею с полным доступом ко всем фоткам.
12 янв 17, 07:37    [20096540]     Ответить | Цитировать Сообщить модератору
Все форумы / ASP.NET Ответить