Sequelize vs Prisma
Início
Atualmente na eBay, estou migrando nossas ferramentas internas de MongoDB para Postgres. Um projeto que é muito difícil, mas estou animado para enfrentar. Durante a pesquisa, determinei que para nosso 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, note 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 ORM precisaria satisfazer:
- Ser um pacote JavaScript; já que a maior parte do código é escrita em JavaScript
- Deve suportar Postgres e a maioria de suas funcionalidades
- Seu desempenho deve ser pelo menos equivalente ou melhor que o do Mongoose
- Deve ser de código aberto e mantido
ORMs
Após fazer muita pesquisa, determinei que os três principais ORMs que atendem aos requisitos são: Sequelize, Prisma e TypeORM. Acabei decidindo focar apenas no Sequelize e no Prisma porque não tinha tempo para testar completamente três ORMs diferentes devido aos prazos.
Ambiente de Teste
Para meu ambiente de teste, executei o Postgres através do Docker. Peguei nosso maior e mais complexo conjunto de dados, converti-o de uma estrutura de documento para uma estrutura de tabela e adicionei-o à 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 escreveria código JavaScript que usasse aquele ORM específico e mediria:
- 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 deletar 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 de 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 para nossa migração de MongoDB para Postgres. No final, escolhi o Sequelize porque:
- Era “verdadeiramente de código aberto” e não mantido por uma startup financiada.
- Suportava a maioria das funcionalidades do Postgres.
- Tinha um bom desempenho, especialmente em comparação com o Prisma.
- Tem uma boa documentação, embora não tão bem documentada quanto a documentação do Prisma.
Decidi pelo Sequelize, mas também contratei 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 o Sequelize ou o Prisma funcionariam para 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 gerencia conexões para seu(s) banco(s) de dados selecionado(s).
- O Sequelize suporta múltiplas conexões de leitura
- Suporta consultas SQL brutas.
- A partir de 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,2k Forks e 27,9k Estrelas.
- O Sequelize tem uma licença MIT e está em código aberto há mais de 10 anos. Portanto, é muito provável que continue em código aberto no futuro previsível.
Contras:
- A representação de modelo/esquema pode se tornar muito complexa e inchada. Por exemplo, a representação do Mongoose do nosso grande conjunto de dados tinha cerca de 262 linhas (incluindo espaços). O mesmo conjunto de dados representado através do Sequelize tem 564 linhas (incluindo espaços).
- A sintaxe do Sequelize se torna 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 template 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 como costumava ser, já que o ChatGPT tem uma compreensão muito boa do Sequelize, provavelmente devido ao Sequelize existir há uma década.
- O Sequelize não é tão sensível a tipos em comparação com o Prisma, o que pode levar a problemas.
- Não suporta bem o TypeScript, o que para 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 do 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 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 vi até agora de um ORM.
- Suporta consultas SQL brutas.
- O código do Prisma é limpo e simples. Você ainda precisa 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 o Prisma quanto está sobre o Sequelize.
- A partir de 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,1k Forks e 31,3k Estrelas.
Contras:
- Não suporta filtragem Regex para Postgres, mas tem opções de filtragem “contains”, “includes” e “startsWith”.
- Com base nos meus testes, o Prisma é significativamente mais lento ao criar as 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). Enquanto 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, deletar 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 deletar 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 que lidar com um relacionamento de três camadas de profundidade 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 com $56,5 milhões em financiamento. Sabendo disso, o código/pacote principal do ORM do Prisma é de código aberto com uma licença Apache-2.0. Isso é bom, mas como o Prisma tem investidores, eu não ficaria surpreso se eles fizessem algo semelhante ao MongoDB em relação à sua 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