|
23.12.2020, 18:37
#40030597
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
Доброго времени суток.
Задача: найти общий подход(подходы) для решения типа задач соответствующих следующему примеру:
имеется БД со следующей структурой
Имеется следующая структура классов, где класс Big - корень агрегации
Необходимо десереализовать все объекты Big отсортированные по полю value. Взаимодействие с БД осуществляется через JDBC.
В чем возникла сложность: на данный момент пришел к данному подходу:
1. Чтобы избежать проблемы N + 1, десереализую объекты по типам начиная с "листьев" агрегата - сперва одним запросом десериализую объекты TinyA, а затем другим запросом десериализую все объекты TinyB. Все объекты одного типа помещается в отдельный HashMap, где ключами выступает id объектов.
2. Далее десериализую объекты Big. Походу десериализации каждого объекта Big я определяю с какими объектами типов TinyA и TinyB он связан и цепляю их к нему доставая из соответствующего HashMap.
Я не могу определиться со вторым шагом - как лучше всего загружать корни агрегатов. На данный момент вижу два подхода
1. Пытаемся все загрузить одним запросом. Например
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. Загружаем данные о связи агрегата с каждым типом включаемых объектов - по отдельности. Например
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 не рассматриваются.
|
|
|