ADR-003: Base de Datos — Amazon Aurora PostgreSQL-Compatible Edition
Date: 2026-07-25 Status: Accepted
Context
El cliente pidió explícitamente "la más rápida, con la mejor confiabilidad y administración", abierto a cualquier opción (MySQL incluido) más allá de lo obvio. El backend (Laravel, ver ADR-002) va a correr en AWS, así que la comparación relevante no es "MySQL vs PostgreSQL" en abstracto, sino qué motor rinde mejor dentro de AWS específicamente.
Decision
Amazon Aurora — edición compatible con PostgreSQL para staging y producción.
En desarrollo local (docker-compose), se usa PostgreSQL estándar (no Aurora — Aurora es un servicio gestionado de AWS, no se puede correr en Docker local). Como Aurora es wire-compatible con PostgreSQL, el mismo driver pgsql de Laravel funciona sin cambios de código entre dev (Postgres local) y staging/producción (Aurora) — solo cambia el host en .env.
Rationale
¿Por qué Aurora y no RDS PostgreSQL/MySQL "normal"? Aurora separa el storage del compute y lo replica automáticamente 6 veces a través de 3 zonas de disponibilidad, con auto-scaling de storage hasta 128 TiB sin downtime, hasta 15 read replicas de baja latencia, backups continuos a S3, y recovery a un punto en el tiempo — todo administrado, sin que el equipo tenga que operar réplicas o backups a mano. En throughput, Aurora rinde hasta 5x más que MySQL estándar y hasta 3x más que PostgreSQL estándar corriendo en la misma clase de instancia. Esto cubre los tres pedidos del cliente al mismo tiempo: velocidad, confiabilidad (failover automático, multi-AZ) y administración (gestionado, sin ops manual).
¿Por qué la edición PostgreSQL de Aurora, y no la de MySQL?
- JSONB nativo e indexable: se usa en
audit_logs.metadata(payloads de notificaciones, detalles de cambios de estado) — el JSON de MySQL es más limitado para indexar y consultar contenido interno que el JSONB de PostgreSQL. - Full-text search nativo: si más adelante se necesita buscar transacciones por texto libre (nombre, dirección), PostgreSQL lo resuelve sin sumar un servicio aparte (Meilisearch/Algolia).
- Consistente con el criterio general de arquitectura del equipo (
architect): "Default a PostgreSQL para casi todo". - Laravel soporta PostgreSQL de forma nativa y de primera clase — no hay ninguna pérdida de funcionalidad frente a MySQL.
MySQL/Aurora MySQL no se descarta como mala opción — sigue siendo válida y muy usada en fintech (Oracle sigue invirtiendo fuerte en performance de MySQL/HeatWave). Simplemente PostgreSQL/Aurora-PostgreSQL da una ventaja concreta y gratis para este proyecto puntual (JSONB de auditoría, potencial de full-text search), sin ceder nada en performance o confiabilidad frente a la edición MySQL de Aurora.
Alternatives Considered
- RDS PostgreSQL/MySQL estándar (no Aurora): descartado — mismo motor, pero sin el performance ni la resiliencia extra de Aurora, al mismo (o mayor) costo operativo.
- Aurora MySQL-Compatible Edition: válida, pero se prefiere la edición PostgreSQL por el JSONB de auditoría y alineación con el default de arquitectura del equipo.
- PlanetScale / Neon / Turso (DBaaS de terceros): no se evaluaron a fondo — al tener el backend ya decidido en AWS, mantener la base de datos en el mismo proveedor simplifica networking (VPC privada), IAM, y facturación.
Consequences
- Positivo: un solo proveedor (AWS) para backend + base de datos simplifica seguridad de red (VPC privada, security groups) y observabilidad (todo en CloudWatch).
- Negativo: Aurora tiene un costo mínimo mensual mayor que una instancia RDS chica de un solo AZ — se acepta este costo a cambio de la resiliencia (aceptable para un sistema que maneja dinero real en producción).
- Neutral: en dev local se usa Postgres normal (no Aurora) — no hay forma de probar localmente las ventajas específicas de Aurora (failover, réplicas), solo en staging/producción.
Next Steps
devops/architectdefinen el detalle de instancia (Aurora Serverless v2 vs instancias provisionadas) según el volumen real una vez que haya datos de producción — verdoc/environments/production.md.

