DDD | JPA - вопрос дизайна, который может заключаться в жертве дизайна ради эффективности - PullRequest
0 голосов
/ 17 марта 2019

Я довольно новичок в DDD, но мне нравится, как дизайн навязывает структуру в вашем коде (если вы придерживаетесь принципов). У меня есть загадка, в которой я верю, что для решения проблемы мне нужно пожертвовать дизайном, чего я не хочу делать. Но прежде всего я хочу отметить, что, возможно, с самого начала я проектировал это неправильно из-за своего невежества.

У меня есть приложение, в котором есть объект, содержащий BLOB в терминологии базы данных. Давайте назовем эту сущность child. Следовательно, child имеет большой размер, поскольку содержит BLOB. Теперь, child можно найти из его идентификатора AR, назовем AR parent. Существует также еще один уровень выше (grandparent), но этот уровень не требуется, поскольку child содержит требуемые данные для передачи пользователю, а parent можно найти по запросу пользователя (некоторые сложные поиски требуется на стороне приложения для получения родителя, хотя).

Теперь, parent содержит множество child (отношение один-ко-многим), но мне нужен только один child на транзакцию, поэтому запрос всего результата parent и child на запрос определенно не нужен. Выполнение этого запроса для каждой транзакции также было бы невероятно неэффективным, поскольку я запрашиваю множество дополнительных данных из БД, которые я даже не использую в каждой транзакции. Это было бы экспоненциально более эффективно, например, хранить parent локально и выполнять запрос для одного child.

У меня также узкий SLA, поэтому получение child должно быть невероятно быстрым. Мой текущий подход грубой силы состоит в том, чтобы запросить parent, получить только один из child и предоставить результат пользователю. Я ищу подход, в котором я могу иметь parent локально, без списка child, затем, когда приходит запрос, я запрашиваю один child. Это было бы невероятно быстро и эффективно, так как я получаю только то, что мне нужно. Но это нарушило бы правила DDD, поскольку технически на child ссылается только личность parent, и он не будет собственным AR.

1 Ответ

0 голосов
/ 17 марта 2019

Я бы сделал эти шаги:

  1. Измените ParentRepository, чтобы загрузить родителя с его потомками и без их BLOB столбца. например @Query("select c.id, c.name from Child c where c.parentId = ?1")
  2. Ленивая загрузка столбца BLOB при необходимости.

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

...