Skip to content

Base de Datos

Archivo mapa.db

Go-MexPost utiliza una base de datos SQLite embebida (mapa.db) que se descarga desde el repositorio ETL oficial (sepomex-db-generator). No requiere instalación de ningún servidor de base de datos.

El driver utilizado es modernc.org/sqlite, una implementación 100% en Go (sin CGO) que garantiza compatibilidad cross-platform y despliegue simplificado.


Tablas

colonias — 145,420 registros

Tabla principal del sistema. Contiene todos los códigos postales de México con sus datos textuales y geoespaciales.

ColumnaTipoDescripción
codigoTEXTCódigo postal (5 dígitos, p.ej. 06700)
nombreTEXTNombre de la colonia (p.ej. Roma Norte)
tipoTEXTTipo de asentamiento (p.ej. Colonia, Fraccionamiento, Pueblo)
ciudadTEXTCiudad o delegación
zonaTEXTTipo de zona (Urbana, Rural, Semiurbana)
estado_idTEXTID del estado (2 chars, p.ej. 09)
municipio_idTEXTID del municipio (3 chars, p.ej. 014)
geometriaTEXTPolígono GeoJSON como string (puede ser NULL)
min_lonREALLongitud mínima del Bounding Box
min_latREALLatitud mínima del Bounding Box
max_lonREALLongitud máxima del Bounding Box
max_latREALLatitud máxima del Bounding Box
centro_lonREALLongitud del centroide (puede ser NULL)
centro_latREALLatitud del centroide (puede ser NULL)

¿Qué es el Bounding Box?

El BBox es el rectángulo mínimo que encierra completamente el polígono de una colonia. Se usa como filtro rápido en la geocodificación inversa antes de aplicar Ray-Casting:

        max_lat

   ┌───────┴───────┐
   │   polígono    │ max_lon
   │    real       │ ─────
   └───────┬───────┘

        min_lat
   min_lon

municipios — 2,458 registros

Catálogo de municipios de México.

ColumnaTipoDescripción
idTEXTIdentificador del municipio (3 chars, p.ej. 014)
nombreTEXTNombre del municipio (p.ej. Benito Juárez)
estado_idTEXTID del estado al que pertenece

estados — 32 registros

Catálogo de los 32 estados de la República Mexicana.

ColumnaTipoDescripción
idTEXTIdentificador del estado (2 chars, p.ej. 09)
nombreTEXTNombre del estado (p.ej. Ciudad de México)

Índices

La base de datos cuenta con 15 índices optimizados para las consultas más frecuentes:

Índices en colonias

ÍndiceColumnasPropósito
idx_colonia_codigocodigoBúsqueda por CP exacto o prefijo
idx_colonia_nombrenombre COLLATE NOCASEBúsqueda por nombre (case-insensitive)
idx_colonia_codigo_nombre(codigo, nombre)Búsqueda combinada CP + nombre
idx_colonia_estado_nombre(estado_id, nombre)Filtro por estado + nombre
idx_colonia_estado_codigo(estado_id, codigo)Filtro por estado + CP
idx_colonia_municipio_nombre(municipio_id, nombre)Filtro por municipio + nombre
idx_colonia_municipio_codigo(municipio_id, codigo)Filtro por municipio + CP
idx_colonia_geo_not_nullcodigo WHERE geometria IS NOT NULLÍndice parcial para colonias con geometría
idx_colonia_bbox(min_lat, max_lat, min_lon, max_lon)Prefiltrado BBox para geocodificación inversa
idx_colonia_estado_bbox(estado_id, min_lat, max_lat, min_lon, max_lon)BBox acotado por estado
idx_colonia_municipio_bbox(municipio_id, min_lat, max_lat, min_lon, max_lon)BBox acotado por municipio
idx_colonia_centro(centro_lat, centro_lon)Búsquedas por centroide

Índices en municipios

ÍndiceColumnasPropósito
idx_municipio_estadoestado_idListar municipios de un estado
idx_municipio_nombrenombre COLLATE NOCASEBúsqueda por nombre

Índices en estados

ÍndiceColumnasPropósito
idx_estado_nombrenombre COLLATE NOCASEBúsqueda por nombre

Queries dinámicas del repositorio

El repositorio en internal/adapters/repository/sqlite_repo.go construye queries de forma dinámica con parámetros posicionales para prevenir SQL injection.

SearchColonias — combinaciones de filtros

sql
-- Solo por CP (parcial ≥3 chars)
SELECT codigo, nombre, ... FROM colonias WHERE codigo LIKE '067%' ORDER BY codigo, nombre

-- Solo por nombre (parcial ≥3 chars, case-insensitive)
SELECT codigo, nombre, ... FROM colonias WHERE nombre LIKE '%roma%' COLLATE NOCASE ORDER BY codigo, nombre

-- CP + nombre combinados
SELECT codigo, nombre, ... FROM colonias
  WHERE codigo LIKE '067%'
    AND nombre LIKE '%roma%' COLLATE NOCASE
  ORDER BY codigo, nombre

-- Con municipio_id
SELECT codigo, nombre, ... FROM colonias
  WHERE nombre LIKE '%centro%' COLLATE NOCASE
    AND municipio_id = '014'
  ORDER BY codigo, nombre

-- Solo con geometría (solo_geo=true)
SELECT codigo, nombre, ... FROM colonias
  WHERE codigo LIKE '067%'
    AND geometria IS NOT NULL AND TRIM(geometria) <> ''
  ORDER BY codigo, nombre

SearchMunicipios

sql
-- Por nombre (parcial)
SELECT id, nombre, estado_id FROM municipios WHERE nombre LIKE '%zapopan%' COLLATE NOCASE ORDER BY nombre

-- Por estado
SELECT id, nombre, estado_id FROM municipios WHERE estado_id = '14' ORDER BY nombre