Вы должны перестать думать в реляционной модели ;-) Мы делаем нечто подобное в нашем приложении.Храните список UID, которые «подписаны» на пользователя, за которым следуют в объекте следующего пользователя.Когда пользователь делает что-то, что требует уведомления, создайте объект события для каждого пользователя, который следует за пользователем (да, популярный пользователь может создать целую кучу записей, это может быть выгружено в очередь задач).
Когда пользователь проверяет уведомления, вы можете получить их по его UID.Поскольку это проиндексировано, оно вернется очень быстро.Когда вы извлекаете события, удаляете их или помечаете их как прочитанные.
Помните, что объединения и другие отфильтрованные запросы очень медленные, но выборка большого количества проиндексированных записей - нет.Если что-то собирается создать большое количество записей, выгрузите его в очередь задач.