Exportacion de Datos Taxonomicos
Documentacion tecnica y descarga de estructuras de datos para integracion con sistemas externos
Modelo de Datos Relacional
El sistema de taxonomias implementa un modelo de datos jerarquico normalizado que permite la clasificacion multidimensional de entidades institucionales. La arquitectura sigue los principios de la Tercera Forma Normal (3FN), separando las tablas de catalogos (categorias) de las tablas de entidades y utilizando tablas intermedias para gestionar las relaciones muchos-a-muchos.
Se distinguen tres tipos de artefactos de datos: (1) Catalogos de Categorias, que definen las taxonomias abstractas mediante estructuras de arbol con auto-referencia; (2) Tablas de Relacion, que implementan el mapeo entre entidades concretas y categorias; y (3) Vistas Desnormalizadas, que consolidan la informacion para facilitar consultas de lectura.
DIAGRAMA ENTIDAD-RELACION SIMPLIFICADO
┌─────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────┐
│ CATEGORIA │ │ RELACION_ENTIDAD_CAT │ │ ENTIDAD (BD ext.) │
├─────────────────────┤ ├─────────────────────────┤ ├─────────────────────┤
│ PK id │◄──────┤ FK id_categoria │ │ PK id │
│ nombre │ 1:N │ FK id_entidad ─────────┼──────►│ nombre │
│ FK parent_id ──────┼───┐ │ nombre_entidad │ N:1 │ ... │
│ nivel │ │ └─────────────────────────┘ └─────────────────────┘
│ descripcion │ │ N:M
└─────────────────────┘ │ (Una entidad puede tener
│ │ multiples categorias;
└───────────────┘ una categoria puede
Auto-referencia aplicar a multiples
(jerarquia) entidades)
Catalogos de Categorias (Tablas Maestras)
Estructuras taxonomicas jerarquicas - Solo metadatos de clasificacion
Definicion y Proposito
Los catalogos de categorias constituyen tablas maestras de referencia que definen vocabularios
controlados para la clasificacion de entidades. Cada catalogo implementa una estructura de arbol
mediante auto-referencia (patron Adjacency List), donde el campo parent_id
establece la relacion padre-hijo entre registros de la misma tabla.
Estas tablas no contienen datos transaccionales ni entidades reales; unicamente definen
las categorias abstractas disponibles para clasificacion. La integridad referencial se mantiene mediante
restricciones de clave foranea que apuntan a la misma tabla (auto-referencia) con ON DELETE RESTRICT
para prevenir la eliminacion de categorias con hijos dependientes.
El campo nivel es un valor derivado (desnormalizado) que indica la profundidad
del nodo en el arbol, donde nivel 0 representa la raiz. Este campo facilita consultas de filtrado por
profundidad sin necesidad de recursion.
Cardinalidad
Auto-referencia 1:N (un padre puede tener multiples hijos)
Integridad
FK parent_id → id (misma tabla), NULL permitido solo en raices
Indices recomendados
PRIMARY(id), INDEX(parent_id), INDEX(nivel)
DEFINICION DE ESQUEMA (DDL)
CREATE TABLE categoria_taxonomia (
id INTEGER PRIMARY KEY, -- Identificador unico de la categoria
nombre VARCHAR(200) NOT NULL, -- Nombre descriptivo de la categoria
parent_id INTEGER NULL, -- FK a categoria padre (NULL = raiz)
nivel SMALLINT NOT NULL DEFAULT 0,-- Profundidad en el arbol (0 = raiz)
descripcion TEXT, -- Descripcion extendida opcional
CONSTRAINT fk_parent
FOREIGN KEY (parent_id) REFERENCES categoria_taxonomia(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT chk_nivel CHECK (nivel >= 0),
CONSTRAINT chk_root CHECK (
(parent_id IS NULL AND nivel = 0) OR
(parent_id IS NOT NULL AND nivel > 0)
)
);
-- Indices para optimizacion de consultas jerarquicas
CREATE INDEX idx_parent ON categoria_taxonomia(parent_id);
CREATE INDEX idx_nivel ON categoria_taxonomia(nivel);
Taxonomia: Cargo/Puesto
Clasificacion ocupacional del personal
| Total de categorias | 29 |
| Profundidad maxima | 4 niveles (0-3) |
| Rango de IDs | 1000 - 1999 |
| Nodos raiz | 1 (id=1000) |
| Nodos hoja | 16 |
Taxonomia: Dependencias
Clasificacion de unidades organizacionales
| Total de categorias | 27 |
| Profundidad maxima | 3 niveles (0-2) |
| Rango de IDs | 2000 - 2999 |
| Nodos raiz | 1 (id=2000) |
| Nodos hoja | 23 |
Taxonomia: Ramos Juridicos
Materias del derecho aplicables
| Total de categorias | 14 |
| Profundidad maxima | 2 niveles (0-1) |
| Rango de IDs | 3000 - 3999 |
| Nodos raiz | 1 (id=3000) |
| Nodos hoja | 13 |
FORMATO JSON - ESTRUCTURA JERARQUICA ANIDADA
Estructura Padre → Hijo (top-down): el arbol inicia en la raiz (nivel 0) y los descendientes estan en el array hijos. Facilita renderizado de TreeView.
{
"metadata": {
"nombre": "cargo_puesto",
"version": "3.0_reorganizada",
"total_categorias": 29
},
"jerarquia": [
{
"id": 1000,
"nombre": "TODO EL PERSONAL",
"observaciones": "NIVEL_0",
"hijos": [
{
"id": 1100,
"nombre": "FUNCIONARIOS JUDICIALES",
"observaciones": "NIVEL_1",
"hijos": [
{
"id": 1110,
"nombre": "MAGISTRATURAS",
"observaciones": "NIVEL_2",
"hijos": []
},
{
"id": 1120,
"nombre": "JUDICATURAS",
"observaciones": "NIVEL_2",
"hijos": []
}
]
}
// ... mas nodos
]
}
]
}
FORMATO CSV - TABLA PLANA CON REFERENCIAS
Formato tabular apto para importacion directa a RDBMS. La jerarquia se reconstruye via JOINs.
id,nombre,parent_id,nivel 1000,TODO EL PERSONAL,,0 1100,FUNCIONARIOS JUDICIALES,1000,1 1110,MAGISTRATURAS,1100,2 1120,JUDICATURAS,1100,2 1200,AUXILIARES JUDICIALES,1000,1 1210,SECRETARIOS JUDICIALES,1200,2 1220,OFICIALES JUDICIALES,1200,2 1230,DILIGENCIAMIENTO Y EJECUCION,1200,2 1600,PERSONAL ADMINISTRATIVO Y TECNICO,1000,1 1300,PERSONAL TECNICO Y PROFESIONAL,1600,2 1310,ASESORIA JURIDICA DE ALTO NIVEL,1300,3 1320,ASESORIA ESPECIALIZADA,1300,3 ...
Query para obtener hijos directos:
SELECT * FROM categorias WHERE parent_id = 1000;
Tablas de Relaciones (Mapeo Entidad-Categoria)
Tablas intermedias que implementan la relacion muchos-a-muchos
Definicion y Proposito
Las tablas de relaciones implementan el patron de tabla asociativa (junction table) para resolver
la relacion muchos-a-muchos entre entidades y categorias. El campo id_entidad
corresponde a la clave primaria de la entidad en el sistema origen (base de datos institucional externa),
permitiendo realizar operaciones JOIN sin necesidad de transformacion de identificadores.
Cada registro representa una asignacion atomica de una categoria a una entidad. Una misma entidad puede tener multiples registros en la tabla (uno por cada categoria asignada), lo que implementa la herencia de categorias jerarquicas: cuando una entidad pertenece a una categoria de nivel N, tambien se registra su pertenencia a todas las categorias ancestro hasta la raiz.
El campo nombre_entidad es un atributo desnormalizado incluido por conveniencia
para facilitar la lectura humana de los datos exportados; en un modelo estrictamente normalizado, este campo
se obtendria mediante JOIN con la tabla de entidades del sistema origen.
Cardinalidad
N:M (muchos-a-muchos) resuelta mediante tabla asociativa
Clave compuesta
PK(id_entidad, id_categoria) previene duplicados
Integridad referencial
FK id_categoria → categoria(id); id_entidad → sistema externo
Origen de los Identificadores (id_entidad)
Los valores de id_entidad provienen de los archivos maestros del sistema
institucional. La cobertura de IDs originales varia segun el tipo de entidad, dependiendo de su presencia en las
fuentes de datos primarias.
cargo_puestos.csv
Tabla maestra que relaciona cargos con puestos funcionales.
Provee: 73 IDs de cargos, 307 IDs de puestos
arbol_dependencias.csv
Estructura jerarquica de unidades organizacionales.
Provee: 1,805 IDs de dependencias
Cobertura de IDs Originales
| Cargos | 68/73 (93%) |
| Puestos | 295/301 (98%) |
| Dependencias | 1,805/1,805 (100%) |
Entidades sin ID: usar nombre como clave de union.
Diagrama de flujo de IDs:
cargo_puestos.csv ──────┬──► Cargos (CARGO → id_entidad)
└──► Puestos (PUESTO → id_entidad)
arbol_dependencias.csv ────► Dependencias (DEPENDENCIA → id_entidad)
DEFINICION DE ESQUEMA (DDL) - TABLA ASOCIATIVA
CREATE TABLE relacion_entidad_categoria (
id_entidad INTEGER NOT NULL, -- FK a entidad en sistema origen (BD externa)
id_categoria INTEGER NOT NULL, -- FK a categoria en tabla maestra local
nombre_entidad VARCHAR(300), -- Desnormalizado para conveniencia
PRIMARY KEY (id_entidad, id_categoria), -- Clave compuesta evita duplicados
CONSTRAINT fk_categoria
FOREIGN KEY (id_categoria) REFERENCES categoria_taxonomia(id)
ON DELETE CASCADE ON UPDATE CASCADE
-- NOTA: id_entidad referencia tabla externa, no se puede declarar FK local
);
-- Indices para optimizacion de consultas bidireccionales
CREATE INDEX idx_entidad ON relacion_entidad_categoria(id_entidad);
CREATE INDEX idx_categoria ON relacion_entidad_categoria(id_categoria);
-- Query tipico: obtener todas las categorias de una entidad
SELECT c.id, c.nombre, c.nivel
FROM relacion_entidad_categoria r
JOIN categoria_taxonomia c ON r.id_categoria = c.id
WHERE r.id_entidad = ?
ORDER BY c.nivel;
Relacion: Cargo → Categoria Ocupacional
| Entidades unicas (cargos) | 73 |
| Total de registros | 221 |
| Promedio cat/entidad | 3.03 |
| Taxonomia destino | cargo_puesto (1xxx) |
| Profundidad asignada | Niveles 0-3 |
Ejemplo de asignacion con herencia jerarquica:
Esto genera 4 registros en la tabla de relacion.
Relacion: Puesto → Categoria Ocupacional
| Entidades unicas (puestos) | 301 |
| Total de registros | 907 |
| Promedio cat/entidad | 3.01 |
| Taxonomia destino | cargo_puesto (1xxx) |
| Profundidad asignada | Niveles 0-3 |
Ejemplo de asignacion con herencia jerarquica:
Esto genera 3 registros en la tabla de relacion.
Relacion: Dependencia → Categoria Organizacional
| Entidades unicas (dependencias) | 1,805 |
| Total de registros | 5,415 |
| Promedio cat/entidad | 3.00 |
| Taxonomia destino | dependencias (2xxx) |
| Profundidad asignada | Niveles 0-2 |
Ejemplo de asignacion con herencia jerarquica:
Exactamente 3 registros por dependencia.
Relacion: Dependencia → Ramo Juridico
| Entidades unicas (dependencias) | 1,805 |
| Total de registros | 3,610 |
| Promedio ramos/entidad | 2.00 |
| Taxonomia destino | ramos (3xxx) |
| Cardinalidad real | 1-4 ramos/dep |
Ejemplo de asignacion multiple (juzgado mixto):
4 registros: raiz + 3 ramos especificos.
FORMATO JSON - ENTIDAD CON ARBOL DE CATEGORIAS
Estructura Padre → Hijo (top-down): inicia en la raiz y desciende via array hijos. El campo id_entidad solo aparece cuando existe en la BD origen.
{
"metadata": {
"tipo_relacion": "cargo_categoria",
"tipo_entidad": "cargo",
"total_entidades": 73,
"entidades_con_id_original": 68,
"total_relaciones": 221,
"nota": "id_entidad es el ID original de la BD institucional..."
},
"entidades": [
{
"id_entidad": 40, // ID original de BD institucional
"nombre": "AGENTE DE SEGURIDAD",
"tipo": "cargo",
"categorias_arbol": [...]
},
{
"id_entidad": 3,
"nombre": "GERENTE",
"tipo": "cargo",
"categorias_arbol": [
{
"id": 1000,
"nombre": "TODO EL PERSONAL",
"nivel": 0,
"hijos": [
{
"id": 1600,
"nombre": "PERSONAL ADMIN. Y TECNICO",
"hijos": [...]
}
]
}
]
},
{
// Sin id_entidad = no existe en archivo fuente
"nombre": "AUXILIAR MISCELANEO",
"tipo": "cargo",
"categorias_arbol": [...]
}
]
}
FORMATO CSV - TABLA ASOCIATIVA PLANA
Formato para importacion directa. Los IDs originales provienen de los archivos maestros institucionales.
id_entidad,id_categoria,nombre_entidad 3,1000,GERENTE 3,1600,GERENTE 3,1400,GERENTE 3,1410,GERENTE 604,1000,JUEZ DE INSTANCIA 604,1100,JUEZ DE INSTANCIA 604,1120,JUEZ DE INSTANCIA 40,1000,AGENTE DE SEGURIDAD 40,1500,AGENTE DE SEGURIDAD 40,1550,AGENTE DE SEGURIDAD 0,1000,AUXILIAR MISCELANEO // 0 = sin ID original ...
Query para obtener entidades de una categoria (con descendientes):
-- Obtener todos los cargos bajo "FUNCIONARIOS JUDICIALES" (1100) WITH RECURSIVE descendientes AS ( SELECT id FROM categorias WHERE id = 1100 UNION ALL SELECT c.id FROM categorias c JOIN descendientes d ON c.parent_id = d.id ) SELECT DISTINCT r.id_entidad, r.nombre_entidad FROM relacion_cargo_cat r WHERE r.id_categoria IN (SELECT id FROM descendientes);
Vistas Desnormalizadas (Entidades Consolidadas)
Proyecciones optimizadas para consultas de lectura - Un registro por entidad
Definicion y Proposito
Las vistas desnormalizadas constituyen proyecciones pre-calculadas que consolidan toda la informacion de categorizacion de una entidad en un unico registro. A diferencia de las tablas de relacion (que generan multiples filas por entidad), estas vistas implementan un patron de agregacion donde las categorias se almacenan como arrays o campos concatenados.
Este enfoque sacrifica la normalizacion a cambio de optimizacion en lecturas: elimina la necesidad de JOINs y agregaciones en tiempo de consulta. Es especialmente util para implementar tablas de lookup en memoria, caches de aplicacion, o alimentar sistemas de busqueda que requieren acceso O(1) a la categorizacion completa de una entidad.
El formato JSON incluye la ruta completa de navegacion (breadcrumb) para cada categoria, facilitando la construccion de interfaces de usuario que muestren el contexto jerarquico sin consultas adicionales. El formato CSV utiliza campos multivaluados separados por pipe (|) para compatibilidad con herramientas de importacion que no soportan arrays nativos.
Nivel de normalizacion
1FN (campos multivaluados) - Desnormalizado intencionalmente
Caso de uso optimo
Caches, indices de busqueda, APIs de solo lectura
Trade-off
Duplicacion de datos vs. velocidad de acceso
Vista: Puestos Consolidados
| Total de registros | 301 |
| Taxonomia incluida | cargo_puesto |
| Campos por registro | id, nombre, cats[] |
Estructura de registro JSON:
{
"id_entidad": 4004, // ID original
"nombre": "JUEZ DE PAZ V",
"categorias": [
{
"id": 1120,
"nombre": "JUDICATURAS",
"nivel": 2,
"ruta": "TODO EL PERSONAL >
FUNCIONARIOS JUDICIALES >
JUDICATURAS"
}
]
}
Vista: Cargos Consolidados
| Total de registros | 73 |
| Taxonomia incluida | cargo_puesto |
| Campos por registro | id, nombre, cats[] |
Estructura de registro JSON:
{
"id_entidad": 3, // ID original
"nombre": "GERENTE",
"categorias": [
{
"id": 1410,
"nombre": "ALTA DIRECCION",
"nivel": 3,
"ruta": "TODO EL PERSONAL >
PERS. ADMIN. Y TECNICO >
PERS. ADMINISTRATIVO >
ALTA DIRECCION"
}
]
}
Vista: Dependencias Consolidadas
| Total de registros | 1,805 |
| Taxonomias incluidas | dependencias + ramos |
| Campos por registro | id, nombre, cats[], ramos[] |
Estructura de registro JSON (dual):
{
"id_entidad": 123,
"nombre": "JUZGADO MIXTO...",
"categorias_dependencia": [
{"id": 2150, "nombre": "JUZGADOS DE PAZ",
"ruta": "TODAS > JURISD > PAZ"}
],
"ramos": [
{"id": 3010, "nombre": "RAMO PENAL",
"ruta": "TODOS > PENAL"},
{"id": 3020, "nombre": "RAMO CIVIL",
"ruta": "TODOS > CIVIL"}
]
}
FORMATO JSON - REGISTRO CONSOLIDADO COMPLETO
{
"metadata": {
"tipo_entidad": "dependencia",
"taxonomias": ["dependencias", "ramos"],
"total_entidades": 1805,
"entidades_con_id_original": 1805, // 100% cobertura
"nota": "id_entidad es el ID original de la BD institucional..."
},
"entidades": [
{
"id_entidad": 123, // ID de arbol_dependencias.csv
"nombre": "JUZGADO PRIMERO DE PAZ CIVIL GUATEMALA",
"tipo": "dependencia",
"categorias_dependencia": [
{
"id": 2000,
"nombre": "TODAS LAS DEPENDENCIAS",
"nivel": 0,
"ruta": "TODAS LAS DEPENDENCIAS"
},
{
"id": 2100,
"nombre": "DEPENDENCIAS JURISDICCIONALES",
"nivel": 1,
"ruta": "TODAS > JURISDICCIONALES"
},
{
"id": 2150,
"nombre": "JUZGADOS DE PAZ",
"nivel": 2,
"ruta": "TODAS > JURISDICCIONALES > JUZGADOS DE PAZ"
}
],
"ramos": [
{
"id": 3000,
"nombre": "TODOS LOS RAMOS",
"nivel": 0,
"ruta": "TODOS LOS RAMOS"
},
{
"id": 3020,
"nombre": "RAMO CIVIL",
"nivel": 1,
"ruta": "TODOS LOS RAMOS > RAMO CIVIL"
}
]
}
]
}
FORMATO CSV - CAMPOS MULTIVALUADOS
nombre_dependencia,categorias_ids,ramos_ids JUZGADO PRIMERO DE PAZ CIVIL GUATEMALA,2000|2100|2150,3000|3020 JUZGADO SEGUNDO DE TRABAJO GUATEMALA,2000|2100|2140,3000|3040 SALA PRIMERA CIVIL CORTE APELACIONES,2000|2100|2120,3000|3020 GERENCIA FINANCIERA,2000|2200|2220,3000|3130 CENTRO DE MEDIACION QUETZALTENANGO,2000|2300|2370,3000|3130 ...
Para procesar campos multivaluados en SQL:
-- PostgreSQL: convertir campo | a array
SELECT
nombre_dependencia,
string_to_array(categorias_ids, '|')::integer[] as cat_array
FROM dependencias_consolidadas
WHERE '2150' = ANY(string_to_array(categorias_ids, '|'));
-- MySQL: buscar dentro de campo concatenado
SELECT * FROM dependencias_consolidadas
WHERE FIND_IN_SET('2150', REPLACE(categorias_ids, '|', ','));
Grafo Completo de la Taxonomia Institucional
Exportacion integral del arbol organizacional con todas las relaciones
Este archivo contiene la representacion completa del grafo organizacional del Organismo Judicial, incluyendo las 1,805 dependencias organizadas en su jerarquia natural (hasta 4 niveles de profundidad), con los puestos asignados a cada dependencia como nodos terminales.
La estructura implementa un arbol n-ario serializado donde cada nodo contiene: identificador unico, nombre, nivel jerarquico, referencia al padre, lista de hijos (recursiva), y lista de puestos. El archivo resultante (~3 MB) es util para: (a) reconstruir la estructura completa en memoria, (b) analisis offline de la organizacion, (c) backup de la taxonomia, (d) alimentar sistemas de visualizacion de grafos.
taxonomia_completa.json
Guia de Seleccion de Artefacto
| Caso de Uso | Artefacto Recomendado | Formato | Justificacion Tecnica |
|---|---|---|---|
| Poblar componente TreeView/Dropdown | Seccion 1: Catalogos | JSON | Estructura ya anidada, mapeo directo a componentes recursivos |
| Importar a RDBMS como tabla maestra | Seccion 1: Catalogos | CSV | Formato tabular con FK explicita, COPY/LOAD directo |
| JOIN con tabla de empleados existente | Seccion 2: Relaciones | CSV | id_entidad coincide con PK de sistema origen |
| Cache en memoria / HashMap | Seccion 3: Entidades | JSON | Lookup O(1) por id_entidad, datos pre-agregados |
| Indice de busqueda (Elasticsearch, etc.) | Seccion 3: Entidades | JSON | Documentos autocontenidos, rutas como texto indexable |
| Backup / Migracion completa | Seccion 4: Completa | JSON | Grafo completo serializado, reconstruccion total |
Escuela de Estudios Judiciales
Eje Transversal de Tecnologia | Innovacion Juridico Tecnologico
Organismo Judicial de Guatemala - 2025