Depois que você já conectou todas as tabelas do seu banco, chegou a hora de escrever uns queries. Mas só uns dois é coisa de iniciante, né? Você já tá ficando pro, então vai precisar escrever 50(!) queries pro seu banco de dados. E olha que são só os mais importantes.
Queries para o banco de dados
1. Listar produtos pra vitrine
Esse query retorna todos os produtos ativos com o preço principal e imagem pra mostrar na home e no catálogo. Assim dá pra montar a vitrine rapidinho e manter as infos dos produtos atualizadas.
2. Buscar produtos por palavra-chave
Permite que o usuário ache o produto que quer pelo nome ou descrição. É essencial pra busca rápida no catálogo.
3. Card do produto por ID
Retorna info detalhada de um produto específico, incluindo marca e categoria. Precisa disso pra mostrar a página do produto completa.
4. Lista de variantes do produto
Mostra todas as variantes (SKU) do produto: tamanhos, cores, estoque, preços. Usado pra escolher a modificação certa na página do produto.
5. Galeria de imagens do produto
Pra mostrar o card do produto completo, precisa de todas as fotos. O query retorna elas e indica qual é a principal.
6. Média de avaliação e número de reviews do produto
Usado pra mostrar a nota do produto e quantos reviews ele tem, o que é importante pra reputação e confiança dos clientes.
7. Lista detalhada de reviews do produto
Pra seção de reviews no card do produto: nota, texto, autor e data do review. Ajuda novos clientes a decidir se compram ou não.
8. Perguntas e respostas do produto
Query pra pegar perguntas e respostas de cada produto, essencial pro bloco de FAQ na página do produto.
9. Categorias de produtos com hierarquia
Permite visualizar a estrutura do catálogo, montar árvore de navegação pra filtros e menus.
10. Produtos por categoria e subcategorias
Ajuda a mostrar todos os produtos de uma categoria escolhida ou das "filhas" dela (nível de profundidade).
11. Lista de marcas
Pra filtrar por marca, criar listagem de marcas e landing pages.
12. Tags populares e quantidade de produtos
Analisa as tags mais usadas pra mostrar produtos em alta e montar nuvem de tags.
13. Histórico de mudança de preço do produto
Pra análise e mostrar a dinâmica de preços (preço antigo/novo, promoções).
14. Histórico de status do produto
Permite rastrear o ciclo de vida do produto, motivo de sumir da vitrine ou voltar.
15. Busca por certificados e licenças
Crítico pra compradores profissionais e B2B (qualidade e legalidade dos produtos).
16. Dados dos fornecedores do produto
Importante pra administração, controle de qualidade e contato com fornecedores.
17. Estoque do produto por armazém
Controle e conferência do estoque atualizado por armazém. Essencial pra logística e evitar "out of stock".
18. Produtos com estoque abaixo do limite
Automatiza reposição de estoque, evita perder venda por falta de produto.
19. Movimentação de produto no estoque (auditoria)
Rastreia todas as movimentações do produto num período: entradas, baixas e ajustes, importante pra inventário e evitar perdas.
20. Logística de transferências entre armazéns
Permite ver histórico e status das transferências internas de produto entre centros logísticos.
21. Entrega: métodos e tarifas
Pra calcular o frete e informar o usuário na hora do pedido.
22. Histórico de pedidos do usuário
Parte essencial do painel do usuário — todos os pedidos feitos, status e valor.
23. Detalhes do pedido com itens
Permite pegar toda a estrutura do pedido — itens, preços, quantidades — pra mostrar no front ou pro suporte.
24. Relatório de pedidos por período e status
Análise e relatório de vendas, retorna pedidos por período e status desejado (tipo "finalizado").
25. "Carrinhos abandonados"
Análise pra marketing: carrinhos que o usuário não finalizou — potencial pra retargeting.
26. Top vendas
Análise pro bloco "Mais vendidos" e seleções de marketing: quais produtos vendem mais.
27. Vendas por dia (pra gráficos)
Relatório de faturamento diário — base pra analisar a dinâmica do negócio e montar gráficos.
28. Lista de devoluções
Mostra devoluções de todos os pedidos com motivo e status, ajuda a analisar causas das devoluções.
29. Lista de cancelamentos de pedidos
Controle de perdas e motivos de cancelamento: mostra cancelamentos com motivo, quem cancelou e quando.
30. Pedidos aguardando envio
Pro estoque e entrega — pedidos que precisam ser separados e enviados, com detalhes da entrega.
31. Ticket médio
Métrica "Average Order Value" — chave pra avaliar marketing e mix de produtos.
32. Pedidos com uso de cupons
Análise da eficiência das promoções: quais cupons foram usados e com que frequência.
33. Uso de descontos por categoria e marca
Permite ver quais promoções funcionam e monitorar popularidade dos descontos por categoria e marca.
34. Cupons usados e seus usuários
Controle do uso de cupons, detectar anomalias e abusos.
35. Histórico de pagamentos do pedido
Pro suporte e contabilidade: mostra todas as transações de pagamento, status e métodos usados.
36. Pedidos com reembolso
Pra analisar devoluções, gerar relatórios contábeis e evitar fraude.
37. Saldo da carteira do usuário e histórico de transações
Controle e exibição de bônus ou cashback do usuário, histórico das movimentações.
38. Chamados do usuário no suporte
Permite ao usuário ver seus chamados e status de atendimento.
39. SLA-analytics dos chamados de suporte
Analisa tempo médio de resposta e solução por prioridade, importante pra controle de SLA.
40. Mensagens do chamado de suporte
Permite ver toda a conversa do chamado, importante pro usuário e pro suporte.
41. FAQs ativos por categoria
Mostra perguntas frequentes pra base de conhecimento do cliente, ajuda a aliviar o suporte.
42. Campanhas de marketing e banners ativos
Pra mostrar ofertas atuais no site.
43. Produtos em destaque na home
Pro bloco "Favoritos": produtos pra destacar na home.
44. Histórico de testes A/B
Análise dos experimentos feitos pra otimizar UX e marketing.
45. Histórico de visualizações de produto por usuário
Mostra "Você viu" ou serve pra recomendações personalizadas.
46. Buscas populares dos usuários
Análise da demanda dos usuários, ajuda a otimizar busca e sugestões.
47. Analytics das fontes de tráfego
Permite ver quais canais de anúncio trazem tráfego e conversão.
48. Retenção de usuários por cohort
Métrica chave pra avaliar lealdade e recompra.
49. Notícias/artigos pra home
Pra mostrar notícias e posts no blog, aumentar engajamento dos usuários.
50. Páginas ativas do site e blocos de conteúdo relacionados
Pra checar integridade do conteúdo do site, funcionamento do CMS e exibição dos dados nas páginas.
Adicionando índices
Query é bom, mas só se rodar rápido. Então você vai precisar adicionar uns índices no seu banco. Recomendo criar 40 índices nas tabelas principais do projeto pra deixar os queries mais rápidos e facilitar a manutenção.
1. Índice em product.product(status)
Quase todos os queries de produto filtram por status (tipo, produtos ativos pra vitrine, busca etc). O índice acelera a busca por status, evitando scan na tabela toda.
2. Índice em product.variant(product_id, is_active)
Queries de variantes (SKU) e vitrine usam filtro por produto e se a variante tá ativa. Esse índice composto deixa mais rápido pegar todas as variantes ativas de um produto.
3. Índice em product.image(product_id, is_main DESC)
Pra pegar a imagem principal do produto (ou todas), filtra por produto e ordena pelo campo “principal”. O índice acelera isso e garante resposta rápida pra galerias.
4. Índice em product.product(name text_pattern_ops)
Pra busca rápida por palavra-chave no nome usando ILIKE '%...%'. O índice especializado em name text_pattern_ops melhora busca por substring, principalmente em tabelas grandes.
5. Índice em product.product(description gin_trgm_ops)
Igual ao de cima — busca por descrição do produto (ILIKE ou full-text). Índice GIN com trigram acelera filtro em campos de texto.
6. Índice em product.product(category_id)
Frequentemente busca por categoria ou subcategorias (ver queries de filtro por categoria). O índice permite achar rápido todos os produtos da categoria.
7. Índice em product.category(parent_id)
Pra montar hierarquia de categorias e árvore de navegação, busca por parent_id. O índice acelera esses queries recursivos.
8. Índice em product.review(product_id)
Todos os acessos a reviews filtram por product_id (pra média e lista de reviews). O índice nesse campo deixa agregação e busca de reviews bem mais rápida.
9. Índice em product.review(product_id, created_at DESC)
Pra pegar os reviews mais recentes do produto (ORDER BY createdat DESC), especialmente junto com filtro por productid, o índice composto ajuda muito.
10. Índice em product.question(product_id, created_at DESC)
Query comum pra respostas de um produto, ordenando por data de criação. O índice cobre os dois e acelera o Q&A no card do produto.
11. Índice em product.answer(question_id, created_at)
Pra buscar respostas das perguntas do produto, acesso rápido por question_id, geralmente ordenando por data. Esse índice minimiza delay no Q&A.
12. Índice em product.price_history(variant_id, changed_at DESC)
Histórico de preço é puxado por variante e por mudanças recentes. Esse índice acelera queries analíticos de preço antigo/novo.
13. Índice em product.status_history(product_id, changed_at DESC)
Buscar histórico de status do produto ordenado por data é comum pra auditoria e ciclo de vida. Índice composto acelera muito esses queries.
14. Índice em product.certificate(product_id)
Buscar certificados do produto pelo id — operação típica pra B2B e vitrines certificadas. O índice acelera essas checagens.
15. Índice em product.license(product_id)
Pra buscar licenças dos produtos, especialmente queries filtrando por tipo de licença.
16. Índice em product.product_tag(tag_id)
Query comum — pegar todos os produtos de uma tag (e vice-versa). O índice cruza produtos e tags rápido pra nuvem de tags ou filtros.
17. Índice em product.product_tag(product_id)
Permite saber rápido quais tags estão ligadas a um produto, acelerando seleção por tag.
18. Índice em logistics.inventory(product_id, warehouse_id)
Pra acesso instantâneo ao estoque do produto no armazém (ou pra calcular em todos) — crítico pra logística, checar stock level e vitrine em tempo real.
19. Índice em logistics.inventory(variant_id)
Pra controle de estoque por variante (cor/tamanho) e relatórios cruzados.
20. Índice em logistics.stock_level(product_id, warehouse_id)
Checagem rápida do estoque mínimo do produto no armazém (tipo pra auto-pedido ou alerta de baixo estoque). Esse índice é pra comparar com inventory.
21. Índice em logistics.inventory_movement(product_id, changed_at DESC)
Permite pegar rápido o histórico de movimentação do produto (auditoria) nos últimos períodos — útil pra evitar erro, analisar perdas e controlar entregas.
22. Índice em logistics.transfer(product_id, requested_at DESC)
Pra analisar logística de transferências entre armazéns, filtrando por produto e ordenando por data do pedido.
23. Índice em logistics.shipping_rate(shipping_method_id, destination_zone)
Ao calcular frete, geralmente escolhe tarifa por id do método e zona de destino. O índice acelera o cálculo pro cliente na hora do pedido.
24. Índice em "order".order(user_id, placed_at DESC)
Todos os acessos ao histórico de pedidos do usuário filtram por user_id e ordenam por data. Índice composto garante resposta rápida pro painel do usuário.
25. Índice em "order".order(status, placed_at)
Pra análise e relatórios de pedidos por período, e busca por status (tipo "em processamento"/"finalizado").
26. Índice em "order".order_item(order_id)
Puxar todos os itens do pedido pelo id — uma das operações mais comuns pra detalhar pedidos.
27. Índice em "order".order_item(product_id)
Analytics de vendas e estatísticas por produto precisam de busca rápida dos itens do pedido pelo id do produto.
28. Índice em "order".return(order_id)
Ligação de devoluções com pedidos é usada pra suporte e análise de devoluções. O índice acelera busca de devoluções pelo número do pedido.
29. Índice em "order".cancellation(order_id)
Igual devoluções — acelera achar cancelamentos pra análise e suporte.
30. Índice em "order".cart(user_id, updated_at DESC)
Pra buscar os últimos carrinhos do usuário (tipo "carrinhos abandonados"), é bom ter índice por user_id e data da última atualização.
31. Índice em payment.payment_transaction(order_id)
A maioria dos queries de histórico de pagamento filtram por pedido. O índice garante acesso instantâneo às transações do pedido.
32. Índice em payment.refund(transaction_id)
Permite achar devoluções por transação pra suporte, relatório e controle de fraude.
33. Índice em payment.wallet(user_id)
Acesso rápido à carteira do usuário pra checar saldo e histórico de operações.
34. Índice em payment.wallet_transaction(wallet_id, created_at DESC)
Busca por transações da carteira do usuário ordenando por data (tipo mostrar histórico de operações).
35. Índice em support.support_ticket(user_id, created_at DESC)
Histórico de chamados do usuário no suporte (painel/serviço ao cliente). Índice composto otimiza essas buscas.
36. Índice em support.ticket_message(ticket_id, sent_at)
Pra mostrar toda a conversa do chamado, é bom ter índice por ticket e data — acelera ordenação das mensagens.
37. Índice em support.ticket_sla_tracking(ticket_id)
Pra SLA-analytics e controle por chamado, acesso rápido aos dados de SLA com índice por ticket_id.
38. Índice em marketing.promo_usage(user_id, used_at DESC)
Pra analisar uso de cupons pelos usuários (analytics e proteção contra abuso), precisa busca rápida por user_id e ordenação por data.
39. Índice em analytics.product_view(user_id, viewed_at DESC)
Guardar e analisar histórico de visualização de produtos pelo usuário (personalização, recomendações) precisa de acesso rápido por user_id e ordenação por data de visualização.
40. Índice em analytics.search_query_log(query_text)
Queries populares e frequência de uso — ferramenta chave de analytics de busca. O índice acelera agregações e contagem por texto da busca.
Observação
Pra buscas textuais com ILIKE, recomendo usar índices GIN com extensão pg_trgm, que são eficientes pra substring e fuzzy search. Pra tabelas grandes com agregação ou ordenação por data, recomendo índice DESC na data — acelera pegar os últimos registros.
Vale a pena ajustar os índices conforme os planos de execução reais e estatísticas de uso, mas os índices acima cobrem os principais cenários de queries do nosso marketplace.
Adicionando funções
Já cansou? Então bora escrever mais umas funções pra facilitar nossos queries atuais e futuros. Assim você acelera a implementação dos queries chave, evita código duplicado no app e centraliza a lógica de negócio no banco.
1. Buscar produtos por palavra-chave considerando tags e marcas
Pra que serve:
Busca só por nome e descrição é limitado. Muitas vezes precisa buscar também por tags e marcas. Uma função universal centraliza a lógica da busca avançada, reduz código duplicado e facilita integração com o front.
2. Pegar o card completo do produto por ID (todos os dados do card)
Pra que serve:
No front geralmente precisa de todas as infos do produto de uma vez: campos principais, marca, categoria, imagens, tags, atributos, média de avaliação e número de reviews. A função monta o card completo num só call, reduzindo queries no banco.
3. Pegar hierarquia de categorias com profundidade
Pra que serve:
Montar árvore (ou caminho) de categorias é necessário pra vitrine, filtros e breadcrumbs. Em vez de queries recursivos no client, a função retorna toda a hierarquia de uma vez.
4. Calcular preço médio e valor mínimo/máximo por categoria
Pra que serve:
Pra filtros no catálogo e analytics é bom pegar stats agregadas dos produtos da categoria: faixa de preço, média. A função evita subqueries repetidos.
5. Checar e calcular automaticamente o estoque do produto em todos os armazéns
Pra que serve:
Permite saber na hora o estoque total do produto (e de cada variante), útil pra vitrine, estoque e logística. Centraliza o cálculo, evitando lógica duplicada.
6. Pegar histórico de pedidos do usuário com detalhes
Pra que serve:
A função retorna a lista de pedidos do usuário, incluindo itens, valores, status, permitindo ao front pegar o histórico num call só e já montar o painel do usuário.
7. Pegar média de avaliação do usuário como vendedor/comprador
Pra que serve:
Pra mostrar confiança e reputação do usuário na plataforma, é importante saber a média de nota como vendedor ou comprador. A função faz o cálculo agregado.
8. Uso de cupom pelo usuário (validador com todas as regras)
Pra que serve:
Toda a lógica de checagem e uso do cupom (ativo, limites, data etc.) centralizada numa função. Isso simplifica o app e evita erro ao duplicar regras.
9. Função universal de log de eventos do usuário
Pra que serve:
Pra analytics e auditoria, log centralizado de eventos reduz código duplicado e risco de perder dados das ações dos usuários.
10. Função pra pegar saldo da carteira de bônus e total de créditos de todos os tempos
Pra que serve:
Um call só já pega saldo atual do usuário e total de créditos da carteira. Isso é prático pra mostrar no dashboard e reduz queries SQL.
11. Função universal pra trocar status do pedido com log
Pra que serve:
Muda o status do pedido, adiciona registro no log de status e minimiza erro ao mudar status em partes diferentes do app.
12. Pegar todas as mensagens do chamado de suporte (ticket + todas as mensagens)
Pra que serve:
A função retorna toda a conversa do chamado, incluindo detalhes do ticket e cada mensagem. Isso facilita montar o histórico do chamado no front.
13. Checar existência de usuário por email ou telefone
Pra que serve:
Usado pra cadastro e recuperação de senha, evita lógica duplicada no front e back.
Observação
Esse kit de funções cobre os cenários chave do negócio, deixa o trampo com dados mais prático, otimiza a lógica e acelera o desenvolvimento do front e integrações. Espero que tenha curtido :)
Ficheiros com a solução
GO TO FULL VERSION