Проблема N + 1 в GraphQL - це класичне запитання в контексті розмови про дизайн GraphQL API або порівнянні його з REST. Вона виникає, коли один GraphQL запит призводить до великої кількості дрібних запитів до бази даних.
Розберемо простий приклад з інтернет магазином. Ми робимо запит на отримання продуктів і хочемо отримати коментарі до них. Якщо б ми використовували REST API, то могли зробити JOIN на рівні ORM і витягнути всі дані одним запитом. Але в GraphQL ми витягнемо всі продукти одним запитом і після того почнемо викликати Resolvers окремо для кожного продукту.
Для кожного продукту буде запущений окремий SQL запит. Якщо в нас 100 продуктів, то буде запущено 100 додаткових запитів в базу даних, які витягнуть коментарі для кожного окремого продукту.
Як вирішити цю проблему?
Вирішується вона доволі просто, за допомогою DataLoader, основна задача якого - Batching. В нашому випадку DataLoader буде збирати всі product ids в один масив і викликати функцію, яка витягне коментарі більш оптимізовано. Наприклад, замість 100 запитів в базу даних ми можемо отримати все за один запит, використовуючи WHERE IN([…productIds]).