En aquest tema, explorarem diverses estratègies per recuperar dades en una aplicació GraphQL. La manera com recuperem les dades pot tenir un impacte significatiu en el rendiment i l'eficiència de la nostra aplicació. Aprendrem a utilitzar diferents tècniques per optimitzar la recuperació de dades i assegurar-nos que les nostres consultes siguin eficients.

Objectius d'aprenentatge

  • Comprendre les diferents estratègies de recuperació de dades.
  • Aprendre a implementar aquestes estratègies en un servidor GraphQL.
  • Optimitzar les consultes per millorar el rendiment.

Estratègies de recuperació de dades

  1. Recuperació directa

La recuperació directa és la manera més senzilla de recuperar dades. Consisteix a fer una consulta directa a la base de dades per obtenir les dades necessàries.

Exemple

const resolvers = {
  Query: {
    user: async (_, { id }, { dataSources }) => {
      return dataSources.userAPI.getUserById(id);
    },
  },
};

En aquest exemple, getUserById és una funció que fa una consulta directa a la base de dades per obtenir un usuari pel seu ID.

  1. Recuperació amb DataLoader

DataLoader és una eina que permet agrupar i emmagatzemar en memòria cau les consultes a la base de dades per millorar el rendiment. És especialment útil per evitar la recuperació redundant de dades.

Exemple

const DataLoader = require('dataloader');

const userLoader = new DataLoader(async (keys) => {
  const users = await getUsersByIds(keys);
  return keys.map((key) => users.find((user) => user.id === key));
});

const resolvers = {
  Query: {
    user: async (_, { id }) => {
      return userLoader.load(id);
    },
  },
};

En aquest exemple, userLoader agrupa les consultes per ID i les resol en una sola consulta a la base de dades.

  1. Recuperació amb paginació

La paginació és una tècnica per dividir les dades en pàgines més petites, la qual cosa permet recuperar només una part de les dades en cada consulta. Això és útil per gestionar grans volums de dades.

Exemple

const resolvers = {
  Query: {
    users: async (_, { page, limit }, { dataSources }) => {
      const offset = (page - 1) * limit;
      return dataSources.userAPI.getUsers({ offset, limit });
    },
  },
};

En aquest exemple, getUsers recupera un conjunt de dades limitat basat en la pàgina i el límit especificats.

  1. Recuperació amb filtratge

El filtratge permet recuperar només les dades que compleixen certs criteris. Això pot reduir la quantitat de dades recuperades i millorar el rendiment.

Exemple

const resolvers = {
  Query: {
    users: async (_, { filter }, { dataSources }) => {
      return dataSources.userAPI.getUsersByFilter(filter);
    },
  },
};

En aquest exemple, getUsersByFilter recupera només els usuaris que compleixen els criteris de filtratge especificats.

  1. Recuperació amb emmagatzematge en memòria cau

L'emmagatzematge en memòria cau permet guardar les dades recuperades per evitar consultes repetides a la base de dades. Això pot millorar significativament el rendiment.

Exemple

const cache = new Map();

const resolvers = {
  Query: {
    user: async (_, { id }, { dataSources }) => {
      if (cache.has(id)) {
        return cache.get(id);
      }
      const user = await dataSources.userAPI.getUserById(id);
      cache.set(id, user);
      return user;
    },
  },
};

En aquest exemple, les dades de l'usuari es guarden en memòria cau després de la primera consulta, evitant consultes repetides a la base de dades.

Exercicis pràctics

Exercici 1: Implementar DataLoader

Implementa DataLoader per agrupar les consultes d'usuaris en una sola consulta a la base de dades.

Solució

const DataLoader = require('dataloader');

const userLoader = new DataLoader(async (keys) => {
  const users = await getUsersByIds(keys);
  return keys.map((key) => users.find((user) => user.id === key));
});

const resolvers = {
  Query: {
    user: async (_, { id }) => {
      return userLoader.load(id);
    },
  },
};

Exercici 2: Implementar paginació

Implementa la paginació per recuperar usuaris en pàgines de 10 elements.

Solució

const resolvers = {
  Query: {
    users: async (_, { page = 1, limit = 10 }, { dataSources }) => {
      const offset = (page - 1) * limit;
      return dataSources.userAPI.getUsers({ offset, limit });
    },
  },
};

Resum

En aquesta secció, hem après diverses estratègies per recuperar dades en una aplicació GraphQL, incloent la recuperació directa, l'ús de DataLoader, la paginació, el filtratge i l'emmagatzematge en memòria cau. Aquestes tècniques ens ajuden a optimitzar les nostres consultes i millorar el rendiment de la nostra aplicació.

© Copyright 2024. Tots els drets reservats