Skip to content

Instantly share code, notes, and snippets.

@pLogicador
Created November 27, 2024 04:25
Show Gist options
  • Select an option

  • Save pLogicador/de95d5518b752875772e6bdc2956efc2 to your computer and use it in GitHub Desktop.

Select an option

Save pLogicador/de95d5518b752875772e6bdc2956efc2 to your computer and use it in GitHub Desktop.

Revisions

  1. pLogicador created this gist Nov 27, 2024.
    81 changes: 81 additions & 0 deletions Pagination.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,81 @@
    # Paginação em SQL e TypeORM
    ### Conceito
    Paginação é uma técnica usada para gerenciar grandes conjuntos de dados em um banco de dados, retornando apenas uma parte dos resultados por vez. Ela é essencial para melhorar o desempenho e a experiência do usuário em aplicações que lidam com grandes volumes de dados.

    ### Como funciona?
    - **LIMIT**: Define quantos itens serão exibidos por página.
    - **OFFSET**: Determina quantos itens serão "pulados" antes de começar a exibir os resultados.

    ### Benefícios
    1. **Desempenho**: Minimiza o impacto no banco de dados, retornando apenas os dados necessários.
    2. **Escalabilidade**: Evita sobrecarga de consultas em tabelas grandes.
    3. **Melhor UX**: Facilita a navegação em dados paginados, com respostas rápidas.

    ### Exemplo em SQL
    ````sql
    SELECT *
    FROM users
    ORDER BY created_at DESC
    LIMIT 10 OFFSET 20;
    ````
    - **`LIMIT 10`**: Mostra 10 registros.
    - **`OFFSET 20`**: Pula os 20 primeiros registros e exibe os próximos 10.
    -


    ## Exemplo com TypeORM
    ### DTO para Paginação
    ````typescript
    import { IsInt, IsOptional, Min } from 'class-validator';

    export class PaginationDto {
    @IsOptional()
    @IsInt()
    @Min(1)
    take?: number; // Quantos itens exibir por página (LIMIT)

    @IsOptional()
    @IsInt()
    @Min(0)
    skip?: number; // Quantos itens pular (OFFSET)
    }
    ````
    ### Service com Paginação
    ````typescript
    import { Injectable } from '@nestjs/common';
    import { Repository } from 'typeorm';
    import { InjectRepository } from '@nestjs/typeorm';
    import { PaginationDto } from './dto/pagination.dto';
    import { Product } from './entities/product.entity';

    @Injectable()
    export class ProductsService {
    constructor(
    @InjectRepository(Product)
    private readonly productRepository: Repository<Product>,
    ) {}

    async findAll(paginationDto: PaginationDto) {
    const { take = 10, skip = 0 } = paginationDto; // Valores padrão

    const [results, total] = await this.productRepository.findAndCount({
    take,
    skip,
    order: { name: 'ASC' }, // Ordenação
    });

    return {
    data: results,
    total,
    totalPages: Math.ceil(total / take),
    currentPage: Math.floor(skip / take) + 1,
    };
    }
    }
    ````

    ### Explicação
    - **`findAndCount`**: Retorna os dados e a contagem total de itens da consulta.
    - **Paginação simplificada**: O DTO encapsula as regras de validação e facilita o uso.
    - **Desempenho**: Garante que o banco de dados processe apenas o necessário para cada página.
    -