Noções Básicas de Banco de Dados
8 exemplos para você começar com bancos de dados para backends Node.js - 6 básicos e 2 intermediários.
Busque em todas as páginas da documentação
8 exemplos para você começar com bancos de dados para backends Node.js - 6 básicos e 2 intermediários.
npm install pg
npm install -D typescript@5.6 tsx @types/pgPara ajuste de pool e trade-offs de ORM, veja node-postgres (pg) e Prisma.
| Necessidade | SQL (Postgres) | Documento (MongoDB) |
|---|---|---|
| Joins e restrições | Forte adequação | Mais fraco; incorporar ou $lookup |
| Evolução de esquema | Migrações | Campos flexíveis |
| Relatórios / BI | Ferramentas maduras | Pipelines de agregação |
| Transações ACID | Multi-linha nativo | Multi-documento desde 4.0 |
pg ou Drizzle/PrismaRelacionado: Driver MongoDB - padrões de documento
// src/config.ts
import { z } from "zod";
const env = z.object({
DATABASE_URL: z.string().url(),
}).parse(process.env);
export const databaseUrl = env.DATABASE_URL;DATABASE_URL: postgres://user:pass@host:5432/dbnamepg Mínimoimport pg from "pg";
const pool = new pg.Pool({
connectionString: process.env.DATABASE_URL,
max: 10,
idleTimeoutMillis: 30_000,
});
export async function getUser(id: string) {
const { rows } = await pool.query(
"SELECT id, email FROM users WHERE id = $1",
[id]
);
return rows[0] ?? null;
}$1, $2 - nunca concatenação de stringsmax deve corresponder às consultas concorrentes esperadas, não apenas ao número de CPUsRelacionado: Ajuste de Pool de Conexão - matemática de dimensionamento
import pg from "pg";
const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });
process.on("SIGTERM", async () => {
await pool.end();
process.exit(0);
});pool.end() espera que os clientes em uso retornemclose() do servidor HTTP em manipuladores de desligamento graciosoimport type pg from "pg";
export async function withTransaction<T>(
pool: pg.Pool,
fn: (client: pg.PoolClient) => Promise<T>
): Promise<T> {
const client = await pool.connect();
try {
await client.query("BEGIN");
const result = await fn(client);
await client.query("COMMIT");
return result;
} catch (err) {
await client.query("ROLLBACK");
throw err;
} finally {
client.release();
}
}BEGIN/COMMITimport type { Pool } from "pg";
export async function checkDatabase(pool: Pool): Promise<boolean> {
try {
await pool.query("SELECT 1");
return true;
} catch {
return false;
}
}totalCount e idleCount do pool em falhas repetidas// src/domain/user.ts
export type User = { id: string; email: string };
export interface UserRepository {
findById(id: string): Promise<User | null>;
create(email: string): Promise<User>;
}
// src/infrastructure/pg-user-repo.ts
import type { Pool } from "pg";
import type { User, UserRepository } from "../domain/user";
export function createPgUserRepo(pool: Pool): UserRepository {
return {
async findById(id) {
const { rows } = await pool.query(
"SELECT id, email FROM users WHERE id = $1",
[id]
);
return rows[0] ?? null;
},
async create(email) {
const { rows } = await pool.query(
"INSERT INTO users (email) VALUES ($1) RETURNING id, email",
[email]
);
return rows[0];
},
};
}Relacionado: Casos de Uso e Serviços - camada de orquestração
| Camada | pg bruto | Drizzle | Prisma |
|---|---|---|---|
| Controle | SQL Completo | Tipado com SQL primeiro | Com esquema primeiro |
| Migrações | flyway, dbmate, drizzle-kit | drizzle-kit | prisma migrate |
| Risco N+1 | Você controla joins | Você controla joins | Observe include |
| Curva de aprendizado | Baixa | Média | Média |
pg ou Drizzle com consultas brutasAmbos funcionam. Postgres lidera para JSONB, extensões e opções de nuvem gerenciada. Escolha o que sua equipe opera bem.
Não. pg mais arquivos SQL é válido. ORMs ajudam com migrações e inferência TypeScript ao custo de vazamentos de abstração.
Um por URL de banco de dados. Múltiplos pools para o mesmo DB desperdiçam conexões.
Use um pooler (PgBouncer, Neon, Supavisor). Veja Ajuste de Pool de Conexão.
Em CI/CD antes do deploy, nunca DDL manual em produção. Veja Boas Práticas de Banco de Dados.
Sim, via @nestjs/typeorm, módulo Prisma, ou provedor customizado encapsulando Pool.
Repositório em memória para testes unitários; Testcontainers Postgres para testes de integração.
Criar uma nova conexão por requisição em vez de usar pooling.
pg) - pool e transaçõesmax e PgBouncerVersões do Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5, e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026