powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Десериализация корня агрегата из нескольких связанных таблиц
2 сообщений из 2, страница 1 из 1
Десериализация корня агрегата из нескольких связанных таблиц
    #40030597
Bakuard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. Задача: найти общий подход(подходы) для решения типа задач соответствующих следующему примеру: имеется БД со следующей структурой
Имеется следующая структура классов, где класс Big - корень агрегации
Необходимо десереализовать все объекты Big отсортированные по полю value. Взаимодействие с БД осуществляется через JDBC. В чем возникла сложность: на данный момент пришел к данному подходу: 1. Чтобы избежать проблемы N + 1, десереализую объекты по типам начиная с "листьев" агрегата - сперва одним запросом десериализую объекты TinyA, а затем другим запросом десериализую все объекты TinyB. Все объекты одного типа помещается в отдельный HashMap, где ключами выступает id объектов. 2. Далее десериализую объекты Big. Походу десериализации каждого объекта Big я определяю с какими объектами типов TinyA и TinyB он связан и цепляю их к нему доставая из соответствующего HashMap. Я не могу определиться со вторым шагом - как лучше всего загружать корни агрегатов. На данный момент вижу два подхода 1. Пытаемся все загрузить одним запросом. Например
  • Код: plsql
    1.
    2.
    3.
    4.
    5.
    6.
  • SELECT Big.*, BigToTinyA.tinyAId, BigToTinyB.tinyBId
  • FROM Big
  • LEFT JOIN BigToTinyA ON BigToTinyA.bigId = Big.id
  • LEFT JOIN BigToTinyB ON BigToTinyB.bigId = Big.id
  • ORDER BY Big.value;
    • Плюсы на мой взгляд - всего один запрос.
    • Минусы на мой взгляд - число извлекаемых строк зависит от числа присоединяемых таблиц примерно следующим образом: N1 * N2 * ... * Nx, где N - число строк извлекаемых из соответствующей таблицы (не забываем, что мы получаем подмножество декартового произведения всех таблиц участвующих в таком запросе).
    2. Загружаем данные о связи агрегата с каждым типом включаемых объектов - по отдельности. Например
  • Код: plsql
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
  • SELECT Big.*, BigToTinyA.tinyAId
  • FROM Big
  • LEFT JOIN BigToTinyA ON BigToTinyA.bigId = Big.id
  • ORDER BY Big.value;
  • SELECT Big.*, BigToTinyB.tinyBId
  • FROM Big
  • LEFT JOIN BigToTinyB ON BigToTinyB.bigId = Big.id ORDER BY Big.value
      Плюсы на мой взгляд - число извлекаемых строк из всех запросов имеет линейную зависимость от числа присоединяемых таблиц минусы на мой взгляд - приходится делать по отдельному запросу для присоединения к агрегатам каждого включаемого типа.
    В чем нужна помощь: Жду любой критики своего подхода к решаемой задаче. Жду описания ваших подходов для решения поставленной задачи. P.s. варианты с использованием готовых реализаций ORM не рассматриваются.
    ...
    Рейтинг: 0 / 0
    Десериализация корня агрегата из нескольких связанных таблиц
        #40030599
    Bakuard
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Гость
    Схема БД
    [img=]
    ...
    Рейтинг: 0 / 0
    2 сообщений из 2, страница 1 из 1
    Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Десериализация корня агрегата из нескольких связанных таблиц
    Целевая тема:
    Создать новую тему:
    Автор:
    Закрыть
    Цитировать
    Найденые пользователи ...
    Разблокировать пользователей ...
    Читали форум (0):
    Пользователи онлайн (0):
    x
    x
    Закрыть


    Просмотр
    0 / 0
    Close
    Debug Console [Select Text]