Лента активности

Обсуждаем, как правильно строить приложения
Ответить
Melodic
Сообщения: 87
Зарегистрирован: 2016.05.11, 17:43
Откуда: Луганск

Лента активности

Сообщение Melodic »

Всем привет!
Есть сайт, соцсеть.

На сайте есть личные записи пользователей(записи личного блога), комментарии, альбомы с фото.
Для хранения в БД используется Doctrine.

Нужно спроектировать ленту активности.

Сейчас сделано так: при создании чего либо (коммента к фотке, коммента к записи пользователь, фотки,записи пользователя) , создаётся сущность ( AlbumImageCommentActivity, ArticleCommentActivity, AlbumImageActivity,ArticleActivity соответственно, унаследованная от базовой Activity). Всё бы ничего, но при выводе на страницу мешает приватность (а у комментариев её вообще нет) и на этапе выборки из БД я не могу отсеять те активности которые не доступные пользователю. Сейчас же отсеиваю уже после выборки (просто удаляю из массива, если не прошло проверку на доступность), здесь есть минус в том, что ломается пагинация (на каждой странице может быть разное кол-во элементов, а то и вообще не быть), но благо лента подгрузкой, как в ВК.

Возможно изначально я пошёл не потому пути.

Ваши предложения? :)

Да и вообще, как делается вывод сущностей разных классов в одном списке?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Лента активности

Сообщение zelenin »

Melodic писал(а): 2017.05.10, 16:13 Всем привет!
Есть сайт, соцсеть.

На сайте есть личные записи пользователей(записи личного блога), комментарии, альбомы с фото.
Для хранения в БД используется Doctrine.

Нужно спроектировать ленту активности.

Сейчас сделано так: при создании чего либо (коммента к фотке, коммента к записи пользователь, фотки,записи пользователя) , создаётся сущность ( AlbumImageCommentActivity, ArticleCommentActivity, AlbumImageActivity,ArticleActivity соответственно, унаследованная от базовой Activity). Всё бы ничего, но при выводе на страницу мешает приватность (а у комментариев её вообще нет) и на этапе выборки из БД я не могу отсеять те активности которые не доступные пользователю
так добавь необходимые метаданные
Melodic писал(а): 2017.05.10, 16:13Да и вообще, как делается вывод сущностей разных классов в одном списке?
сущность одна - это событие. если речь о шаблоне для разных подсобытий, то switch/case тебя спасет
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Лента активности

Сообщение anton_z »

user_id для Activity должен помочь.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Лента активности

Сообщение samdark »

Про ленту новостей соцсети каждый год рассказывает Дмитрий Бородин на разных конференциях: http://spb-borodin.livejournal.com/.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Лента активности

Сообщение yiijeka »

Кстати, точно такой же архитектурный косяк заложен в Humhub. Решается через подзапросы, запросы, запросы с user_id...чёрт ногу сломит.

P.S. Лента новостей чуть иное, чем лента активности.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Лента активности

Сообщение yiijeka »

Мне кажется нужно это в очереди запихнуть, т.е. когда что-то происходит, то для всех пользователей, которым доступна изначальная сущность, создаётся запись: visible_for_user_id, main_enity_id, main_enity_name, data_activity...

Так мы через запрос

Код: Выделить всё

Select * from .. where visible_for_user_id = :? 
получим ленту активности для любого пользователя без всяких напрягов. Если же есть проблема, как поступать когда то для какой-то сущности изменятся права доступа для конкретного пользователя, то обычным удалением(или через флаг) мы скрываем записи активности по полям main_enity_id, main_enity_name
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Лента активности

Сообщение samdark »

А если у звезды шоу-бизнеса миллион подписчиков? Создавать миллион записей?
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Лента активности

Сообщение yiijeka »

ну а в противном случае наступает то, что описал ТС )
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Лента активности

Сообщение samdark »

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

Ну и ещё:

1. Придётся ограничить выдачу дней в 10.
2. Записи придётся чистить.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Лента активности

Сообщение slavcodev »

samdark писал(а): 2017.06.07, 15:55 А если у звезды шоу-бизнеса миллион подписчиков? Создавать миллион записей?
Хмм, а лента активности это не то что просто лог события что я сделал, который можно посмотреть открыть спец станицу моего профиля?
Т.е. я так понимаю что речь не о подписках вовсе.
Жду Yii 3!
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Лента активности

Сообщение yiijeka »

у ТС и в HumHub лента активности - это события, которые происходят с сущностями, к которым вы явно и неявно имеете отношение.
Например кто-то создал пост. Вы жмакнули на него лайк. Потом к этому посту кто-то написал коммент, кто-то лайкнул этот коммент.

Тут будут для вас лента активности:
- Кто-то написал коммент к посту, который вы лайкнули.
- Кто-то лайкнул коммент к посту, который вы лайкнули.


Ну и на подобии этого.

Грабли начинаются в случае: Вы состоите в группе, в этой группе кто-то выкладывает пост, который доступен одному, двум членам из этой группы. Ну и активность будет для вас следующая:

- Кто-то создал пост в группе, которой вы состоите (этого не должно быть, т.к. пост приватный)
- Кто-то лайкнул пост (зависит от 1)
- Кто-то прокомментировал пост (зависит от 1)
- Кто-то прикрепил файл к посту (завист от 1)
- Кто-то ещё что-то сделал с постом...

Т.е. надо для каждой такой активности вынимать первоначальную сущность и проверять есть ли на неё права, ладно бы если там user_id, но там может быть RBAC, система подписок, группы или подобное. Ладно для одной такой активности проверить, а если надо ленту получить, то будет то что описал ТС (пагинация летит, куча непонятных подзапросов, фильтрация после sql и боль поддержки....)
Аватара пользователя
zabachok
Сообщения: 522
Зарегистрирован: 2013.12.16, 14:38

Re: Лента активности

Сообщение zabachok »

yiijeka писал(а): 2017.06.13, 18:36 Т.е. надо для каждой такой активности вынимать первоначальную сущность и проверять есть ли на неё права, ладно бы если там user_id, но там может быть RBAC, система подписок, группы или подобное. Ладно для одной такой активности проверить, а если надо ленту получить, то будет то что описал ТС (пагинация летит, куча непонятных подзапросов, фильтрация после sql и боль поддержки....)
Так как это дядьки делают? Как правильно и без боли сделать?
2b||!2b Just read the instructions
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Лента активности

Сообщение yiijeka »

Я не знаю как делают, но я столкнулся с такой же бедой и как решение мне видится это делать через очереди с созданием строчек:

user_id | activity_id
Ответить