Conceptos Básicos de Bases de Datos
8 ejemplos para empezar con bases de datos para backends de Node.js - 6 básicos y 2 intermedios.
Busca en todas las páginas de la documentación
8 ejemplos para empezar con bases de datos para backends de Node.js - 6 básicos y 2 intermedios.
npm install pg
npm install -D typescript@5.6 tsx @types/pgPara la optimización de pools y las compensaciones de ORM, consulta node-postgres (pg) y Prisma.
| Necesidad | SQL (Postgres) | Documento (MongoDB) |
|---|---|---|
| Joins y restricciones | Muy adecuado | Más débil; incrustar o $lookup |
| Evolución del esquema | Migraciones | Campos flexibles |
| Informes / BI | Herramientas maduras | Pipelines de agregación |
| Transacciones ACID | Multi-fila nativo | Multi-documento desde 4.0 |
pg o Drizzle/Prisma por defectoRelacionado: Controlador de MongoDB - patrones de documentos
// 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://usuario:contraseña@host:5432/nombre_dbpg 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 concatenes cadenasmax debe coincidir con las consultas concurrentes esperadas, no solo con el número de CPURelacionado: Optimización de Pool de Conexiones - cálculos de tamaño
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 a que los clientes prestados regresenclose() del servidor HTTP en manejadores de apagado eleganteimport 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 del pool en caso de fallos repetidos// 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 y Servicios - capa de orquestación
| Capa | pg puro | Drizzle | Prisma |
|---|---|---|---|
| Control | SQL completo | Tipado SQL-first | Schema-first |
| Migraciones | flyway, dbmate, drizzle-kit | drizzle-kit | prisma migrate |
| Riesgo N+1 | Tú controlas los joins | Tú controlas los joins | Cuidado con include |
| Curva de aprendizaje | Baja | Media | Media |
pg o Drizzle con consultas purasAmbos funcionan. Postgres destaca por JSONB, extensiones y opciones de nube gestionada. Elige lo que tu equipo opere bien.
No. pg más archivos SQL es válido. Los ORM ayudan con las migraciones y la inferencia de TypeScript a costa de fugas de abstracción.
Uno por URL de base de datos. Múltiples pools a la misma DB desperdician conexiones.
Usa un pooler (PgBouncer, Neon, Supavisor). Consulta Optimización de Pool de Conexiones.
En CI/CD antes del despliegue, nunca DDL manual en producción. Consulta Mejores Prácticas de Bases de Datos.
Sí, a través de @nestjs/typeorm, el módulo Prisma o un proveedor personalizado que envuelva Pool.
Repositorio en memoria para pruebas unitarias; Testcontainers Postgres para pruebas de integración.
Crear una nueva conexión por solicitud en lugar de usar un pool.
pg) - pool y transaccionesmax y PgBouncerVersiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS Activo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026