Простейшая задача: Симфа, доктрина, пилим блог по DDD. Есть посты и они

на разных языках. Т.е. по-факту пост - это агрегат, который содержит в себе основную инфу + несколько переводов.

Внимание вопрос:
Если постов 100штук и нужен запрос «вывести все посты с их содержимым на рус языке»...
то в доктрине это будет один запрос на select from posts. И потом внутри каждого поста будет ещё +1 запрос на select translate where post_id = ?? (Итого +100 запросов)

Или есть какой-то более быстрый вариант с join?

28 ответов

18 просмотров

Не, джоин нельзя, не по ддд

Gambit- Автор вопроса
Gambit
«База вышла из чата» ☹️

После разума, который вышел после того, как ты задал свой вопрос

Gambit
«База вышла из чата» ☹️

Ну серьезно, при чем тут ддд и как достать посты? Ей богу, каждый раз одно и то же, где ваш мозг отдыхает, когда вы вопросы такие задаете?

Gambit- Автор вопроса
Сила в правде!
Ну серьезно, при чем тут ддд и как достать посты? ...

Так объясни, раз ты такой умный! Со сразу троллить?

Сила в правде!
Ну серьезно, при чем тут ддд и как достать посты? ...

Может вы ответите человеку? Не нужно быть таким токсичным чсв

Gambit- Автор вопроса

Ок. Допустим чтение без доктрины (например чистый Raw запрос на выходе которого массив) Тогда объясните 2 момента: 1) Ты когда делаешь поиск одного поста (чтение) то из базы тебе в итоге нужно получить объект, чтобы как-то с ним работать. (По DDD) Те нужно ручками писать маппер, который будет массив превращать в объект поста? 2) я делаю пост нескольких постов с рус переводом и джойном: мне в итоге теперь нужно работать с массивом неструктурированных данных (ибо не объекты) или опять писать ручками маппер на РАСШИРЕННЫЙ пост, содержащий в себе поле перевода?

Gambit
Так объясни, раз ты такой умный! Со сразу троллить...

Доктрина (орм) это про бизнес логику, инварианты. А бизнес логика и инварианты это когда ты пишешь в базу. Для чтения вся эта хуита не нужна. Сырой скл запрос вытягивающий данные в том виде в котором надо показать и всё

Gambit- Автор вопроса
Константин Грачев
Доктрина (орм) это про бизнес логику, инварианты. ...

Хорошо. А если это не блог с постами, а платёжи с ежемесячными подписками , транзакциями и бизнесс-логикой. Тогда что?

Gambit
Хорошо. А если это не блог с постами, а платёжи с ...

Запись отдельно, чтение отдельно. У чтения нет бизнес логики, потому что ничего не меняется

Gambit
Хорошо. А если это не блог с постами, а платёжи с ...

Откуда у тебя бизнес-логика при отображении списка?

Человек написал другую задачу. Нужно читать внимательно, прежде чем просить кого-то включить голову

Gambit- Автор вопроса
Шурик
Откуда у тебя бизнес-логика при отображении списка...

Я не говорил, что это отображение списка. Это может быть получение списка транзакций для осуществления рефанда или пересчета каких-то метрик и бухгалтерии. Бизнесс- логика это не только «получил от пользователя данные - обработал - сохранил» Это ещё и «получил данные - выгреб из базы другие - логически обработал - и сохранил результат» Так вот во втором случае - хорошо бы выгребать список объектов.

Gambit- Автор вопроса
Константин Грачев
А зачем тебе переводы в бизнес логике?

Я выше привёл другой пример с транзакциями.

Gambit- Автор вопроса
Константин Грачев
Опиши что за операцию ты сделать хочешь

В целом я хочу понять каким образом мне из базы вытащить объект или список объектов (аггрегатов) с его зависимостями , чтобы потом с ним работать и можно ли это сделать без сотни запросов в базу? DDD же подразумевает то, что может быть ситуация, когра у тебя есть какая-то коллекция аггрегатов, которую нужно обработать какой-то бизнесс-логикой. Если нужен конкретный пример то например есть список подписок (агрегатов) на какой-то условный youtube-premium и у этих подписок есть транзакции (успешные/неуспешные) и каждая из успешных транзакция продлевает подписку на месяц. И потом начинается всякая-разная бизнес-слогика связанная с тем, что нужно продлевать подписку какие-то транзакции не прошли и нужно подписку отменить. где-то пользователь пользовался примиумом и решил перейти на премиум+, но переход произошел неудачно и нужно откатить изменения на старый тариф с восстановлением дат транзакций и т.д. и этой логики может быть очень много... И все это упирается в то, что тебе из базы нужно получать массив ОБЪЕКТОВ аггрегатов и работать с ними. И я пока не вижу другого пути как получать список Root-классов аггрегата, а потом отдельными запросами получать их зависимости. Или делать RAWSQL джойны и потом маппить полученный массив колонок ручками на класс-аггрегата.

Gambit
В целом я хочу понять каким образом мне из базы вы...

Не очень понятно, зачем список нужен. На оплату у тебя должно быть событие ОплатаПолучена, с ид транзакции. Дальше подписчик ловит этот инвент, достает транзакцию по ид и делает свои штуки. Но кейс какой то странный, будто оплата взялась из пустоты

Gambit- Автор вопроса
Константин Грачев
Не очень понятно, зачем список нужен. На оплату у...

Хорошо, другой пример. Есть у тебя гуглдрайв и в нем есть папки (Foldes) и файлы (Files). и вот нужно тебе расшарить папку на другого юзера. Т.е. тебе нужно получить список файлов (Files) в этой папке и и каждому файлу добавить пользователя $file->addUser($user, $previleges) т.е файлы тебе нужно достать объектами. И в случае с DDD ты можешь сделать $folder->addUser($user, $previleges, $recursive = true) и юзер добавится и к папке и ко всем файлам (и даже подпапкам) внутри нее. Можно конечно сказать "пшло нна это ваше ооп" и сделать foreach { INSERT INTO file_users ($file_id, $user_id, {"access": "viewer"}) } но поддерживать такой код будет очень прикольно)))

Gambit
Хорошо, другой пример. Есть у тебя гуглдрайв и в н...

Допустим, а где тут джоины множественные? В кейсе с переводами, зачем в агрегате на добавление доступа юзеру информация о переводах?

Gambit- Автор вопроса
Константин Грачев
Допустим, а где тут джоины множественные? В кейсе...

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

Gambit
Не джойны множественные, а запросы множественные (...

У тебя база падает от нагрузки, или откуда проблема взялась?

Gambit- Автор вопроса
Константин Грачев
У тебя база падает от нагрузки, или откуда проблем...

Проблема в том, что те данные, которые я раньше мог получить джойном двух таблиц (или еще какими-то удобностями в БД) и одним запросом, теперь придется получать без джойнов и сотней запросов. НО видимо такова плата за использование ДДД и прочих абстраций. (типа баланс: минус одно удобство в БД - плюс одно удобство в ООП коде.) База пока не падает, но резкое увеличение запросов вряд ли положительно на нее повлияет...

Gambit
Проблема в том, что те данные, которые я раньше мо...

Надо глубже понимать что именно ты пытаешься сделать, на конкретном примере. Каждому кейсу своё решение, абстрактного решения тут нет. Но звучит, что ты что-то не так делаешь

Gambit- Автор вопроса
Константин Грачев
Надо глубже понимать что именно ты пытаешься сдела...

Хорошо. Т.е. если в случае с с постами и переводами мне нужно получить список всех постов на русском языке (например для обучения поиска), то нужно просто взять в PostService запилить метод, который через entityManager сделает сырой SQL запрос с джойном и вернет массив постов с русским контентом? Правильно?

Gambit
Хорошо. Т.е. если в случае с с постами и переводам...

Для обучения поиска можно как раз чистым склом запросить в том виде, в котором ты хочешь поиску это скормить

Константин Грачев
У тебя база падает от нагрузки, или откуда проблем...

На деве падать от 100 лишних запросов в бд не будет, а на проде с парой тысяч хттп-запросов на вход будет весело. Очень глупо ради ддд отказываться от преимуществ RDBMS

Константин Грачев
Доктрина (орм) это про бизнес логику, инварианты. ...

А потом работать с массивами данных после чтения?

Похожие вопросы

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Карта сайта