- 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
78 lines
3.4 KiB
SQL
78 lines
3.4 KiB
SQL
-- ============================================
|
|
-- 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';
|