## Directivas SIMCO v3.7.0 - Estandarizacion de Documentacion (7) - SIMCO-DOCUMENTACION-PROYECTO.md - SIMCO-NOMENCLATURA.md - SIMCO-ESTRUCTURA-DOCS.md - SIMCO-INVENTARIOS.md - SIMCO-TESTING.md - SIMCO-MIGRACIONES-BD.md - SIMCO-INTEGRACIONES-EXTERNAS.md ## Directivas SIMCO v3.8.0 - Mantenimiento de Documentacion (2) - SIMCO-MANTENIMIENTO-DOCUMENTACION.md - SIMCO-SINCRONIZACION-BD.md ## Templates (4) - TEMPLATE-INVENTARIO-PROYECTO.md - TEMPLATE-INTEGRACION-EXTERNA.md - TEMPLATE-MODULO-ESTANDAR.md - TEMPLATE-DEPRECACION.md ## Checklists (6) - CHECKLIST-DOCUMENTACION-PROYECTO.md - CHECKLIST-INVENTARIOS.md - CHECKLIST-NOMENCLATURA.md - CHECKLIST-MANTENIMIENTO-DOCS.md - CHECKLIST-SINCRONIZACION-BD.md - _MAP.md ## Perfil de Agente (1) - PERFIL-DOCUMENTATION-MAINTAINER.md ## Indices - INDICE-DIRECTIVAS-WORKSPACE.yml actualizado a v3.8.0 ## Submodulos actualizados (14) - gamilit, erp-core, michangarrito, template-saas - erp-suite, erp-construccion, erp-clinicas - erp-mecanicas-diesel, erp-retail, erp-vidrio-templado - trading-platform, betting-analytics - inmobiliaria-analytics, platform_marketing_content Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
16 KiB
16 KiB
SIMCO: SINCRONIZACIÓN BASE DE DATOS
Versión: 1.0.0 Alias: @SYNC_BD Fecha: 2026-01-10 Categoría: operaciones_documentacion Obligatoria: SÍ (post-cambio DDL)
RESUMEN EJECUTIVO
Principio: Todo cambio en DDL DEBE reflejarse en scripts, código y documentación. Un DDL sin sincronizar es una bomba de tiempo.
Esta directiva establece el flujo obligatorio de sincronización cuando se realizan cambios en la base de datos.
1. Propósito
1.1 Objetivo
Garantizar coherencia completa entre:
- Archivos DDL (schemas, tablas, funciones)
- Scripts de creación/recreación de BD
- Entities y DTOs del backend
- Types del frontend
- Inventarios de base de datos
- Documentación técnica
1.2 Problemas que Resuelve
| Problema | Solución |
|---|---|
| Scripts desactualizados | Actualización obligatoria post-DDL |
| Entities desincronizadas | Checklist de sincronización |
| Recreación fallida | Validación de ejecución |
| Inventarios obsoletos | Actualización como paso final |
2. Triggers de Sincronización
2.1 Cuándo Aplicar
| Cambio | Sincronización |
|---|---|
| Nuevo schema | OBLIGATORIA |
| Nueva tabla | OBLIGATORIA |
| Nueva columna | OBLIGATORIA |
| Modificación de tipo de columna | OBLIGATORIA |
| Nuevo constraint (FK, UK, CHECK) | OBLIGATORIA |
| Nuevo índice | OBLIGATORIA |
| Nueva función | OBLIGATORIA |
| Nuevo trigger | OBLIGATORIA |
| Nueva view | OBLIGATORIA |
| Modificación de RLS policy | OBLIGATORIA |
| Cambio en seeds | RECOMENDADA |
2.2 Excepciones
- Comentarios en DDL (solo documentación)
- Cambios cosméticos (formato, espacios)
3. Flujo de Sincronización
3.1 Diagrama de Flujo
┌─────────────────────────────────────────────────────────────┐
│ FLUJO DE SINCRONIZACIÓN BD │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. MODIFICAR DDL │
│ │ │
│ ▼ │
│ 2. ACTUALIZAR SCRIPTS ──────────────────────┐ │
│ │ │ │
│ ▼ │ │
│ 3. EJECUTAR RECREACIÓN ◄────────────────────┘ │
│ │ │
│ ▼ │
│ 4. SINCRONIZAR BACKEND │
│ │ ├── Entity │
│ │ ├── DTO │
│ │ ├── Repository │
│ │ └── Service/Controller (si aplica) │
│ │ │
│ ▼ │
│ 5. SINCRONIZAR FRONTEND (si API cambia) │
│ │ ├── Types/Interfaces │
│ │ └── Services │
│ │ │
│ ▼ │
│ 6. ACTUALIZAR INVENTARIOS │
│ │ ├── DATABASE_INVENTORY │
│ │ ├── BACKEND_INVENTORY │
│ │ └── MASTER_INVENTORY │
│ │ │
│ ▼ │
│ 7. DOCUMENTAR CAMBIO │
│ │ ├── ADR (si decisión arquitectural) │
│ │ ├── ET-* (spec técnico) │
│ │ └── Changelog │
│ │ │
│ ▼ │
│ 8. EJECUTAR TESTS │
│ │
└─────────────────────────────────────────────────────────────┘
3.2 Detalle por Paso
Paso 1: Modificar DDL
-- Ubicación típica: database/ddl/ o apps/database/ddl/
-- Ejemplo de cambio
ALTER TABLE schema_name.table_name
ADD COLUMN new_column VARCHAR(100) NOT NULL DEFAULT '';
-- O en archivo DDL nuevo
CREATE TABLE schema_name.new_table (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- ...
);
Paso 2: Actualizar Scripts
Scripts a actualizar:
| Script | Ubicación Típica | Acción |
|---|---|---|
| create-database.sh | database/ o scripts/ | Agregar nuevo DDL |
| recreate-database.sh | database/ o scripts/ | Misma actualización |
| drop-database.sh | database/ o scripts/ | Si es nueva tabla |
Estructura esperada del script:
#!/bin/bash
# create-database.sh
# 1. Crear extensiones
psql -f ddl/00-extensions.sql
# 2. Crear schemas (en orden)
psql -f ddl/01-schema-auth.sql
psql -f ddl/02-schema-users.sql
# ... agregar nuevo schema aquí si aplica
# 3. Crear tablas (en orden de dependencias)
psql -f ddl/tables/auth/*.sql
psql -f ddl/tables/users/*.sql
# ... agregar nueva tabla aquí
# 4. Crear constraints
psql -f ddl/constraints/*.sql
# 5. Crear índices
psql -f ddl/indexes/*.sql
# 6. Crear funciones
psql -f ddl/functions/*.sql
# 7. Crear triggers
psql -f ddl/triggers/*.sql
# 8. Crear views
psql -f ddl/views/*.sql
# 9. Crear RLS policies
psql -f ddl/policies/*.sql
# 10. Seeds (opcional)
psql -f seeds/*.sql
Paso 3: Ejecutar Recreación
# Validar antes de ejecutar
./recreate-database.sh --dry-run # Si está disponible
# Ejecutar recreación
./recreate-database.sh
# Verificar resultado
echo "Verificando schemas..."
psql -c "\dn"
echo "Verificando tablas..."
psql -c "\dt schema_name.*"
echo "Verificando funciones..."
psql -c "\df schema_name.*"
Criterios de éxito:
- Sin errores de sintaxis SQL
- Todos los objetos creados
- Constraints activos
- Índices creados
- RLS policies activas
Paso 4: Sincronizar Backend
Entity (TypeORM ejemplo):
// src/modules/module-name/entities/table-name.entity.ts
@Entity({ schema: 'schema_name', name: 'table_name' })
export class TableName {
@PrimaryGeneratedColumn('uuid')
id: string;
// Agregar nueva columna
@Column({ type: 'varchar', length: 100, default: '' })
newColumn: string;
// ... resto de columnas
}
DTO:
// src/modules/module-name/dto/create-table-name.dto.ts
export class CreateTableNameDto {
@IsString()
@MaxLength(100)
@IsOptional()
newColumn?: string;
// ... resto de campos
}
Repository (si métodos nuevos):
// src/modules/module-name/repositories/table-name.repository.ts
@Injectable()
export class TableNameRepository {
// Agregar método si la nueva columna requiere queries específicos
async findByNewColumn(value: string): Promise<TableName[]> {
return this.repository.find({ where: { newColumn: value } });
}
}
Paso 5: Sincronizar Frontend
Types:
// src/types/table-name.types.ts
export interface TableName {
id: string;
newColumn: string; // Agregar nuevo campo
// ...
}
export interface CreateTableNameDto {
newColumn?: string; // Agregar nuevo campo
// ...
}
Paso 6: Actualizar Inventarios
DATABASE_INVENTORY.yml:
schemas:
- name: schema_name
tables:
- name: table_name
columns: 15 # Actualizar conteo
last_modified: "2026-01-10"
changes:
- "2026-01-10: Agregada columna new_column"
BACKEND_INVENTORY.yml:
entities:
- name: TableName
file: "src/modules/module-name/entities/table-name.entity.ts"
columns: 15 # Actualizar
last_modified: "2026-01-10"
Paso 7: Documentar Cambio
Si es decisión arquitectural → ADR:
# ADR-NNNN: Agregar columna X a tabla Y
## Contexto
...
## Decisión
...
## Consecuencias
...
Actualizar spec técnico:
# ET-BD-XXX: Schema schema_name
## Cambios Recientes
- 2026-01-10: Agregada columna new_column a table_name
Paso 8: Ejecutar Tests
# Tests unitarios
npm run test -- --grep "TableName"
# Tests de integración
npm run test:e2e -- --grep "table-name"
# Verificar build
npm run build
4. Validación de Scripts BD
4.1 Estructura de Scripts Requeridos
| Script | Obligatorio | Propósito |
|---|---|---|
| create-database.sh | SÍ | Crear BD desde cero |
| recreate-database.sh | SÍ | Drop + Create |
| drop-database.sh | RECOMENDADO | Solo drop |
| seed-database.sh | OPCIONAL | Datos iniciales |
| migrate.sh | SI MIGRATIONS | Ejecutar migraciones |
4.2 Checklist Pre-Recreación
antes_de_recrear:
- [ ] Backup de BD si tiene datos importantes
- [ ] Verificar no hay conexiones activas
- [ ] Revisar orden de scripts
- [ ] Verificar dependencias entre schemas
- [ ] Confirmar variables de entorno
4.3 Checklist Post-Recreación
despues_de_recrear:
- [ ] Todos los schemas creados
- [ ] Todas las tablas creadas
- [ ] Todos los constraints activos
- [ ] Todos los índices creados
- [ ] Todas las funciones creadas
- [ ] Todos los triggers activos
- [ ] Todas las views creadas
- [ ] RLS policies activas
- [ ] Seeds ejecutados (si aplica)
- [ ] Aplicación puede conectar
5. Matriz de Dependencias DDL
5.1 Dependencias de Tablas
Tabla Principal
└── FK → Tabla Referenciada (debe existir primero)
└── View que la usa (debe actualizarse)
└── Trigger asociado (debe actualizarse)
└── Función que la referencia (debe actualizarse)
5.2 Orden de Creación
1. Extensions (uuid-ossp, pg_trgm, etc.)
2. Schemas
3. Types/Enums
4. Tablas sin FK
5. Tablas con FK (orden de dependencias)
6. Constraints adicionales
7. Índices
8. Funciones
9. Triggers
10. Views
11. RLS Policies
12. Grants/Permissions
5.3 Impacto de Cambios
| Cambio | Impacto |
|---|---|
| Renombrar columna | Views, funciones, triggers, código |
| Cambiar tipo | Validaciones, DTOs, frontend |
| Agregar NOT NULL | Seeds, tests, código existente |
| Agregar FK | Orden de inserts, deletes |
| Eliminar columna | ALTO - verificar uso en todo el sistema |
6. Checklist por Tipo de Cambio
6.1 Nueva Tabla
nueva_tabla:
ddl:
- [ ] Archivo DDL creado en ubicación correcta
- [ ] Schema especificado
- [ ] PK definida (UUID recomendado)
- [ ] Timestamps (created_at, updated_at)
- [ ] Tenant column si multi-tenant
- [ ] Índices necesarios definidos
scripts:
- [ ] create-database.sh actualizado
- [ ] Orden de creación correcto (después de dependencias)
- [ ] recreate-database.sh actualizado
backend:
- [ ] Entity creada
- [ ] DTO Create creado
- [ ] DTO Update creado
- [ ] DTO Response creado
- [ ] Repository creado
- [ ] Service creado
- [ ] Controller creado
- [ ] Module actualizado
tests:
- [ ] Tests de entity
- [ ] Tests de service
- [ ] Tests e2e de endpoints
inventarios:
- [ ] DATABASE_INVENTORY actualizado
- [ ] BACKEND_INVENTORY actualizado
- [ ] MASTER_INVENTORY actualizado
6.2 Nueva Columna
nueva_columna:
ddl:
- [ ] Columna agregada al archivo DDL
- [ ] Tipo de dato correcto
- [ ] Constraints definidos (NOT NULL, DEFAULT, etc.)
- [ ] Índice si será buscada frecuentemente
scripts:
- [ ] Script de creación actualizado
- [ ] Recreación exitosa verificada
backend:
- [ ] Entity actualizada
- [ ] DTOs actualizados
- [ ] Validadores agregados si aplica
frontend:
- [ ] Types actualizados
- [ ] Formularios actualizados si visible
6.3 Nueva Función/Trigger
nueva_funcion:
ddl:
- [ ] Función creada en archivo separado
- [ ] Schema especificado
- [ ] SECURITY DEFINER si accede a otras tablas
- [ ] Documentación inline
scripts:
- [ ] Agregada al script de creación
- [ ] Orden correcto (después de tablas que usa)
trigger:
- [ ] Trigger creado si aplica
- [ ] Evento correcto (BEFORE/AFTER, INSERT/UPDATE/DELETE)
- [ ] FOR EACH ROW si por fila
tests:
- [ ] Test de función
- [ ] Test de trigger si aplica
7. Actualización de Inventarios
7.1 DATABASE_INVENTORY.yml
# Estructura mínima requerida
database:
name: "{database_name}"
version: "{semver}"
updated: "{YYYY-MM-DD}"
schemas:
- name: "{schema_name}"
tables_count: {N}
functions_count: {N}
triggers_count: {N}
views_count: {N}
tables:
- name: "{table_name}"
columns: {N}
indexes: {N}
has_rls: {true|false}
functions:
- name: "{function_name}"
schema: "{schema_name}"
returns: "{return_type}"
triggers:
- name: "{trigger_name}"
table: "{schema.table}"
event: "{BEFORE|AFTER} {INSERT|UPDATE|DELETE}"
7.2 Qué Actualizar
| Cambio DDL | Actualizar en Inventario |
|---|---|
| Nueva tabla | schemas[].tables[], tables_count |
| Nueva columna | tables[].columns |
| Nuevo índice | tables[].indexes |
| Nueva función | functions[], functions_count |
| Nuevo trigger | triggers[], triggers_count |
| Nueva view | views[], views_count |
| Nuevo schema | schemas[] |
8. Documentación de Cambios
8.1 Cuándo Crear ADR
- Nuevo schema con propósito específico
- Cambio de estrategia de índices
- Implementación de RLS
- Cambio de tipos de datos masivo
- Nueva función compleja
8.2 Formato de Registro en Changelog
## [{YYYY-MM-DD}] Base de Datos
### Agregado
- Nueva tabla: `schema.nueva_tabla`
- Nueva columna: `schema.tabla.nueva_columna`
- Nueva función: `schema.nueva_funcion()`
### Modificado
- Columna: `schema.tabla.columna` - tipo VARCHAR(50) → VARCHAR(100)
### Deprecado
- Función: `schema.funcion_antigua()` - usar `schema.funcion_nueva()`
### Eliminado
- Tabla: `schema.tabla_obsoleta` (datos migrados a `schema.nueva_tabla`)
9. Errores Comunes
| Error | Consecuencia | Prevención |
|---|---|---|
| Script no actualizado | Recreación falla | Actualizar SIEMPRE post-DDL |
| Orden incorrecto | FK violations | Respetar dependencias |
| Entity desincronizada | Runtime errors | Sincronizar inmediatamente |
| Inventario obsoleto | Documentación incorrecta | Último paso del ciclo |
| Sin backup | Pérdida de datos | Backup antes de recrear |
10. Referencia: Checklist Completo
Para validación detallada usar:
Referencia: @CHK_SYNC_BD
11. Referencias
| Alias | Directiva | Uso |
|---|---|---|
| @MANTENIMIENTO_DOCS | SIMCO-MANTENIMIENTO-DOCUMENTACION.md | Ciclo de mantenimiento |
| @CHK_SYNC_BD | CHECKLIST-SINCRONIZACION-BD.md | Checklist detallado |
| @OP_DDL | SIMCO-DDL.md | Operaciones de BD |
| @INVENTARIOS | SIMCO-INVENTARIOS.md | Estándares de inventarios |
| @MIGRACIONES | SIMCO-MIGRACIONES-BD.md | Migraciones de BD |
12. Changelog
| Versión | Fecha | Cambios |
|---|---|---|
| 1.0.0 | 2026-01-10 | Versión inicial |
Referencia rápida:
Flujo: DDL → Scripts → Recrear → Backend → Frontend → Inventarios → Docs → Tests
Checklist: @CHK_SYNC_BD
Trigger: Cualquier cambio en DDL