Sequelize vs Prisma
Início
Atualmente, na eBay, estou migrando nossas ferramentas internas do uso de MongoDB para Postgres. Um projeto que é muito difícil, mas que estou animado para enfrentar de cabeça. Enquanto pesquisava, determinei que, para nossa base de código, usar um ORM seria o melhor, já que a base de código já foi projetada para usar Mongoose. Mas agora o desafio é: qual ORM seria o melhor para nossa base de código? Neste blog, vou me aprofundar nessa questão. Por favor, observe que não posso divulgar tudo neste blog devido à natureza do meu contato com meu empregador.
Requisitos
Após uma análise cuidadosa das necessidades do projeto, estabeleci os seguintes critérios essenciais que qualquer solução de ORM precisaria satisfazer:
- Ser um pacote JavaScript; já que a maior parte do código é escrita em JavaScript
- Deve oferecer suporte ao Postgres e à maioria de seus recursos
- Seu desempenho deve ser pelo menos equivalente ou melhor que o do Mongoose
- Deve ser de código aberto e mantido
ORMs
Depois de fazer muita pesquisa, determinei que os três principais ORMs que atendem aos requisitos são: Sequelize, Prisma e TypeORM. No fim, decidi focar apenas em Sequelize e Prisma porque não tive tempo de testar completamente três ORMs diferentes devido aos prazos.
Ambiente de Teste
Para meu ambiente de teste, executei o Postgres por meio do Docker. Peguei nosso maior e mais complexo conjunto de dados, converti-o de uma estrutura de documento para uma estrutura de tabela e o adicionei à minha instância local do Postgres. Convertei o conjunto de dados usando colunas, relacionamentos um-para-um, relacionamentos um-para-muitos e algumas colunas JSONB.
A partir daí, eu escrevia código JavaScript que usava aquele ORM específico e media:
- Quanto tempo levaria para criar uma entrada
- Quanto tempo levaria para atualizar uma entrada
- Quanto tempo levaria para atualizar uma entrada aninhada (relacionamento e/ou chave-valor em um JSON)
- Quanto tempo levaria para excluir uma entrada
- Quanto tempo levaria para consultar/obter uma entrada
Criei repositórios para cada ambiente de teste de ORM. Eu adoraria compartilhar esses repositórios, mas eles são tecnicamente propriedade da eBay, então não posso compartilhá-los.
Resultados
Por volta de 15 de maio de 2023, decidi que o Sequelize era o melhor ORM para nosso caso de uso e que seria o ORM usado em nossa migração de MongoDB para Postgres. No fim, escolhi o Sequelize porque:
- Era “verdadeiramente de código aberto” e não mantido por uma startup financiada.
- Suportava a maioria dos recursos do Postgres.
- Tinha bom desempenho, especialmente em comparação com o Prisma.
- Tem boa documentação, embora não tão bem documentada quanto a documentação do Prisma.
Optei pelo Sequelize, mas também elaborei uma lista de prós e contras para cada ORM que testei, na esperança de que isso ajude as pessoas a determinar melhor se Sequelize ou Prisma funcionaria para o seu caso de uso.
Prós e Contras do Sequelize
Prós:
- Tem uma função sync() que cria e gerencia tabelas automaticamente para você
- Pode lidar com joins complexos (dados aninhados)
- Suporta muitas opções de filtragem (como Regex)
- A representação de modelo/esquema é feita em JavaScript puro usando classes, que são altamente personalizáveis.
- O Sequelize lida com conexões para o(s) banco(s) de dados selecionado(s).
- O Sequelize suporta múltiplas conexões de leitura
- Suporta consultas SQL brutas.
- Em 15 de maio de 2023:
- No NPM, o Sequelize foi atualizado pela última vez “há 14 dias” e recebe 1.505.835 downloads semanais.
- No GitHub, o Sequelize foi atualizado pela última vez “ontem”, tem 4,2 mil forks e 27,9 mil estrelas.
- O Sequelize tem licença MIT e é de código aberto há mais de 10 anos. Portanto, é muito provável que continue sendo de código aberto no futuro previsível.
Contras:
- A representação de modelo/esquema pode ficar muito complexa e inchada. Por exemplo, a representação em Mongoose do nosso grande conjunto de dados tinha cerca de 262 linhas (incluindo espaços). O mesmo conjunto de dados representado por meio do Sequelize tem 564 linhas (incluindo espaços).
- A sintaxe do Sequelize fica realmente confusa e complicada em certos casos.
- Migrar seu banco de dados (editá-lo) é muito incômodo. Você pode usar sequelize-cli para gerar scripts de modelo de migração em JavaScript. MAS isso parece ser o mesmo caso em quase todos os ORMs. Migrar em um banco de dados relacional não é fácil na maioria dos casos.
- A documentação não é tão boa. Melhorou, mas ainda precisa de trabalho. Mas com ferramentas como o ChatGPT, isso não é um problema tão grande quanto costumava ser, visto que o ChatGPT tem um entendimento muito bom sobre Sequelize, provavelmente devido ao fato de o Sequelize existir há uma década.
- O Sequelize não é tão sensível a tipos em comparação com o Prisma, o que poderia levar a problemas.
- Não oferece suporte a TypeScript de forma adequada, o que, para o meu projeto, não é um problema, mas para muitos outros projetos pode ser um grande problema.
Prós e Contras do Prisma
Prós:
- Tem sua própria linguagem de esquema. Isso significa que você pode criar seu esquema/modelo de forma mais fácil e limpa. Por exemplo, a representação em Mongoose do nosso grande conjunto de dados tinha cerca de 262 linhas (incluindo espaços). Mas o mesmo conjunto de dados representado pelo Prisma tinha apenas 221 linhas (incluindo espaços).
- O Prisma tem uma ferramenta CLI que facilita a criação e a migração (modificação) do seu banco de dados. O que é muito conveniente. Não é uma solução mágica, mas é a melhor coisa que já vi até agora em um ORM.
- Suporta consultas SQL brutas.
- O código do Prisma é limpo e simples. Ainda é preciso aprender e se familiarizar com a sintaxe do Prisma, mas é muito mais fácil de entender do que a sintaxe do Sequelize.
- O Prisma tem um cliente que gera automaticamente construtores de consultas para Node.js e TypeScript.
- A documentação é muito, muito boa e limpa. O ChatGPT ainda pode ajudar, mas não está tão atualizado sobre Prisma quanto está sobre Sequelize.
- Em 15 de maio de 2023:
- No NPM, o Prisma foi atualizado pela última vez “há 6 dias” e recebe 1.344.705 downloads semanais.
- No GitHub, o Prisma foi atualizado pela última vez “há 3 horas”, tem 1,1 mil forks e 31,3 mil estrelas.
Contras:
- Não oferece suporte a filtragem por Regex para Postgres, mas possui opções de filtro “contains”, “includes” e “startsWith”.
- Pelos meus testes, o Prisma é significativamente mais lento ao criar entradas do nosso grande conjunto de dados no Postgres. O Sequelize criou essas grandes entradas a uma taxa de cerca de 2,26 segundos por entrada (arquivo JSON). Já o Prisma teve uma taxa de cerca de 11,21 segundos por entrada (arquivo JSON). Com base nesses resultados, o Prisma é cerca de 5x mais lento que o Sequelize nessa tarefa.
- Além disso, excluir uma entrada do grande conjunto de dados resultou em um tempo de espera de quase 4 minutos, o que é muito, muito ruim.
- O Sequelize foi muito mais rápido ao excluir uma entrada no maior e mais complexo conjunto de dados em meus testes. O Sequelize não teve vantagem sobre o Prisma quando se tratou da construção do conjunto de dados. Ambos tiveram de lidar com um relacionamento profundo de três camadas para esse grande conjunto de dados, então eu diria que foi uma comparação justa.
- O Prisma é uma startup, o que significa que o Prisma é uma empresa com fins lucrativos e com US$ 56,5 milhões em financiamento. Sabendo disso, o principal código/pacote ORM do Prisma é de código aberto com licença Apache-2.0. Isso é bom, mas, como o Prisma tem investidores, eu não me surpreenderia se eles fizessem algo como o MongoDB em relação à licença.
Fontes
- https://www.bitovi.com/blog/battle-of-the-node.js-orms-objection-prisma-sequelize
- https://www.prisma.io/docs/orm/more/comparisons/prisma-and-sequelize
- https://github.com/prisma/prisma
- https://github.com/sequelize/sequelize
- https://www.youtube.com/watch?v=rLRIB6AF2Dg
- https://www.youtube.com/watch?v=RebA5J-rlwg
- https://www.youtube.com/watch?v=a5Wh_LDXtLc
- https://www.youtube.com/watch?v=4QN1BzxF8wM