2 votes

Je ne comprends pas GraphQL. Comment résoudre le problème du N+1 sans préchargement ?

Un quartier compte de nombreuses maisons. Chaque maison est la propriété d'une personne.

Disons que j'ai cette requête graphql :

{
    neighborhoods {
        homes {
            owner {
                name
            }
        }
    }
}

Je peux précharger les propriétaires, et cela fera de la requête de données une seule requête SQL. Bien.

Mais si je ne demande pas le propriétaire dans la requête graphql, les données seront toujours préchargées.

Et si je ne précharge pas, les données seront soit extraites à chaque requête, soit pas du tout puisque je ne charge pas l'association belongs_to dans le résolveur.

Je ne suis pas sûr qu'il s'agisse d'un problème résolu, ou simplement d'un point douloureux que l'on doit avaler quand on travaille avec graphql.

J'utilise Absinthe, DataLoader et Elixir au passage.

1voto

Daniel Rearden Points 8834

La plupart des implémentations GraphQL, y compris Absinthe, exposent une sorte de paramètre "info" qui contient des informations spécifiques au champ résolu et à la requête en cours d'exécution. Vous pouvez analyser cet objet pour déterminer quels champs ont été effectivement demandés et construire votre requête SQL en conséquence.

Voir cette question pour une discussion plus approfondie.

0voto

Maycon Seidel Points 161

Pour compléter ce qu'a dit Daniel Rearden, vous devez utiliser la fonction info.definition pour résoudre les inclusions imbriquées.

Dans mon application, j'ai défini un tableau de valeurs possibles comme :

defp relationships do
  [
    {:person, [tasks: [:items]]]}
    ...
   ]
end

alors j'ai une logique qui itère sur les info.definition et utilise cette fonction pour précharger les associations.

Vous utiliserez un DataLoader pour charger vos ressources paresseusement. Généralement pour récupérer des requêtes de tiers ou effectuer une requête complexe de base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X