惰性加载与积极加载
非官方测试版翻译
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
TypeORM 提供两种主要的数据关系加载方式:惰性加载(Lazy Loading)和积极加载(Eager 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 查询问题。
积极加载
积极加载在执行主查询时会自动获取所有关联数据。这种方式虽然方便,但如果存在过多复杂关联,则可能导致性能问题。
@Entity()
export class User {
@OneToMany(() => Post, (post) => post.user, { eager: true })
posts: Post[]
}
在这种情况下,一旦检索到用户数据,其关联的文章也会立即加载。
优势:
-
自动加载关联数据,无需额外查询即可轻松访问关联关系。
-
避免 n+1 查询问题:由于所有数据都在单次查询中获取,因此不会产生不必要的多次查询风险。
劣势:
-
一次性获取所有关联数据可能导致查询量过大,即使并非所有数据都是必需的。
-
不适合仅需部分关联数据的场景,因为这可能导致数据使用效率低下。
要了解如何配置和使用惰性加载与积极加载关系的更多细节和示例,请访问官方 TypeORM 文档:积极加载与惰性加载