Суп лор, мучаюсь в попытках найти золотую середину в монге и микросервисах. Суть такая - где провести границу между nested записью/одним микросервисом и dbref/несколькими сервисами. Через слеш поскольку вещи в каком-то смысле связанные.
Warning: ниже много букв.
Упрощённый пример: веб-альбом. Владелец-юзер, директории, картинки, отзывы на них, метаданные с камеры на них. Картинка без директории не существует, хоть в корне но всё-таки. Мета и отзывы без картинок тоже в воздухе не висят.
Для простоты допустим что если все запихать в одну запись, то её размер заведомо сильно меньше 16мб (лимит монги), и даже меньше 4мб (лимит grpc). Также допустим что отзывы не связаны с другими юзерами.
С одной стороны все элементы связаны one-to-many в одно дерево, так что спокойно ложатся в одну nested запись и один сервис. Но тогда начинается геморрой с projection и тонной ручек на каждый чих, иначе для жирного юзера фронт будет получать мегабайты меты чтоб всего-то получить список директорий. Можно graphql, но тогда геморрой обратный - либо писать dataloader, либо тонна запросов в базу чтоб выдрать мету для N картинок. Ну и это все может очень вкусно лечь если сервисов таки больше одного, потому что им всем придется четко знать какие им нужны поля.
С другой стороны мешать юзера с картинками мягко говоря странно, это вообще разные сущности, и логичнее выглядит dbref и/или два сервиса. Но тогда логично вытащить все тоже отдельно в 5 плоских коллекции/сервисов, что начинает выглядеть все более странно с каждым шагом. Плюс это создаёт много радости когда пытаешься навесить на это чудо транзакции если сервисы разные. А отсутствие в монге нормального join только добавляет счастья. Да и вообще для монги это будет антипаттерн.
Можно скажем вытащить юзера, директорию, картинку с метой, и отзывы. Но тогда вопрос будет почему мета вместе с картинкой, а отзывы отдельно, так как они тоже вроде как без картинки не могут.
Если смотреть по числу вызовов, то юзера действительно вынести стоит, а вот с остальным сложнее, оно плюс-минус похоже и сильно зависит от фронта, включая его тип (мобильный/веб/всякие браузер-бары/чего там еще есть).
Если смотреть по количеству записей - картина аналогичная. Юзеров разумеется меньше всех, а вот сколько записей в мете и в отзывах сказать сложно, от тишины но срача в комментах. Да и директории бывают почти пустые, а бывают овер 9000 записей.
Короче пытаюсь это разрезать так чтоб красиво было, пока каменный цветочек не выходит. Поделитесь мыслями кто как видит решение
p.s. я не делаю веб-альбом, если что, но выглядит все довольно похоже