Лента активности
Лента активности
Всем привет!
Есть сайт, соцсеть.
На сайте есть личные записи пользователей(записи личного блога), комментарии, альбомы с фото.
Для хранения в БД используется Doctrine.
Нужно спроектировать ленту активности.
Сейчас сделано так: при создании чего либо (коммента к фотке, коммента к записи пользователь, фотки,записи пользователя) , создаётся сущность ( AlbumImageCommentActivity, ArticleCommentActivity, AlbumImageActivity,ArticleActivity соответственно, унаследованная от базовой Activity). Всё бы ничего, но при выводе на страницу мешает приватность (а у комментариев её вообще нет) и на этапе выборки из БД я не могу отсеять те активности которые не доступные пользователю. Сейчас же отсеиваю уже после выборки (просто удаляю из массива, если не прошло проверку на доступность), здесь есть минус в том, что ломается пагинация (на каждой странице может быть разное кол-во элементов, а то и вообще не быть), но благо лента подгрузкой, как в ВК.
Возможно изначально я пошёл не потому пути.
Ваши предложения?
Да и вообще, как делается вывод сущностей разных классов в одном списке?
Есть сайт, соцсеть.
На сайте есть личные записи пользователей(записи личного блога), комментарии, альбомы с фото.
Для хранения в БД используется Doctrine.
Нужно спроектировать ленту активности.
Сейчас сделано так: при создании чего либо (коммента к фотке, коммента к записи пользователь, фотки,записи пользователя) , создаётся сущность ( AlbumImageCommentActivity, ArticleCommentActivity, AlbumImageActivity,ArticleActivity соответственно, унаследованная от базовой Activity). Всё бы ничего, но при выводе на страницу мешает приватность (а у комментариев её вообще нет) и на этапе выборки из БД я не могу отсеять те активности которые не доступные пользователю. Сейчас же отсеиваю уже после выборки (просто удаляю из массива, если не прошло проверку на доступность), здесь есть минус в том, что ломается пагинация (на каждой странице может быть разное кол-во элементов, а то и вообще не быть), но благо лента подгрузкой, как в ВК.
Возможно изначально я пошёл не потому пути.
Ваши предложения?
Да и вообще, как делается вывод сущностей разных классов в одном списке?
Re: Лента активности
так добавь необходимые метаданныеMelodic писал(а): ↑2017.05.10, 16:13 Всем привет!
Есть сайт, соцсеть.
На сайте есть личные записи пользователей(записи личного блога), комментарии, альбомы с фото.
Для хранения в БД используется Doctrine.
Нужно спроектировать ленту активности.
Сейчас сделано так: при создании чего либо (коммента к фотке, коммента к записи пользователь, фотки,записи пользователя) , создаётся сущность ( AlbumImageCommentActivity, ArticleCommentActivity, AlbumImageActivity,ArticleActivity соответственно, унаследованная от базовой Activity). Всё бы ничего, но при выводе на страницу мешает приватность (а у комментариев её вообще нет) и на этапе выборки из БД я не могу отсеять те активности которые не доступные пользователю
сущность одна - это событие. если речь о шаблоне для разных подсобытий, то switch/case тебя спасет
Re: Лента активности
user_id для Activity должен помочь.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Лента активности
Про ленту новостей соцсети каждый год рассказывает Дмитрий Бородин на разных конференциях: http://spb-borodin.livejournal.com/.
Нравится Yii? Давайте сделаем его лучше!.
Re: Лента активности
Кстати, точно такой же архитектурный косяк заложен в Humhub. Решается через подзапросы, запросы, запросы с user_id...чёрт ногу сломит.
P.S. Лента новостей чуть иное, чем лента активности.
P.S. Лента новостей чуть иное, чем лента активности.
Re: Лента активности
Мне кажется нужно это в очереди запихнуть, т.е. когда что-то происходит, то для всех пользователей, которым доступна изначальная сущность, создаётся запись: visible_for_user_id, main_enity_id, main_enity_name, data_activity...
Так мы через запросполучим ленту активности для любого пользователя без всяких напрягов. Если же есть проблема, как поступать когда то для какой-то сущности изменятся права доступа для конкретного пользователя, то обычным удалением(или через флаг) мы скрываем записи активности по полям main_enity_id, main_enity_name
Так мы через запрос
Код: Выделить всё
Select * from .. where visible_for_user_id = :?
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Лента активности
А если у звезды шоу-бизнеса миллион подписчиков? Создавать миллион записей?
Нравится Yii? Давайте сделаем его лучше!.
Re: Лента активности
ну а в противном случае наступает то, что описал ТС )
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Лента активности
Прикинул. В принципе, жизнеспособно на довольно долгое время даже с реляционной классической базой. Но я бы ввёл немного абстракции на тему хранилища. Вдруг проект стрельнёт...
Ну и ещё:
1. Придётся ограничить выдачу дней в 10.
2. Записи придётся чистить.
Ну и ещё:
1. Придётся ограничить выдачу дней в 10.
2. Записи придётся чистить.
Нравится Yii? Давайте сделаем его лучше!.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Лента активности
Хмм, а лента активности это не то что просто лог события что я сделал, который можно посмотреть открыть спец станицу моего профиля?
Т.е. я так понимаю что речь не о подписках вовсе.
Жду Yii 3!
Re: Лента активности
у ТС и в HumHub лента активности - это события, которые происходят с сущностями, к которым вы явно и неявно имеете отношение.
Например кто-то создал пост. Вы жмакнули на него лайк. Потом к этому посту кто-то написал коммент, кто-то лайкнул этот коммент.
Тут будут для вас лента активности:
- Кто-то написал коммент к посту, который вы лайкнули.
- Кто-то лайкнул коммент к посту, который вы лайкнули.
Ну и на подобии этого.
Грабли начинаются в случае: Вы состоите в группе, в этой группе кто-то выкладывает пост, который доступен одному, двум членам из этой группы. Ну и активность будет для вас следующая:
- Кто-то создал пост в группе, которой вы состоите (этого не должно быть, т.к. пост приватный)
- Кто-то лайкнул пост (зависит от 1)
- Кто-то прокомментировал пост (зависит от 1)
- Кто-то прикрепил файл к посту (завист от 1)
- Кто-то ещё что-то сделал с постом...
Т.е. надо для каждой такой активности вынимать первоначальную сущность и проверять есть ли на неё права, ладно бы если там user_id, но там может быть RBAC, система подписок, группы или подобное. Ладно для одной такой активности проверить, а если надо ленту получить, то будет то что описал ТС (пагинация летит, куча непонятных подзапросов, фильтрация после sql и боль поддержки....)
Например кто-то создал пост. Вы жмакнули на него лайк. Потом к этому посту кто-то написал коммент, кто-то лайкнул этот коммент.
Тут будут для вас лента активности:
- Кто-то написал коммент к посту, который вы лайкнули.
- Кто-то лайкнул коммент к посту, который вы лайкнули.
Ну и на подобии этого.
Грабли начинаются в случае: Вы состоите в группе, в этой группе кто-то выкладывает пост, который доступен одному, двум членам из этой группы. Ну и активность будет для вас следующая:
- Кто-то создал пост в группе, которой вы состоите (этого не должно быть, т.к. пост приватный)
- Кто-то лайкнул пост (зависит от 1)
- Кто-то прокомментировал пост (зависит от 1)
- Кто-то прикрепил файл к посту (завист от 1)
- Кто-то ещё что-то сделал с постом...
Т.е. надо для каждой такой активности вынимать первоначальную сущность и проверять есть ли на неё права, ладно бы если там user_id, но там может быть RBAC, система подписок, группы или подобное. Ладно для одной такой активности проверить, а если надо ленту получить, то будет то что описал ТС (пагинация летит, куча непонятных подзапросов, фильтрация после sql и боль поддержки....)
Re: Лента активности
Так как это дядьки делают? Как правильно и без боли сделать?yiijeka писал(а): ↑2017.06.13, 18:36 Т.е. надо для каждой такой активности вынимать первоначальную сущность и проверять есть ли на неё права, ладно бы если там user_id, но там может быть RBAC, система подписок, группы или подобное. Ладно для одной такой активности проверить, а если надо ленту получить, то будет то что описал ТС (пагинация летит, куча непонятных подзапросов, фильтрация после sql и боль поддержки....)
2b||!2b Just read the instructions
Re: Лента активности
Я не знаю как делают, но я столкнулся с такой же бедой и как решение мне видится это делать через очереди с созданием строчек:
user_id | activity_id
user_id | activity_id