Inicializar rioCata - Sistema de Catación de Café

- Base de datos PostgreSQL 16 con extensiones JSONB y arrays
- Docker Compose para containerización
- Scripts SQL de inicialización (schema, funciones, índices, datos de prueba)
- Suite de tests de validación (18 tests)
- Queries de ejemplo (17 queries)
- Script helper para gestión (scripts/riocata.sh)
- Documentación completa en README.md

Estructura:
- 4 tablas principales: sesion, auth.users, sesion_participante, muestra, evaluacion
- Tipo ENUM para defectos
- 2 triggers automáticos (updated_at, puntaje_final)
- 19 índices de optimización (GIN, B-tree, funcionales)
- Constraints de validación para arrays y JSONB
- 2 funciones auxiliares para análisis
This commit is contained in:
2025-10-17 17:00:48 -06:00
commit f682c3db51
11 changed files with 2166 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
-- ============================================
-- rioCata - Índices para Optimización
-- ============================================
-- ============================================
-- ÍNDICES EN CLAVES FORÁNEAS
-- ============================================
CREATE INDEX idx_sesion_participante_sesion_id ON sesion_participante(sesion_id);
CREATE INDEX idx_sesion_participante_catador_id ON sesion_participante(catador_id);
CREATE INDEX idx_muestra_sesion ON muestra(sesion_id);
CREATE INDEX idx_eval_muestra ON evaluacion(muestra_id);
CREATE INDEX idx_eval_participante ON evaluacion(sesion_participante_id);
-- ============================================
-- ÍNDICES EN CAMPOS ESPECÍFICOS
-- ============================================
-- Índice para búsquedas por tipo de defecto
CREATE INDEX idx_eval_defecto ON evaluacion(defecto);
-- Índice para búsquedas por puntaje final
CREATE INDEX idx_eval_puntaje_final ON evaluacion(puntaje_final DESC);
-- ============================================
-- ÍNDICES GIN PARA JSONB Y ARRAYS
-- ============================================
-- Índices GIN para consultas de contención en JSONB
CREATE INDEX idx_eval_json_intensidades ON evaluacion USING GIN (intensidades jsonb_path_ops);
CREATE INDEX idx_eval_aroma_notas ON evaluacion USING GIN (fragancia_aroma_notas);
CREATE INDEX idx_eval_sabor_notas ON evaluacion USING GIN (sabor_notas);
-- Índices GIN para arrays (permite consultas con @>, &&, etc.)
CREATE INDEX idx_eval_tazas_defectuosas ON evaluacion USING GIN (tazas_defectuosas);
CREATE INDEX idx_eval_tazas_no_uniformes ON evaluacion USING GIN (tazas_no_uniformes);
CREATE INDEX idx_eval_sensacion_boca ON evaluacion USING GIN (sensacion_en_boca);
CREATE INDEX idx_eval_gustos_predominantes ON evaluacion USING GIN (gustos_predominantes);
-- ============================================
-- ÍNDICES FUNCIONALES (OPCIONALES)
-- ============================================
-- Índices funcionales para consultas frecuentes sobre valores específicos en intensidades
-- Estos son opcionales pero mejoran el rendimiento de queries que filtran por valores afectivos específicos
-- Ejemplo: filtrar por acidez afectiva >= 8
CREATE INDEX idx_eval_int_acidez_afectiva
ON evaluacion ( ((intensidades->'acidez'->>'afectiva')::int) );
-- Ejemplo: filtrar por dulzor afectivo >= 8
CREATE INDEX idx_eval_int_dulzor_afectivo
ON evaluacion ( ((intensidades->'dulzor'->>'afectiva')::int) );
-- Ejemplo: filtrar por sabor afectivo >= 8
CREATE INDEX idx_eval_int_sabor_afectivo
ON evaluacion ( ((intensidades->'sabor'->>'afectiva')::int) );
-- ============================================
-- ÍNDICES DE TEXTO (PARA BÚSQUEDA)
-- ============================================
-- Índice para búsqueda de texto en otras_notas
CREATE INDEX idx_eval_otras_notas_gin ON evaluacion USING GIN (to_tsvector('spanish', COALESCE(otras_notas, '')));
-- Índice para búsqueda en nombres de sesión
CREATE INDEX idx_sesion_nombre_gin ON sesion USING GIN (to_tsvector('spanish', COALESCE(nombre, '')));
-- ============================================
-- COMENTARIOS
-- ============================================
COMMENT ON INDEX idx_eval_json_intensidades IS 'Índice GIN para consultas de contención en intensidades (jsonb_path_ops)';
COMMENT ON INDEX idx_eval_tazas_defectuosas IS 'Índice GIN para búsquedas de tazas defectuosas específicas';
COMMENT ON INDEX idx_eval_int_acidez_afectiva IS 'Índice funcional para filtros por valor afectivo de acidez';