SYS-ADR-003 — Mediciones en MongoDB; identidad y configuración en Postgres¶
| Estado | Aceptada |
| Decisión | 2026-04 la adopción de MongoDB; 2026-09 su uso efectivo para mediciones |
| Registrada | 2026-09-30 |
| Reemplaza | CLOUD-ADR-003 — eventos en Postgres con JSONB y particionado |
| Relacionadas | SYS-ADR-002, SYS-ADR-008 |
Contexto¶
El Cloud tiene dos clases de datos con necesidades opuestas:
| Identidad y configuración | Mediciones | |
|---|---|---|
| Volumen | decenas a miles de filas | millones de documentos por día |
| Forma | relacional, con integridad referencial | series de puntos homogéneos por propiedad |
| Consultas | uniones, permisos, unicidad | rango temporal por propiedad y máquina |
| Consistencia | transaccional | por documento alcanza |
CLOUD-ADR-003 había decidido resolver las dos con Postgres: una tabla de eventos con payload
JSONB y particionado. Nunca se implementó.
Decisión¶
Dos almacenes, con la frontera puesta en el tipo de dato, no en el componente:
| Almacén | Qué guarda |
|---|---|
| Postgres | tenants, usuarios, roles y permisos, invitaciones, dispositivos y sus claves de API, disposiciones del dashboard, registros de actividad, reglas de alarma y notificaciones |
| MongoDB | la colección measurements, y nada más |
MongoDB no es una dependencia crítica del arranque: si no está disponible, la API arranca
igual, la ingesta responde 500 y todo el ABM sigue funcionando. Ver
calidad y resiliencia, escenario E5.
Alternativas consideradas¶
| Alternativa | Por qué no |
|---|---|
Postgres con JSONB y particionado, como decía CLOUD-ADR-003 |
La forma jerárquica del estándar AAS encaja mejor en documentos que en una tabla de eventos |
| ArangoDB | Evaluada explícitamente y descartada: menor ecosistema en Go |
| Extender InfluxDB a la nube | Ataría el almacén de la nube al de la planta, que SYS-ADR-001 usa como desacople |
| Un solo almacén para todo | Ninguna de las dos opciones cubre bien los dos perfiles |
Consecuencias¶
A favor:
- Cada almacén hace lo que hace bien, y los índices de mediciones están diseñados para las dos consultas que el dashboard realmente hace: último valor de una propiedad, y una propiedad en una ventana de tiempo.
- La caída del almacén de mediciones no voltea el login ni el ABM. Es una de las propiedades de resiliencia mejor logradas del sistema.
En contra:
- Dos bases más que operar, respaldar y monitorear. Ninguna tiene hoy política de retención, y solo una tiene respaldos —los automáticos del plan gratuito del proveedor de Postgres—.
- No se sabe dónde corre MongoDB en producción. Es el hueco más grave que deja esta ADR: el almacén de todas las mediciones no está documentado en ningún repositorio. Ver contenedores C4.
- El aislamiento por tenant en las mediciones lo impone un índice, no el motor. Ver
SYS-ADR-002.
Evidencia¶
- Única colección existente y sus índices:
internal/repo/mongo/measurements/repository.go, y el árbolinternal/repo/mongo/con solomeasurementsymetrics - Consultas del dashboard y el índice que las sirve:
internal/repo/mongo/metrics/repository.go - Esquema relacional y su alcance:
migrations/README.md - Degradación de la ingesta sin MongoDB, y el paso manual pendiente de provisionarlo:
.env.exampleyCLAUDE.md - Decisión reemplazada:
docs/adr/ADR-003.md