“N+1 选择问题”通常在对象关系映射 (ORM) 讨论中被表述为一个问题,我知道这与必须对对象中看似简单的东西进行大量数据库查询有关世界。
有人对这个问题有更详细的解释吗?
假设您有一个Car对象集合(数据库行),并且每个对象Car都有一个Wheel对象集合(也是行)。换句话说,Car→Wheel是一对多的关系。
Car
Wheel
现在,假设您需要遍历所有汽车,并为每辆汽车打印出一个车轮列表。天真的 O/R 实现将执行以下操作:
SELECT * FROM Cars;
然后对于每个Car:
SELECT * FROM Wheel WHERE CarId = ?
换句话说,您有一个用于 Cars 的选择,然后有 N 个额外的选择,其中 N 是汽车的总数。
或者,可以获取所有轮子并在内存中执行查找:
SELECT * FROM Wheel
这将数据库的往返次数从 N+1 减少到 2。大多数 ORM 工具为您提供了几种防止 N+1 选择的方法。