DataLoader je skvělý nástroj, který opravdu pomáhá vyřešit N+1 problém v GraphQL. Funguje tak, že shromažďuje všechny požadavky na data a pak je posílá hromadně, místo aby posílal jednotlivé požadavky pro každý záznam. Takže místo toho, abys udělal N dotazů na databázi pro N položek, uděláš jeden dotaz, který vrátí všechna potřebná data najednou.
Příklad: máš dotaz na uživatele a každý uživatel má přiřazené příspěvky. Pokud uděláš dotaz na všechny uživatele a pak pro každý z nich dotážeš jejich příspěvky, dostaneš N+1 požadavků. S DataLoaderem můžeš načíst všechny příspěvky pro všechny uživatele najednou, což výrazně zrychlí odpovědi.
Implementace je celkem jednoduchá. Nejprve si nainstaluj DataLoader (npm install dataloader) a pak vytvoř instance DataLoaderu v tvém resolveru. Např.:
const userLoader = new DataLoader(async (userIds) =\> \{
const users = await getUsersByIds(userIds);
return userIds.map(id =\> users.find(user =\> user.id === id));
\});
Pak, když potřebuješ načíst uživatele, použiješ userLoader.load(userId)
místo klasického načítání.
Nejlepší praxí je používat DataLoader na úrovni resolverů a nezapomínat na to, že bys ho měl resetovat na začátku každého API volání, aby se vyčistily staré cache.
Situace, kdy by ses měl vyhnout DataLoaderu, jsou třeba velmi jednoduché dotazy bez relací nebo pokud pracuješ s velkým množstvím dat, kde by ti hromadné dotazy mohly spíš uškodit kvůli přetížení databáze.
Doporučuji mrknout na oficiální dokumentaci DataLoaderu a pár článků o optimalizacích GraphQL API. Je to fakt užitečný nástroj!