# Database - MVP Sistema Administración de Obra

**Stack:** PostgreSQL 15+ con PostGIS
**Versión:** 1.0.0
**Fecha:** 2025-11-20

---

## 📋 DESCRIPCIÓN

Base de datos del sistema de administración de obra e INFONAVIT.

**Schemas principales:**
- `auth_management` - Autenticación y usuarios
- `project_management` - Proyectos y estructura de obra
- `financial_management` - Presupuestos y control financiero
- `purchasing_management` - Compras e inventarios
- `construction_management` - Control de obra y avances
- `quality_management` - Calidad y postventa
- `infonavit_management` - Integración INFONAVIT

---

## 🏗️ ESTRUCTURA

```
ddl/
├── 00-init.sql                    # Inicialización + extensiones
└── schemas/                       # Schemas por contexto
    ├── auth_management/
    │   ├── tables/               # Tablas (01-users.sql, 02-roles.sql, ...)
    │   ├── functions/            # Funciones SQL
    │   ├── triggers/             # Triggers
    │   └── views/                # Vistas
    ├── project_management/
    │   └── ...
    └── [otros schemas]/

seeds/
├── dev/                          # Datos de desarrollo
└── prod/                         # Datos de producción inicial

migrations/                       # Migraciones versionadas
scripts/                          # Scripts de utilidad
```

---

## 🚀 SETUP INICIAL

### 1. Crear Base de Datos

```bash
# Ejecutar script de creación
cd scripts
./create-database.sh
```

### 2. Ejecutar DDL

```bash
# Ejecutar inicialización
psql $DATABASE_URL -f ddl/00-init.sql

# Ejecutar schemas (en orden)
psql $DATABASE_URL -f ddl/schemas/auth_management/tables/01-users.sql
# ... etc
```

### 3. Cargar Seeds (desarrollo)

```bash
psql $DATABASE_URL -f seeds/dev/01-users.sql
psql $DATABASE_URL -f seeds/dev/02-projects.sql
```

---

## 🔧 SCRIPTS DISPONIBLES

| Script | Descripción |
|--------|-------------|
| `create-database.sh` | Crea la base de datos desde cero |
| `reset-database.sh` | Elimina y recrea la base de datos |
| `run-migrations.sh` | Ejecuta migraciones pendientes |
| `backup-database.sh` | Crea backup de la base de datos |

---

## 📊 CONVENCIONES

### Nomenclatura

Seguir **ESTANDARES-NOMENCLATURA.md**:
- Schemas: `snake_case` + sufijo `_management`
- Tablas: `snake_case` plural
- Columnas: `snake_case` singular
- Índices: `idx_{tabla}_{columnas}`
- Foreign Keys: `fk_{origen}_to_{destino}`
- Constraints: `chk_{tabla}_{columna}`

### Estructura de Archivo DDL

```sql
-- ============================================================================
-- Tabla: nombre_tabla
-- Schema: nombre_schema
-- Descripción: [descripción]
-- Autor: Database-Agent
-- Fecha: YYYY-MM-DD
-- ============================================================================

DROP TABLE IF EXISTS schema.tabla CASCADE;

CREATE TABLE schema.tabla (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    -- columnas...
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

COMMENT ON TABLE schema.tabla IS '[descripción]';
COMMENT ON COLUMN schema.tabla.columna IS '[descripción]';

CREATE INDEX idx_tabla_columna ON schema.tabla(columna);
```

---

## 🔍 VALIDACIÓN

### Verificar Schemas

```sql
SELECT schema_name
FROM information_schema.schemata
WHERE schema_name LIKE '%_management';
```

### Verificar Tablas

```sql
SELECT table_schema, table_name,
       (SELECT COUNT(*) FROM information_schema.columns
        WHERE table_schema = t.table_schema
        AND table_name = t.table_name) as column_count
FROM information_schema.tables t
WHERE table_schema LIKE '%_management'
ORDER BY table_schema, table_name;
```

### Verificar Índices

```sql
SELECT tablename, indexname
FROM pg_indexes
WHERE schemaname LIKE '%_management'
ORDER BY tablename;
```

---

## 📚 REFERENCIAS

- [DIRECTIVA-DISENO-BASE-DATOS.md](../../orchestration/directivas/DIRECTIVA-DISENO-BASE-DATOS.md)
- [ESTANDARES-NOMENCLATURA.md](../../orchestration/directivas/ESTANDARES-NOMENCLATURA.md)
- [MVP-APP.md](../../docs/00-overview/MVP-APP.md)

---

## 📝 VARIABLES DE ENTORNO

```bash
DATABASE_URL=postgresql://usuario:password@localhost:5432/nombre_db
DB_HOST=localhost
DB_PORT=5432
DB_NAME=erp_construccion
DB_USER=postgres
DB_PASSWORD=password
```

---

**Mantenido por:** Database-Agent
**Última actualización:** 2025-11-20
