Что такое проблема N+1

Ответ

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

Пример с React и GraphQL:

// Плохо: запрашиваем пользователей, затем отдельно их заказы
const { data: users } = useQuery(GET_USERS);
users.map(user => (
  <div key={user.id}>
    {user.name}
    <Orders userId={user.id} /> // Внутри Orders свой запрос GET_ORDERS
  </div>
));

Решение - загружать связанные данные одним запросом:

query GetUsersWithOrders {
  users {
    id
    name
    orders {
      id
      total
    }
  }
}

Проблема характерна для ORM, GraphQL, REST API. Оптимизировать можно через:

  • Жадную загрузку (eager loading)
  • Пакетные запросы
  • Даталоадеры (GraphQL)