Перейти к основному содержанию

Отложенная и жадная загрузка

Неофициальный Бета-перевод

Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →

TypeORM предоставляет два основных метода загрузки связей: Lazy Loading (отложенная) и Eager Loading (жадная). Каждый по-разному влияет на производительность приложения.

Lazy Loading (отложенная загрузка)

Отложенная загрузка подгружает данные связей только при необходимости, снижая нагрузку на базу данных, когда полные связанные данные требуются не всегда.

@Entity()
export class User {
@OneToMany(() => Post, (post) => post.user, { lazy: true })
posts: Promise<Post[]>
}

Для получения данных достаточно вызвать

const user = await userRepository.findOne(userId)
const posts = await user.posts

Преимущества:

  • Эффективное использование ресурсов: Загружает только необходимые данные по требованию, снижая стоимость запросов и расход памяти.

  • Идеально для выборочного использования: Оптимально для сценариев, где не нужны все связанные данные.

Недостатки:

  • Усложнение запросов: Каждый доступ к связанным данным генерирует дополнительный запрос к БД, что может увеличить задержки при неправильном управлении.

  • Сложность отслеживания: При неосторожном использовании может привести к проблеме n+1 запросов.

Eager Loading (жадная загрузка)

Жадная загрузка автоматически получает все связанные данные при выполнении основного запроса. Это удобно, но может вызвать проблемы производительности при большом количестве сложных связей.

@Entity()
export class User {
@OneToMany(() => Post, (post) => post.user, { eager: true })
posts: Post[]
}

В этом случае посты загрузятся сразу при получении данных пользователя.

Преимущества:

  • Автоматическая загрузка связей: Упрощает доступ к связанным данным без дополнительных запросов.

  • Исключает проблему n+1 запросов: Все данные извлекаются одним запросом, исключая риск генерации лишних запросов.

Недостатки:

  • Загрузка всех связанных данных может создавать ресурсоёмкие запросы, даже если часть данных не используется.

  • Неэффективно для сценариев выборочного доступа: Приводит к неоптимальному использованию данных, когда требуется только подмножество.

Подробные примеры настройки и использования отложенных и жадных связей смотрите в официальной документации TypeORM: Жадные и отложенные связи