Estratégias de abstração de banco de dados com NodeJS

Node JS

Estratégias de abstração de banco de dados com NodeJS

Quando vamos desenvolver uma aplicação, uma parte muito importante é o tipo de abstração de banco de dados que iremos usar em nosso projeto. E independente da linguagem nós normalmente temos 3 tipos de abordagens para esse problema, nós podemos usar um driver nativo para lidar com o banco de dados, usar query builder ou usar um ORM (Object Relational Mapping). Vamos falar um pouco sobre os 3 tipos e dar alguns exemplos de uso com NodeJS.

Driver Nativo

O driver nativo de um banco de dados é o método mais próximo ao banco de dados. Nele você conecta ao banco de dados, escreve as suas queries SQL em uma string e manda executar no banco de dados. O seu funcionamento é simples e um exemplo de driver para node e o PG (node-postgres)

const { Client } = require('pg')
const client = new Client()
await client.connect()
const res = await client.query('SELECT $1::text as message', ['Hello world!'])
console.log(res.rows[0].message) // Hello world!
await client.end()

Query Builder

Query Builder está um nível acima do driver nativo, a sua principal característica é que nele você constrói suas queries com javascript de uma forma mais automatizada e desse jeito melhora um pouco a experiência de desenvolvimento.

Uma grande vantagem em relação ao driver nativo e que as diferenças de sintaxe entre um banco e outro é tratado de forma que a troca de um banco por outro é feita com facilidade, fazendo pouco ou nenhuma alteração no código.O Knex e uma das bibliotecas de NodeJS mais usadas, abaixo um exemplo de código com ela.

knex.select('title', 'author', 'year').from('books')

ORM

Object Relational Mapping, como o próprio nome diz, nós vamos mapear registros da nossa tabela de banco de dados com objetos no javascript, nós vamos criar modelos no javascript e sempre criamos uma instância desses modelos eles irão refletir no banco de dados. Sendo esse o nível mais alto de abstração. Para nodeJs um dos mais famosos e o Sequelize que é muito usado com javascript e para typescript tem o TypeORM, abaixo um exemplo no typeORM.

const repository = connection.getRepository(User);

const user = new User();
user.firstName = "Timber";
user.lastName = "Saw";
user.age = 25;
await repository.save(user);

const allUsers = await repository.find();
const firstUser = await repository.findOne(1); // find by id
const timber = await repository.findOne({ firstName: "Timber", lastName: "Saw" });

await repository.remove(timber);

Mas qual usar?

Isso depende muito do tipo de aplicação que você vai construir, driver nativo apesar de ser um pouco mais trabalhoso quando você for escrever suas queries ele é mais rápido, já o query builder ou ORM, deixam o desenvolvimento mais confortável. Apesar disso, tanto o Knex quanto o Sequelize ou TypeORM utilizam por trás drivers nativos para acesso ao banco e normalmente os ORMs utilizam o Sequelize para a montagem das queries.

Uma coisa que deve ser dita é que a facilidade de um ORM às vezes cobra um preço que é a performance, pois uma query gerada pela biblioteca pode não ser tão eficiente quanto uma feita manualmente.

Espero que este post tenha sido útil para você e se gostou compartilhe com seus amigos e não deixe de acessar outros conteúdos do blog.

Explore mais