# ADR-011: Estrategia de Base de Datos - Carga Limpia

**Estado:** Aceptado
**Fecha:** 2025-11-24
**Responsable:** Architecture-Analyst
**Proyecto:** ERP Construccion

## Contexto

El proyecto esta en fase de desarrollo activo donde la estructura de la base de datos evoluciona frecuentemente. Necesitamos una estrategia clara para gestionar cambios.

## Decision

**Adoptamos la estrategia de "Carga Limpia" (Clean Load) para la gestion de base de datos.**

### Principios

```
+-------------------------------------------------------------+
|  SI - PERMITIDO                                              |
+-------------------------------------------------------------+
|  - Archivos DDL completos por schema (01-auth.sql, etc.)    |
|  - Scripts de seeds para datos iniciales                     |
|  - Scripts de recreacion (drop + create)                     |
|  - Un solo punto de verdad: los archivos DDL                |
+-------------------------------------------------------------+
|  NO - PROHIBIDO                                              |
+-------------------------------------------------------------+
|  - Archivos de migracion incremental (migrations)           |
|  - Archivos de fix o patch                                   |
|  - ALTER TABLE sin actualizar DDL                           |
|  - Scripts numerados tipo migration_001_xxx.sql             |
|  - Hotfixes directos a la base de datos                     |
+-------------------------------------------------------------+
```

### Estructura de Archivos

```
apps/database/
+-- ddl/
|   +-- 00-prerequisites.sql    # Extensions, utilities
|   +-- 01-auth.sql             # Schema auth
|   +-- 02-core.sql             # Schema core
|   +-- ...
|   +-- 09-construction.sql     # ESPECIFICO construccion
|   +-- 10-infonavit.sql        # ESPECIFICO INFONAVIT
|   +-- 11-estimates.sql        # ESPECIFICO estimaciones
+-- seeds/
|   +-- dev/                    # Seeds desarrollo
|   +-- staging/                # Seeds staging
|   +-- prod/                   # Seeds produccion (minimos)
+-- scripts/
    +-- create-database.sh
    +-- reset-database.sh
    +-- load-seeds.sh
```

### Flujo de Trabajo para Cambios

```
1. Editar archivo DDL correspondiente
   Ejemplo: Agregar columna a proyectos
   -> Editar: ddl/09-construction.sql

2. Actualizar documentacion
   -> INVENTARIO-OBJETOS-BD.yml
   -> Trazabilidad si aplica

3. Actualizar seeds si es necesario
   -> seeds/dev/05-sample-data.sql

4. Ejecutar reset
   -> ./scripts/reset-database.sh

5. Verificar que todo funciona
```

## Justificacion

### Alineacion con ERP Generico
- Misma estrategia de gestion de BD
- Facilita sincronizacion de schemas genericos

### Especifico para Construccion
- Schemas 09-11 especificos se manejan igual
- Seeds con datos de prueba de proyectos, lotes, etc.

## Consecuencias

### Positivas
- Simplicidad: Un comando recrea todo
- Reproducibilidad: Cualquier dev obtiene BD identica
- Sin deuda tecnica: No hay parches acumulados

### Negativas
- Perdida de datos locales: Cada reset borra datos
  - Mitigacion: Seeds completos para desarrollo

## Transicion a Produccion

Cuando entre en produccion con datos reales:
1. CONGELAR version actual de DDL como "baseline v1.0"
2. CREAR nuevo ADR para estrategia de migracion
3. IMPLEMENTAR herramienta de migraciones (Prisma/Flyway)

## Directiva para Agentes

```
DIRECTIVA ADR-011 - CARGA LIMPIA DE BASE DE DATOS

Los agentes DEBEN:
- Editar archivos DDL existentes para cambios
- Usar reset-database.sh despues de cambios
- Actualizar inventarios y trazabilidad
- Mantener seeds actualizados

Los agentes NO DEBEN:
- Crear archivos de migracion
- Crear archivos de fix o patch
- Ejecutar ALTER TABLE directamente
- Crear scripts numerados incrementales
```

## Referencias
- [ERP Generico ADR-011](../../erp-generic/docs/adr/ADR-011-database-clean-load-strategy.md)
