Esquema de Base de Datos

Modelo de datos de BCNExtractor, tablas, relaciones y decisiones de diseño.

Arquitectura de Datos

La base de datos utiliza PostgreSQL como motor principal, aprovechando sus capacidades para el manejo de tipos JSONB y búsqueda de texto completo (Full-Text Search). El diseño se centra en la relación muchos-a-muchos entre normas e instituciones.

┌──────────────┐         ┌─────────────────────────────────┐         ┌────────────┐
│ tipos_normas │<────────│              normas             │<────────│ descargas  │
│              │  N : 1  │                                 │  N : 1  │            │
└──────────────┘         └─────────────────────────────────┘         └────────────┘
                                          ▲
                                          │  N : 1
                                          │
                         ┌─────────────────────────────────┐
                         │      normas_instituciones       │
                         └─────────────────────────────────┘
                                          │
                                          │  N : 1
                                          ▼
                         ┌─────────────────────────────────┐
                         │         instituciones           │
                         └─────────────────────────────────┘
            

La relación central es normas ↔ instituciones, resuelta mediante la tabla pivot normas_instituciones.

Tablas del Sistema

normas

Almacena los metadatos estructurados y el contenido procesado de cada norma legal.

Columna Tipo Descripción
idINTEGER (PK)ID original de la BCN
id_tipoINTEGER (FK)Referencia a tipos_normas
tituloTEXTTítulo oficial (indexado GIN)
contenido_textoTEXTTexto plano extraído
metadata_jsonJSONBMetadatos flexibles y dinámicos
hash_xmlVARCHAR(32)MD5 para control de cambios

instituciones

Entidades gubernamentales que agrupan normativas.

Columna Tipo Descripción
idINTEGER (PK)ID de institución en la BCN
nombreTEXTNombre oficial de la institución
fecha_agregadaTIMESTAMPFecha de registro en el sistema

descargas

Log histórico de todas las operaciones de sincronización y descarga.

Columna Tipo Descripción
idSERIAL (PK)ID autogenerado
estadoVARCHAR"exitosa" o "error"
error_mensajeTEXTTraza del error en caso de falla

Decisiones de Diseño

IDs de la BCN como Claves Primarias

Se utilizan los IDs originales de la BCN para normas e instituciones. Esto elimina la necesidad de tablas de mapeo y simplifica los upserts durante la sincronización masiva.

Uso de JSONB para Metadatos

Dado que la estructura de los metadatos de la BCN varía según el tipo de norma (materias, organismos, tratados), JSONB permite flexibilidad sin penalizar el rendimiento de búsqueda gracias a los índices GIN.

Detección de Cambios (Hash MD5)

Antes de actualizar una norma en la base de datos, se compara el hash MD5 del XML descargado con el almacenado. Si son idénticos, se evita el I/O innecesario, optimizando drásticamente los procesos de sincronización masiva.

Full-Text Search

La búsqueda en el sistema utiliza la configuración de idioma spanish de PostgreSQL para manejar stemming y stop-words.

-- Creación del índice para búsqueda rápida
CREATE INDEX idx_normas_titulo
  ON normas USING gin(to_tsvector('spanish', titulo));

-- Ejemplo de consulta interna
SELECT id, titulo FROM normas
WHERE to_tsvector('spanish', titulo) @@ plainto_tsquery('spanish', 'medio ambiente')
   OR titulo ILIKE '%medio ambiente%';

La consulta combina FTS para eficiencia semántica con un fallback ILIKE para garantizar coincidencias literales exactas.

Resumen de Índices

Tabla Índice Tipo Propósito
normasidx_normas_tituloGINBúsqueda rápida por título
normasidx_normas_tipoB-treeJOIN con tipos_normas
normasidx_normas_estadoB-treeFiltro de vigencia
tipos_normasidx_tipos_normas_nombreB-treeBúsqueda por nombre único