GraphQL requêtes avec des tables de jointure
Je suis en train d'apprendre GraphQL
j'ai donc construit un petit projet. Disons que j'ai 2 modèles, User
et Comment
.
const Comment = Model.define('Comment', {
content: {
type: DataType.TEXT,
allowNull: false,
validate: {
notEmpty: true,
},
},
});
const User = Model.define('User', {
name: {
type: DataType.STRING,
allowNull: false,
validate: {
notEmpty: true,
},
},
phone: DataType.STRING,
picture: DataType.STRING,
});
Les relations sont 1:de nombreux, où un utilisateur peut avoir plusieurs commentaires.
J'ai construit le schéma comme ceci:
const UserType = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: {
type: GraphQLString
},
name: {
type: GraphQLString
},
phone: {
type: GraphQLString
},
comments: {
type: new GraphQLList(CommentType),
resolve: user => user.getComments()
}
})
});
Et la requête:
const user = {
type: UserType,
args: {
id: {
type: new GraphQLNonNull(GraphQLString)
}
},
resolve(_, {id}) => User.findById(id)
};
L'exécution de la requête d'un utilisateur et de ses commentaires est fait avec 1 demande, comme suit:
{
User(id:"1"){
Comments{
content
}
}
}
Que je comprends, le client devra obtenir les résultats à l'aide de 1 de la requête, c'est l'avantage à l'aide de GraphQL
. Mais le serveur va exécuter 2 requêtes, l'une pour l'utilisateur et un autre pour ses commentaires.
Ma question est, quelles sont les meilleures pratiques pour la construction de la GraphQL
schéma et les types et la combinaison de jointure entre les tables, de sorte que le serveur peut également exécuter la requête avec 1 demande?
Vous devez vous connecter pour publier un commentaire.
Le concept vous référant à un est appelé le traitement par lots. Il existe plusieurs bibliothèques qui offrent ce. Par exemple:
Dataloader: générique utilitaire maintenu par Facebook "fournit une API cohérente sur les différents backends et de réduire les demandes de ces backends via le traitement par lots et la mise en cache"
rejoignez-monstre: "Un GraphQL-à-requête SQL couche d'exécution pour le lot récupération de données."
À quiconque de l'utiliser .NET et le GraphQL pour .NET paquet, j'ai fait une extension de la méthode qui convertit le GraphQL Requête dans le Cadre de l'Entité Comprend.
Permet de dire que nous avons la requête suivante:
Nous pouvons créer une variable dans la section "résolution" de la méthode du champ:
qui génère la chaîne suivante:
et le transmettre à l'Entité Cadre: