Anidamiento dinámico en GraphQL: optimización de consultas SQL

Clase 22 de 24Curso de GraphQL con Node.js

Resumen

¿Qué es el anidamiento dinámico en GradQL?

GraphQL es un lenguaje de consulta que permite solicitar los datos de manera precisa, asegurando un menor coste en el rendimiento de los servidores. Una de las funcionalidades más interesantes es el anidamiento dinámico, que permite que una propiedad pueda ser directamente un resolver o tenga un comportamiento dinámico. Vamos a profundizar en cómo funciona esta característica con un ejemplo práctico y entender los beneficios que ofrece al crear queries en GradQL.

¿Cómo se obtiene una categoría desde una API REST?

Al trabajar con una API REST, normalmente se hace una solicitud a un determinado endpoint para obtener datos. Por ejemplo, para traer una categoría específica de productos, se obtiene no solo el nombre y el ID de la categoría, sino también los productos asociados a ella:

GET /api/v1/categories/1

Esto devuelve información como el nombre y el identificador de la categoría junto con las relaciones de los productos que pertenecen a dicha categoría.

Sin embargo, en GradQL, si se hace una request por una única categoría, aún no se especifica que se devuelvan los productos. Esto significa que, aunque el backend está preparado para retornar un array de productos, falta mapear esta relación en GradQL.

¿Cómo se implementa una nueva query en GradQL para obtener una categoría?

Primero, se debe crear una nueva query en el esquema de GradQL. Este query permitirá recibir un identificador y devolverá una categoría en específico. La implementación sería así:

  1. Crear una función que obtenga una categoría mediante su ID utilizando CategoryResolvers.
  2. Exportar este resolver y asociarlo en el archivo de resolvers, como se ejemplifica a continuación:
// Dentro de resolvers.js
const resolvers = {
  Query: {
    category: GetCategory,  // Asocia la query 'category' con el resolver GetCategory
  },
  // Otros resolvers
};
  1. Una vez implementado, se puede ir al playground de GraphQL y ejecutar la consulta para una categoría:
query {
  category(id: 1) {
    id
    name
  }
}

¿Cómo se puede extender la query para incluir productos?

Una vez obtenida la categoría básica, se puede extender para incluir productos como una lista opcional. El objetivo es evitar realizar peticiones costosas si no son necesarias. Para ello:

  • Añadir un campo products en el esquema de la categoría que retorne un array de tipo Product, asegurando que no haya valores nulos.
  • Crear un resolver que sea tratado dinámicamente cuando el campo products sea solicitado, realizando consultas solo en ese momento.

¿Cómo maneja GradQL de manera eficiente las consultas anidadas a productos?

En GradQL, es posible especificar que un campo de un objeto sea un propio resolver:

// Resolver para tratar el campo 'products' como un resolver independiente
const Category = {
  products: (parent) => {
    return productService.getProductsByCategory(parent.dataValues.id);
  },
};

Esto significa:

  • Dinámico y Condicional: La relación se resuelve solo si en la consulta se expresa explícitamente el campo products, evitando así unir datos innecesarios y ahorrar recursos.
  • Optimización de consultas: Al no exigir la unión de datos en la base de datos a menos que sea necesario, se minimizan operaciones costosas.

¿Por qué evitar uniones innecesarias en SQL?

Incluir uniones (left joins) innecesarias en SQL puede ser perjudicial para el rendimiento. Al tener relaciones dinámicas con GradQL, se puede decidir hacer consultas solo si es necesario basándose en la entrada directa del cliente, logrando optimizar el uso de recursos del servidor y mejorar la eficiencia general.

Conocer cómo usar estas ventajas de GradQL ayuda a crear aplicaciones más escalables y con mejor gestión de datos. Este enfoque es especialmente útil cuando se tienen varias relaciones de tablas a manejar, ya que permite controlar cuándo y cómo se realizan las consultas.

Aprender a manejar estas funcionalidades ofrece herramientas sólidas para mejorar la respuesta y eficiencia de tus servicios, y estoy seguro de que con práctica, dominarás estos conceptos con éxito.