Parte 4 — Datos: del SQL a mano al dominio limpio#
Cómo habla cada framework con la base de datos, qué te ahorra y qué te oculta hasta que duele.
Clases 51 a 65 · 15 en total · 15 construidas · 14 tecnologías en juego.
🧭 De qué va esta parte#
Quince clases sobre la frontera más discutida del oficio: entre el dominio y la base de datos.
El recorrido va del SQL escrito a mano —donde todo está a la vista y todo es responsabilidad tuya— hasta un dominio que no importa ninguna biblioteca de persistencia y se puede probar sin levantar nada. Por el camino, los dos patrones que se reparten el ecosistema —Active Record y Data Mapper—, el problema que más sistemas ha tumbado en producción —el N+1— y el momento en que conviene salir del ORM.
Aquí el elenco cambia: ya no son frameworks web, son ORM y constructores de consultas. Y la comparación gira sobre una propiedad que casi nadie nombra: si su API de consulta acepta SQL como cadena o no, porque de eso depende que la inyección sea posible o imposible por construcción.
🎒 Qué da por sabido#
- SQL básico: seleccionar, insertar, unir dos tablas.
- Las partes 1 a 3; en particular, que el contrato es el mismo para todas las implementaciones.
🎯 Qué sabrás hacer al terminarla#
- Conectar, consultar y escribir con cuatro ORM de cuatro ecosistemas, y reconocer qué patrón sigue cada uno.
- Detectar un N+1 midiendo cómo crece el número de consultas, no su valor absoluto.
- Elegir la frontera de una transacción y explicar qué se rompe si es demasiado estrecha o demasiado ancha.
- Escribir migraciones repetibles y semillas que no dupliquen al ejecutarse dos veces.
- Aislar el dominio detrás de un repositorio, y demostrarlo comprobando que no importa nada del ORM.
- Probar la lógica de negocio sin base de datos, y saber qué deja de comprobarse al hacerlo.
🧵 Por qué en este orden#
Las cuatro primeras son el mapa: conectar (051), SQL a mano (052) y los dos patrones que se reparten el terreno (053 y 054).
Las seis siguientes son lo que se rompe en producción: relaciones, N+1, transacciones, migraciones, semillas y el momento de salir del ORM.
Las cinco últimas son de operación y de diseño: el grupo de conexiones, la caché de lectura, lo no relacional, el repositorio y probar sin base.
📚 Las clases#
| # | Clase | Qué resuelve | Nivel | Estado |
|---|---|---|---|---|
| 051 | Conectar a una base de datos | Abrir una conexión y cerrarla bien. | 🟢 introductorio | ✅ Construida |
| 052 | SQL a mano | Escribir la consulta y leer el resultado sin capa intermedia. | 🟢 introductorio | ✅ Construida |
| 053 | Active Record | Dejar que el objeto sepa guardarse. | 🟡 intermedio | ✅ Construida |
| 054 | Data Mapper | Separar el dominio del almacenamiento. | 🟡 intermedio | ✅ Construida |
| 055 | Relaciones | Modelar uno a muchos y recorrerlo en los dos sentidos. | 🟡 intermedio | ✅ Construida |
| 056 | El problema N+1 | Reconocer la consulta que se multiplica y corregirla. | 🔴 avanzado | ✅ Construida |
| 057 | Transacciones | Agrupar operaciones para que ocurran todas o ninguna. | 🟡 intermedio | ✅ Construida |
| 058 | Migraciones | Cambiar el esquema con historia y sin pérdida. | 🟡 intermedio | ✅ Construida |
| 059 | Semillas y datos de prueba | Partir siempre del mismo estado conocido. | 🟢 introductorio | ✅ Construida |
| 060 | Cuándo salir del ORM | Reconocer la consulta que el mapeador no debe generar. | 🔴 avanzado | ✅ Construida |
| 061 | Grupo de conexiones | Entender el recurso escaso que hay detrás de cada consulta. | 🔴 avanzado | ✅ Construida |
| 062 | Caché de lectura | Evitar la consulta repetida y aceptar el coste de la invalidación. | 🔴 avanzado | ✅ Construida |
| 063 | Bases no relacionales | Modelar el mismo caso sin tablas y ver qué cambia. | 🟡 intermedio | ✅ Construida |
| 064 | Repositorio y dominio | Escribir reglas de negocio que no saben que hay base de datos. | 🔴 avanzado | ✅ Construida |
| 065 | Probar sin base de datos | Elegir entre doble, base en memoria y base real, sabiendo qué prueba cada uno. | 🔴 avanzado | ✅ Construida |
🎬 Las tecnologías que aparecen#
Entre paréntesis, en cuántas clases de esta parte interviene cada una. Estar aquí no es una recomendación: es que el problema de esa clase existe de verdad para esa tecnología.
| Ecosistema | Tecnologías |
|---|---|
| Python | SQLAlchemy (13), Django (1), FastAPI (1) |
| .NET | Entity Framework Core (10), ASP.NET Core (1), Dapper (1) |
| JavaScript/TypeScript | Prisma ORM (10), Drizzle ORM (2), TypeORM (2) |
| JVM | Hibernate ORM (12), Spring Boot (1) |
| Ruby | Active Record (Rails) (3) |
| PHP | Eloquent (Laravel) (2) |
| Node.js | Express (1) |
📖 Las palabras que esta parte define#
ORM · Active Record · Data Mapper · Problema N+1 · Carga perezosa · Carga anticipada · Transacción · Migración · Semilla · Grupo de conexiones · Repositorio
Todas, con su definición, en el glosario.
✅ Cómo se ejecuta una clase de esta parte#
node scripts/run-class.mjs 051El verificador arranca cada implementación, la somete a su contrato.json y declara cuáles omitió por no encontrar su cadena de herramientas. Si te faltan cadenas, node scripts/doctor.mjs dice cuáles y cómo se instalan.
➡️ Y después#
La parte 5 protege todo lo anterior: quién eres, qué puedes, y qué pasa cuando alguien intenta engañar al sistema.