Есть похожие вопросы к этому, но я не думаю, что кто-то задал этот конкретный вопрос.
Сценарий:
Клиент - Заказ (где Заказ имеет идентификатор клиента) - OrderPart - Part
Мне нужен запрос, который возвращает клиента со всеми его порядками и каждым заказом с его частями.
Теперь у меня есть два основных варианта:
- Используйте вложенный цикл (который создает отдельные запросы)
- Используйте параметры загрузки данных (которые создают одно соединение для запроса)
Вопрос:
Большинство советов и примеров ORM предлагают использовать вариант 2, и я могу понять, почему. Однако вариант 2 потенциально может отсылать огромное количество дублированных данных, например:
Результаты Варианта 1 (3 запроса):
ID Name Country 1 Customer1 UK ID Name 1 Order1 2 Order2 ID Name 1 Part1 2 Part2 3 Part3
Результаты второго варианта (1 запрос):
ID Name Country ID Name ID Name 1 Customer1 UK 1 Order1 1 Part1 1 Customer1 UK 1 Order1 2 Part2 1 Customer1 UK 1 Order1 3 Part3 1 Customer1 UK 2 Order2 1 Part1 1 Customer1 UK 2 Order2 2 Part2
Вариант 1 отправляет обратно 13 полей с 3 запросами. Вариант 2 отправляет обратно 42 поля в 1 запрос. Теперь представьте, что таблица Customer имеет 30 полей, а Orders имеет более сложные подзаголовки, дублирование данных может быстро стать огромным.
Какое влияние на общую производительность оказывают следующие вещи:
- Накладные расходы на подключение к базе данных
- Время отправки данных (потенциально через сеть, если на другом сервере)
- Bandwidth
Является ли вариант 2 всегда лучшим выбором, вариант 1 - лучший выбор или это зависит от ситуации? Если это зависит от того, какие критерии следует использовать для определения? Являются ли какие-либо ОРМ достаточно умными, чтобы справиться с этим самим?