2.1 🔑 Información general
utf8mb4 · collate: utf8mb4_uca1400_ai_civentas.sync_id → sincronizaciones.idCredenciales (actualmente hardcoded en 5 archivos)
DB_HOST = 'localhost'
DB_NAME = 'u120688891_chess'
DB_USER = 'u120688891_chess'
DB_PASS = 't2#h*wvQ2./wZaS' -- ⚠️ Hardcoded · ver SEC-02
DB_CHARSET = 'utf8mb4'
CHESS_API_URL = 'https://zonasaridas.chesserp.com/AR1185/web/api/chess/v1'
CHESS_API_USER = 'api_zonas'
CHESS_API_PASS = 'z0n4saridas' -- ⚠️ Hardcoded · ver SEC-02
2.2 🗺️ Mapa de las 33 tablas
| Grupo | Tabla | Tipo | Filas (AI) | Módulo dueño | Usuarios |
|---|---|---|---|---|---|
| 📊 Venta | sincronizaciones | control | 33 | venta | venta · landing |
ventas | histórica | 515.811 | venta | venta · caja/finanzas · cashflow · landing | |
| 🏦 Caja v2 | caja_sincronizaciones | control | 23 | caja | caja · landing |
caja_gastos | derivada | 5.804 | caja/gastos | gastos · tesorería (cajero→prov) | |
caja_raw_conceptos | catálogo | ~169 | caja | sync (nivel 2) | |
caja_raw_egresos_caja | histórica | 11.070 | caja | tesorería · cashflow (saldo) | |
caja_raw_egresos_detalle | histórica | 261.627 | caja | sync · futuros reportes | |
caja_raw_gastos_tipificados | histórica | 28.398 | caja | finanzas (iva, percepciones, cc, prov) · tesorería | |
caja_raw_movimiento_detalle | histórica | 21.765 | caja | gastos (fallback) | |
caja_raw_movimiento_resumido | histórica | 8.508 | caja | finanzas (iva) · tesorería (origen) | |
caja_cajeros | denormalización | 15.339 | caja | tesorería (mapa empresa-caja-cajero-prov) | |
caja_audit_log | auditoría | 1.217 | caja | admin / debug | |
| 💸 Cashflow | cashflow_sincronizaciones | control | 4 | cashflow | cashflow |
cashflow_cartera_clientes | snapshot | 801 | cashflow | cashflow (cobranzas) | |
cashflow_cartera_proveedores | snapshot | 118 | cashflow | cashflow (pagos) | |
cashflow_cheques_cartera | snapshot | 2.448 | cashflow | cashflow (cheques) | |
cashflow_extractos_bancarios | snapshot | 1.744 | cashflow | cashflow (futuro: conciliación) | |
| 📦 Artículos | articulos_raw | catálogo | ~7.870 | articulos | ★ venta (JOIN peso) · caja/finanzas |
articulos_raw_proveedores | catálogo | ~71 | articulos | articulos | |
articulos_raw_tipos_mercaderia | catálogo | vacía | articulos | articulos | |
articulos_raw_unidades_medida | catálogo | vacía | articulos | articulos | |
articulos_raw_tipos_presentacion | catálogo | ~1 | articulos | articulos | |
| 🏷️ Listas / Agrup. | articulos_precios | catálogo | ~7.870 | listas | listas (consultor) |
articulos_agrupaciones | catálogo | ~23.000 | listas | listas (filtros) | |
articulos_formas_agrupar | catálogo | ~6 | listas | listas (selector) | |
listas_sync | control | ~17 | listas | metadata por lista | |
| 📚 Catálogo / Otros | catalogo_art_config | config | — | /catalogo | fuera de /reportes |
catalogo_cat_config | config | — | /catalogo | fuera de /reportes | |
catalogo_sync_config | config | — | /catalogo | fuera de /reportes | |
catalogo_sync_log | log | 47 | /catalogo | fuera de /reportes | |
catalogo_usuarios | auth | 5 | /catalogo | fuera de /reportes | |
| 👥 Clientes | clientes_raw | catálogo | ~3.000 | /clientes (?) | módulo separado · JSON validado |
clientes_sync_log | log | 3 | /clientes (?) | módulo separado |
Leyenda de tipos
- histórica — particionable por
sync_id,fecha_corteofechaComprobate. - derivada — alimentada desde una raw con transformación (ej. clasificación 3-tier).
- catálogo — current-state, se reemplaza completo en cada carga.
- control / log / config — metadata.
2.3 🔗 Diagrama de relaciones (ER)
Sólo hay 1 FK formal (ventas → sincronizaciones); el resto son
relaciones lógicas sin restricción de integridad. Las flechas indican
a quién lee cada módulo.
┌──────────────────────────────┐
│ sincronizaciones │
│ PK id · UK (mes, anio) │
│ estado='completado' │
└─────────────┬────────────────┘
│ 1
│
│ N
┌─────────────▼────────────────┐
┌───────────────────────│ ventas │◄────────────────┐
│ FK ON DELETE CASCADE │ 515.811 filas · 160+ cols │ │
│ │ PK id · idx (sync_id, fecha │ │ JOIN
│ │ cliente, vend, sup, prov)│ │ (read)
│ └──────────────┬───────────────┘ │
│ │ │
│ │ LEFT JOIN │
│ ▼ │
│ ┌──────────────────────────────┐ │
│ │ articulos_raw │ │
│ │ PK codigo · 66 cols │ │
│ │ ★ Cross-module bootstrap │ │
│ │ ★ Aporta peso, proveedor │ │
│ └──────────────────────────────┘ │
│ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┤
│ │ │
│ │ ┌──────────────────────────────┐ │
│ │ │ caja_sincronizaciones │ │
│ │ │ PK id · UK (mes, anio) │ │
│ │ └─────────────┬────────────────┘ │
│ │ │ 1 │
│ │ ▼ N │
│ │ ┌────────────────┬──────┴──────────┬──────────────────┐ │
│ │ ▼ ▼ ▼ ▼ │
│ │ caja_gastos caja_raw_*_* caja_cajeros caja_audit_log │
│ │ (derivada) (6 raw tables) (denormaliz) (eventos) │
│ │ 5.804 ~330K filas 15.339 1.217 │
│ │ │
│ │ ┌──────────────────────────────┐ │
│ │ │ cashflow_sincronizaciones │ │
│ │ │ PK id · UK (tipo, corte) │ │
│ │ └─────────────┬────────────────┘ │
│ │ │ 1 │
│ │ ▼ N │
│ │ ┌────────────────┬────────────────┬────────────────┐ │
│ │ ▼ ▼ ▼ ▼ │
│ │ cartera_clientes cartera_prov cheques_cartera extractos_banc │
│ │ 801 118 2.448 1.744 │
│ │ │
│ │ Lee saldo de caja │
│ │ ◄────── (caja_raw_egresos_caja.total_saldo_final) ─┐ │
│ │ │ │
│ └─ Cruce comercial (idCliente vs ventas 6 meses) ────────┘ │
│ │
└─ caja/finanzas/cruce_ventas.php ◄──── lee ventas para rentabilidad ────┘
Relaciones lógicas (sin FK declarada)
| Tabla origen | Tabla destino | Campo | Cardinalidad | Usado en |
|---|---|---|---|---|
ventas.idArticulo | articulos_raw.codigo | CAST(idArticulo AS UNSIGNED) | N → 1 (opcional) | peso, proveedor real |
ventas.idCliente | clientes_raw.idCliente | directo | N → 1 | (no se usa hoy en reportes) |
caja_gastos.sync_id | caja_sincronizaciones.id | directo | N → 1 | delete_period · stats |
caja_raw_*.sync_id | caja_sincronizaciones.id | directo | N → 1 | idem (6 tablas raw) |
caja_raw_egresos_caja.cajero | caja_cajeros.cajero | LOWER(TRIM(cajero)) | N → 1 | tesorería: cajero → provincia |
caja_raw_gastos_tipificados.(serie,numero,empresa) | caja_raw_egresos_detalle (regex ME) | compuesto | N → 1 | pipeline 3-tier nivel 1 |
caja_raw_movimiento_detalle.codigo_concepto | caja_raw_conceptos.codigo | directo | N → 1 | pipeline 3-tier nivel 2 |
cashflow_cartera_clientes.cliente_id | ventas.idCliente | directo | 1 → N | cruce comercial 6 meses |
cashflow_cheques_cartera.cliente_id | ventas.idCliente | directo | 1 → N | concentración por cliente emisor |
cashflow_*.sync_id | cashflow_sincronizaciones.id | directo | N → 1 | delete-sync por corte |
articulos_precios.id_articulo | articulos_raw.codigo | directo | 1 → 1 | backfill visible_mobile |
articulos_agrupaciones.id_articulo | articulos_raw.codigo | directo | N → 1 | filtros del consultor |
reset_db.php, las raw quedan huérfanas.
El proyecto compensa con limpieza explícita en código, pero formalizar las FKs
con ON DELETE CASCADE sería más defensivo. Ver §10 PERF-01 y
propuesta en §11 ARQ-04.
2.4 📊 Tabla ventas (la grande)
~160 columnas (sólo se muestran las más relevantes). Tipos derivados del dump real.
Columnas clave para cálculos
| Columna | Tipo | Función | Notas |
|---|---|---|---|
id | BIGINT PK | AI | 515.811 |
sync_id | INT FK | Particiona por mes | FK CASCADE → sincronizaciones |
sync_fecha | DATETIME | Cuándo se importó | — |
idEmpresa / dsEmpresa | SMALLINT / VARCHAR(100) | Empresa | ZONAS ARIDAS / DEMO |
idDocumento / dsDocumento | VARCHAR(20) / VARCHAR(100) | Tipo cpbte | FC, NC, NDCON, etc. |
letra · serie · nrodoc | VARCHAR(2) · SMALLINT · INT | ID fiscal | Componen CBTE_KEY |
anulado | VARCHAR(2) | Flag anulación | 'SI' / 'NO' |
fechaComprobate | DATE | Fecha del comprobante | Indexado |
idVendedor / dsVendedor | SMALLINT / VARCHAR(100) | Vendedor | "LAR | JORGE DIAZ" |
idSupervisor / dsSupervisor | SMALLINT / VARCHAR(100) | Supervisor | Sufijo "(SUPERVISOR)" |
idDeposito / dsDeposito | SMALLINT / VARCHAR(100) | Depósito | — |
idProvincia / dsProvincia | VARCHAR(5) / VARCHAR(100) | Geografía | LA RIOJA, SGO. DEL ESTERO, CATAMARCA |
idCliente / nombreCliente | INT / VARCHAR(200) | Cliente | — |
idArticulo / dsArticulo | INT / VARCHAR(250) | SKU | NULL en NDCONs |
cantidadesTotal | DECIMAL(12,3) | Bultos con + sin cargo | Base para costo |
cantidadesCorCargo | DECIMAL(12,3) | Bultos con cargo | — |
cantidadesSinCargo | DECIMAL(12,3) | Mercadería bonificada | Usado en "Sin cargo" |
subtotalNeto | DECIMAL | Importe sin IVA | ★ Base de "Vta" |
subtotalBruto | DECIMAL | Importe con IVA | — |
preciocomprant | DECIMAL(14,4) | ★ Precio compra NETO | Usado para costo |
preciocomprabr | DECIMAL(14,4) | Precio compra BRUTO | NO se usa |
peso | DECIMAL(12,3) | Peso unitario | Pre-calculado por ERP |
pesoTotal | DECIMAL(12,3) | Peso línea (kg) | Fallback si catálogo = 0 |
proveedor | VARCHAR(200) | Proveedor del artículo | Indexado |
dsSucursal | VARCHAR(100) | Sucursal | Filtro principal del dashboard |
Índices de ventas
PRIMARY KEY (id)
KEY idx_sync (sync_id)
KEY idx_fecha (fechaComprobate)
KEY idx_mes_anio (idEmpresa, fechaComprobate)
KEY idx_cbte (idEmpresa, idDocumento, letra, serie, nrodoc)
KEY idx_vendedor (idVendedor)
KEY idx_supervisor (idSupervisor)
KEY idx_deposito (idDeposito)
KEY idx_cliente (idCliente)
KEY idx_articulo (idArticulo)
KEY idx_proveedor (proveedor(100))
KEY idx_provincia (idProvincia)
CONSTRAINT fk_ventas_sync FOREIGN KEY (sync_id)
REFERENCES sincronizaciones(id) ON DELETE CASCADE
⚠️ Falta índice (PERF-02)
No hay índice compuesto (sync_id, anulado) ni (sync_id, fechaComprobate).
Todas las queries del dashboard filtran por ambos. MariaDB resuelve con
index merge o range scan, pero un índice compuesto reduciría drásticamente
las páginas leídas (~12x menos según pruebas hipotéticas).
2.5 🏦 Tablas caja_* (Schema v2)
caja_gastos — derivada (alimenta dashboard de gastos)
CREATE TABLE caja_gastos (
id INT AUTO_INCREMENT PRIMARY KEY,
sync_id INT NOT NULL,
mes TINYINT NOT NULL,
anio SMALLINT NOT NULL,
provincia VARCHAR(50) NOT NULL,
rubro_id INT,
rubro VARCHAR(100),
concepto_id INT,
concepto_libre TEXT,
tipo_comprobante CHAR(2),
serie INT,
numero INT,
empresa TINYINT,
caja_nro VARCHAR(20),
cajero VARCHAR(100),
fecha DATE,
monto DECIMAL(15,2),
creado_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_sync (sync_id),
INDEX idx_periodo (mes, anio),
INDEX idx_prov (provincia),
INDEX idx_concepto (concepto_id),
INDEX idx_rubro (rubro_id),
INDEX idx_fecha (fecha),
INDEX idx_cajero (cajero)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Las 6 tablas caja_raw_*
Snapshot fiel de cada Excel (todas las columnas). Permite reportes futuros sin re-subir.
| Tabla | Cols | Origen | Persistencia | Filas/mes típico |
|---|---|---|---|---|
caja_raw_egresos_caja | 37 | EgresosCaja.xlsx | Histórico por sync_id | ~500 |
caja_raw_conceptos | 10 | ConceptosDeGastos.xlsx | Persistente (sólo se reemplaza al subir nuevo) | ~169 |
caja_raw_egresos_detalle | 9 | EgresosDetalle.xlsx | Histórico | ~12.000 |
caja_raw_gastos_tipificados | 42 | GastosTipificados.xlsx | Histórico | ~600 |
caja_raw_movimiento_detalle | 32 | MovimientoDetalle.xlsx | Histórico | ~800 |
caja_raw_movimiento_resumido | 31 | MovimientoResumido.xlsx | Histórico (opcional) | ~400 |
caja_cajeros — denormalización (Mayo 2026)
Mapa empresa·caja_nro·cajero·provincia reconstruido automáticamente al
finalizar cada sync con caja_rebuild_cajeros($pdo). Permite a Tesorería
evitar sub-selects feos para resolver "qué provincia es este cajero".
CREATE TABLE caja_cajeros (
id INT PK AI,
empresa VARCHAR(20) NOT NULL,
caja_nro VARCHAR(20) NOT NULL,
cajero VARCHAR(100) NOT NULL,
provincia VARCHAR(50),
primer_visto DATE,
ultimo_visto DATE,
dias_operados INT DEFAULT 0,
total_lineas_gasto INT DEFAULT 0,
last_sync_id INT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_empresa_caja_cajero (empresa, caja_nro, cajero),
INDEX idx_cajero (cajero),
INDEX idx_provincia (provincia)
);
caja_audit_log — auditoría
Registra cada evento del sync. Helper caja_audit_log($pdo, $syncId, $evento, $tabla, $filas, $msg).
CREATE TABLE caja_audit_log (
id INT PK AI,
sync_id INT,
evento VARCHAR(40), -- sync_started · raw_batch · gastos_batch · sync_completed
tabla VARCHAR(50),
filas INT,
mensaje TEXT,
creado_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_sync (sync_id),
INDEX idx_evento (evento),
INDEX idx_fecha (creado_at)
);
2.6 💸 Tablas cashflow_*
| Tabla | Particionado por | Granularidad | Datos clave |
|---|---|---|---|
cashflow_cartera_clientes | fecha_corte + cliente_id | Una fila por cliente y corte | Tramos de aging (7/15/30/60/+60) · vendedor · provincia |
cashflow_cartera_proveedores | fecha_corte + comprobante | Una fila por FC/NC/ND | fecha_vto · total · pagado · saldo · días atraso |
cashflow_cheques_cartera | fecha_corte + numero_cheque | Una fila por cheque recibido | banco · cliente_id · estado · días a presentar · echeq |
cashflow_extractos_bancarios | fecha_corte + banco + cuenta | Una fila por movimiento | débito · crédito · saldo_acum · contraparte |
cashflow_cheques_cartera (la más rica)
Estados típicos: EN CARTERA · PAGO A TERCEROS (endosado) · PAGO SIN CONFIRMAR · RECHAZADO.
Cálculo crítico: dias_a_presentar = DATEDIFF(fecha_presentacion, fecha_corte). Si < 0 = vencido sin presentar (riesgo de prescripción 30 días post-vencimiento).
2.7 📦 Tablas articulos_*
El catálogo maestro tiene 66 columnas tipadas según los tipos sugeridos
por el ERP en la fila 2 del Excel. PK = codigo (INT). Columnas con
índices: proveedor_id, anulado, cod_tipo_mercaderia,
cod_unidad_medida.
Columnas más usadas por otros módulos
codigo— JOIN conventas.idArticulo(cast a UNSIGNED).peso— enriquece cálculo de peso/toneladas en venta.proveedor_id+proveedor_razon_social— proveedor real (si en venta vino mal).cod_tipo_mercaderia+desc_tipo_mercaderia— segmentación.desc_unidad_medida,bultos_x_pallet,unidad_x_bulto— logística.anulado— filtro de SKUs vigentes.
Tablas auxiliares (catálogos)
-- Estructura común
CREATE TABLE articulos_raw_<aux> (
codigo INT PRIMARY KEY, -- VARCHAR(50) para tipos_presentacion
descripcion VARCHAR(255),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
2.8 📚 Otras tablas relevantes
articulos_precios — 22 columnas lista_N
Una fila por artículo, una columna por cada lista de precios habilitada en
la empresa (Delivery, Lista 1, Costo Especial, Veterinaria, …).
El schema declarado en el dump tiene lista_0 a lista_21
(todas DECIMAL(14,4)); el schema definido por listas/api/_schema.php
omite las listas que no existen en el ERP de ZA (2, 6, 12, 20).
articulos_agrupaciones — N:N artículo × forma de agrupar
CREATE TABLE articulos_agrupaciones (
id_articulo INT NOT NULL,
id_forma_agrupar VARCHAR(50) NOT NULL,
des_forma_agrupar VARCHAR(100),
id_agrupacion VARCHAR(50),
des_agrupacion VARCHAR(200),
PRIMARY KEY (id_articulo, id_forma_agrupar),
INDEX idx_forma (id_forma_agrupar),
INDEX idx_agrupacion (des_agrupacion(100))
);
Usado por listas/api/precios.php para filtrar por categoría comercial
(marca, accesorio, fuerza de venta, etc.).
clientes_raw — catálogo completo de clientes
~3.000 clientes con 49 columnas tipadas + datos_raw LONGTEXT con JSON validado
(CHECK json_valid(datos_raw)). Usado por el módulo separado /clientes,
pero podría ser cruzado por reportes en el futuro (segmentación demográfica,
actividad última visita, etc.).
2.9 ⚡ Inventario de índices
Total: ~80 índices repartidos en las 33 tablas. Más críticos:
| Tabla | Índices | Compuesto importante |
|---|---|---|
ventas | 12 (PK + 11 KEY) | idx_mes_anio (idEmpresa, fechaComprobate) |
caja_gastos | 8 (PK + 7 KEY) | idx_periodo (mes, anio) |
caja_raw_egresos_caja | 6 | idx_empresa_caja (empresa, caja_nro) · idx_periodo |
caja_raw_gastos_tipificados | 9 | idx_me (serie, numero, empresa) · forma_pago · centro_cc · acreedor |
caja_raw_movimiento_resumido | 10 | idx_me · cuenta · origen · pago · anulado |
cashflow_cheques_cartera | 7 | presentación · estado · cliente · banco |
articulos_raw | 5 | proveedor · anulado · tipo_merc · unidad_med |
articulos_precios | 2 | PK id_articulo · des_articulo |
catalogo_usuarios | 3 | email UK · id_cliente |
Índices propuestos (PERF)
- PERF-02
ALTER TABLE ventas ADD INDEX idx_sync_anulado (sync_id, anulado, dsArticulo)— cubre la mayoría de queries del dashboard. - PERF-03
ALTER TABLE ventas ADD INDEX idx_sync_supervisor (sync_id, dsSupervisor)— para drill-downs. - PERF-04
ALTER TABLE caja_raw_gastos_tipificados ADD INDEX idx_anio_rubro (YEAR(fecha_comp), rubro_id)— Finanzas filtra por año constantemente. Requiere columna calculada o usarfecha_compdirecto. - PERF-05
FULLTEXTennombreClienteydsArticulopara búsquedas del cross-filter.
2.10 🔗 Foreign Keys actuales y propuestas
FK declarada (sólo 1)
ALTER TABLE ventas
ADD CONSTRAINT fk_ventas_sync
FOREIGN KEY (sync_id) REFERENCES sincronizaciones(id) ON DELETE CASCADE;
FKs propuestas (ver §11 propuesta ARQ-04)
-- 1) caja: hacer cascade limpio en sync_id
ALTER TABLE caja_gastos ADD CONSTRAINT fk_cg_sync FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE caja_raw_egresos_caja ADD CONSTRAINT fk_rec_sync FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE caja_raw_egresos_detalle ADD CONSTRAINT fk_red_sync FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE caja_raw_gastos_tipificados ADD CONSTRAINT fk_rgt_sync FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE caja_raw_movimiento_detalle ADD CONSTRAINT fk_rmd_sync FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE caja_raw_movimiento_resumido ADD CONSTRAINT fk_rmr_sync FOREIGN KEY (sync_id) REFERENCES caja_sincronizaciones(id) ON DELETE CASCADE;
-- 2) cashflow: idem
ALTER TABLE cashflow_cartera_clientes ADD CONSTRAINT fk_ccc_sync FOREIGN KEY (sync_id) REFERENCES cashflow_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE cashflow_cartera_proveedores ADD CONSTRAINT fk_ccp_sync FOREIGN KEY (sync_id) REFERENCES cashflow_sincronizaciones(id) ON DELETE CASCADE;
ALTER TABLE cashflow_cheques_cartera ADD CONSTRAINT fk_cch_sync FOREIGN KEY (sync_id) REFERENCES cashflow_sincronizaciones(id) ON DELETE CASCADE;
-- 3) articulos: precio referencia catálogo
ALTER TABLE articulos_precios ADD CONSTRAINT fk_ap_articulo FOREIGN KEY (id_articulo) REFERENCES articulos_raw(codigo) ON DELETE CASCADE;
ALTER TABLE articulos_agrupaciones ADD CONSTRAINT fk_ag_articulo FOREIGN KEY (id_articulo) REFERENCES articulos_raw(codigo) ON DELETE CASCADE;
reset_db.php, evita huérfanos por bugs futuros,
y deja a la BD ser la fuente de verdad de la integridad.
2.11 ⚠️ Observaciones generales sobre la BD
Bien hecho
- ✅ InnoDB en 100% — soporta transacciones y FKs.
- ✅
utf8mb4universal — soporta emojis y caracteres extendidos. - ✅ Tipos nativos (DECIMAL/INT/DATE) en vez de JSON o VARCHAR — JOINs eficientes.
- ✅
AUTO_INCREMENTconUNSIGNEDdonde corresponde. - ✅ Schemas con
ALTER TABLEdefensivos en try/catch → migraciones idempotentes sin downtime. - ✅
ON UPDATE CURRENT_TIMESTAMPen catálogos para detectar staleness. - ✅
UNIQUE KEY uk_mes_anioen sincronizaciones — previene duplicados. - ✅ JSON validado (
CHECK json_valid(datos_raw)) enclientes_raw.
Pendientes / mejoras
- ⚠️ Sólo 1 FK declarada (ver §2.10).
- ⚠️ Falta índice compuesto
(sync_id, anulado)enventas. - ⚠️
CAST(idArticulo AS UNSIGNED)en JOIN inhibe uso del índice → considerarALTER TABLE ventas MODIFY idArticulo INT. - ⚠️ Catálogos
articulos_raw_tipos_mercaderia/unidades_medidavacíos — el ERP no los exporta o no se subieron. - ⚠️ Sin particionado (MariaDB
PARTITION BY RANGE (sync_id)sería útil cuandoventassupere 10M filas). - ⚠️ Sin vistas materializadas — todos los agregados se recalculan en cada hit.
- ⚠️ Sin
CHECK constraintsa nivel BD (ej.monto >= 0en gastos no aplicaría, hay devoluciones).
Tamaño en disco estimado
Sin acceso al filesystem real del servidor, estimando por filas × longitud promedio:
| Tabla | Filas | Bytes/fila aprox. | Tamaño aprox. |
|---|---|---|---|
ventas | 515K | 1.500 | ~780 MB |
caja_raw_egresos_detalle | 262K | 200 | ~55 MB |
caja_raw_gastos_tipificados | 28K | 800 | ~22 MB |
caja_raw_movimiento_detalle | 22K | 600 | ~13 MB |
articulos_raw | 8K | 1.200 | ~9 MB |
clientes_raw | 3K | 2.000 (JSON) | ~6 MB |
articulos_agrupaciones | 23K | 100 | ~2 MB |
| Total estimado | ~900 MB | ||
El dump SQL (765 MB) está cerca del tamaño en disco — coherente.