Resumen

Esta página es la referencia completa a nivel columna para las 12 tablas de la base de datos Popolo-Graph. Cada columna, su tipo, nulabilidad, restricciones y propósito están documentados aquí. Úsala como fuente autorizada al consultar la base de datos o construir análisis derivados.

Convenciones

:::note

  • Todas las fechas se almacenan en formato ISO 8601 (YYYY-MM-DD o YYYY-MM-DDTHH:MM:SS).
  • Todo el texto está codificado en UTF-8.
  • Las llaves foráneas se aplican (PRAGMA foreign_keys = ON).
  • NULL significa “no especificado” o “no aplica”. No se usan valores centinela.
  • Los campos identifiers_json contienen arreglos u objetos JSON válidos.
  • La columna "group" en la tabla vote usa comillas SQL porque group es una palabra reservada en SQLite.
  • Las eliminaciones en cascada en membership (person_id, org_id) aseguran integridad referencial cuando se elimina una persona u organización. :::

Tablas Principales

area

Áreas geográficas utilizadas para mapear distritos electorales, estados y circunscripciones.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo A01, A02, etc.
nombreTEXTNONombre del área (estado, distrito o circunscripción)
clasificacionTEXTNOCHECK IN (‘estado’,‘distrito’,‘circunscripcion’)Clasificación del área geográfica
parent_idTEXTYESFK → area(id)Área padre (ej. distrito dentro de un estado)
geometryTEXTYESGeometría GeoJSON opcional para visualización en mapa

organization

Partidos políticos, bancadas parlamentarias, coaliciones, organismos de gobierno y otras organizaciones.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo O01, O02, etc.
nombreTEXTNOUNIQUENombre oficial de la organización
abbrTEXTYESAbreviatura (MORENA, PAN, PRI, etc.)
clasificacionTEXTNOCHECK IN (‘partido’,‘bancada’,‘coalicion’,‘gobierno’,‘institucion’,‘otro’)Tipo de organización
fundacionTEXTYESFecha de fundación en formato ISO 8601
disolucionTEXTYESFecha de disolución en formato ISO 8601

person

Legisladores y otras personas rastreadas en el sistema.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo P01, P02, etc.
nombreTEXTNONombre completo de la persona
fecha_nacimientoTEXTYESFecha de nacimiento en formato ISO 8601
generoTEXTYESCHECK IN (‘M’,‘F’,‘NB’)Género: M=masculino, F=femenino, NB=no binario
curul_tipoTEXTYESCHECK IN (‘mayoria_relativa’,‘plurinominal’,‘suplente’)Tipo de curul: mayoría relativa, representación proporcional o suplente
circunscripcionINTEGERYESCHECK BETWEEN 1 AND 5Circunscripción electoral (1-5)
start_dateTEXTYESFecha de inicio del período legislativo
end_dateTEXTYESFecha de fin del período legislativo
corriente_internaTEXTYESIS NULL OR IN (‘Monreal’,‘AMLO’,‘Sheinbaum’,‘institucionalista’)Corriente interna del partido (para análisis de lealtad)
vulnerabilidadTEXTYESIS NULL OR IN (‘alta’,‘media’,‘baja’)Nivel estimado de vulnerabilidad (teoría de juegos)
observacionesTEXTYESNotas de texto libre sobre el legislador
identifiers_jsonTEXTYESJSON con identificadores externos (ej. {"sitl_id": 108})

membership

Vincula a una persona con una organización mediante un rol específico y un período de tiempo.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo M01, M02, etc.
person_idTEXTNOFK → person(id) ON DELETE CASCADEReferencia a la persona
org_idTEXTNOFK → organization(id) ON DELETE CASCADEReferencia a la organización
rolTEXTNORol dentro de la organización (diputado, senador, suplente)
labelTEXTYESDescripción legible (ej. “Diputado plurinominal, Circ. 4”)
start_dateTEXTNOFecha de inicio de la membresía
end_dateTEXTYESFecha de fin (NULL = activa actualmente)
on_behalf_ofTEXTYESFK → organization(id)Organización en cuyo nombre se ejerce el rol (ej. coalición)

post

Cargos formales dentro de una organización (cámara), opcionalmente vinculados a un área geográfica.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo T01, T02, etc.
org_idTEXTNOFK → organization(id)Organización (cámara) a la que pertenece el cargo
area_idTEXTYESFK → area(id)Área geográfica asociada al cargo
labelTEXTNODescripción legible del cargo
start_dateTEXTNOFecha de inicio del cargo
end_dateTEXTYESFecha de fin del cargo

motion

Iniciativas legislativas: reformas constitucionales, leyes secundarias y proyectos de ley ordinarios.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo Y01, Y02, etc.
textoTEXTNOTexto completo o resumen de la iniciativa
clasificacionTEXTNOCHECK IN (‘reforma_constitucional’,‘ley_secundaria’,‘ordinaria’,‘otra’)Tipo de iniciativa legislativa
requirementTEXTNOCHECK IN (‘mayoria_simple’,‘mayoria_calificada’,‘unanime’)Tipo de mayoría requerida para aprobar
resultTEXTYESIS NULL OR IN (‘aprobada’,‘rechazada’,‘pendiente’,‘retirada’)Resultado de la votación (NULL si aún no se vota)
dateTEXTYESFecha de la votación
legislative_sessionTEXTYESNombre del período legislativo (ej. “LXVI Legislatura”)
fuente_urlTEXTYESURL de la fuente oficial

vote_event

Un evento de votación específico (lista nominal) sobre una moción, realizado por una cámara.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo VE01, VE02, etc.
motion_idTEXTNOFK → motion(id)Referencia a la moción votada
start_dateTEXTNOFecha/hora en que inició el evento de votación
organization_idTEXTNOFK → organization(id)Cámara que realizó la votación
resultTEXTYESIS NULL OR IN (‘aprobada’,‘rechazada’,‘empate’)Resultado de la votación
sitl_idINTEGERYESIdentificador de votación del sistema SITL (parámetro votaciont)
voter_countINTEGERYESNúmero de legisladores que participaron
legislaturaTEXTYESIdentificador de legislatura (LX, LXI, …, LXVI)
requirementTEXTYESIS NULL OR IN (‘mayoria_simple’,‘mayoria_calificada’,‘unanime’)Requisito de mayoría (copiado de la moción)
source_idTEXTYESID del portal original para deduplicación entre fuentes
identifiers_jsonTEXTYESJSON con identificadores externos Popolo

vote

Voto individual emitido por un legislador en un evento de votación.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo V01, V02, etc.
vote_event_idTEXTNOFK → vote_event(id)Referencia al evento de votación
voter_idTEXTNOFK → person(id)Referencia al legislador que votó
optionTEXTNOCHECK IN (‘a_favor’,‘en_contra’,‘abstencion’,‘ausente’)Opción del voto: a favor, en contra, abstención, ausente
”group”TEXTYESPartido/bloque al que pertenecía el legislador al momento de votar

Nota: El nombre de columna group es una palabra reservada de SQLite y debe ir entre comillas en las consultas.


count

Conteos agregados de votos por opción y por partido dentro de un evento de votación.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo C01, C02, etc.
vote_event_idTEXTNOFK → vote_event(id)Referencia al evento de votación
optionTEXTNOCHECK IN (‘a_favor’,‘en_contra’,‘abstencion’,‘ausente’)Opción de voto que se está contando
valueINTEGERNOCHECK >= 0Número de votos en este conteo
group_idTEXTYESFK → organization(id)Partido que aporta estos votos

Tablas de Extensión

Estas tres tablas extienden el esquema Popolo para soportar análisis de redes de poder. Modelan actores políticos externos, relaciones entre entidades y eventos políticos que influyen en el comportamiento legislativo.

actor_externo

Actores políticos fuera del legislativo: gobernadores, presidentes municipales, ex presidentes, dirigentes partidistas, jueces y otros que influyen en los resultados legislativos.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo AE01, AE02, etc.
nombreTEXTNONombre completo del actor externo
tipoTEXTNOCHECK IN (‘gobernador’,‘alcalde’,‘ex_presidente’,‘dirigente’,‘juez’,‘otro’)Tipo de actor externo
area_idTEXTYESFK → area(id)Área geográfica de influencia
start_dateTEXTYESFecha de inicio de su relevancia/cargo
end_dateTEXTYESFecha de fin de su relevancia/cargo
observacionesTEXTYESNotas de texto libre sobre el actor

relacion_poder

Relaciones de poder entre dos entidades (personas, organizaciones o actores externos). Se usa para análisis de lealtad, mapeo de presión y seguimiento de coaliciones.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo RP01, RP02, etc.
source_typeTEXTNOCHECK IN (‘person’,‘organization’,‘actor_externo’)Tipo de la entidad origen
source_idTEXTNOID de la entidad origen
target_typeTEXTNOCHECK IN (‘person’,‘organization’,‘actor_externo’)Tipo de la entidad destino
target_idTEXTNOID de la entidad destino
tipoTEXTNOCHECK IN (‘lealtad’,‘presion’,‘influencia’,‘familiar’,‘clientelismo’,‘conflicto’,‘alianza’)Tipo de relación de poder
pesoINTEGERNOCHECK BETWEEN 1 AND 5Fuerza de la relación (1=muy débil, 5=muy fuerte)
start_dateTEXTYESFecha de inicio de la relación
end_dateTEXTYESFecha de fin de la relación
fuenteTEXTYESFuente de la información (URL o referencia)
notaTEXTYESNotas adicionales sobre la relación

evento_politico

Eventos políticos (reformas, crisis, acuerdos) que pueden o no estar vinculados a una moción legislativa.

ColumnTypeNullableConstraintsDescription
idTEXTNOPRIMARY KEYID único con prefijo EP01, EP02, etc.
fechaTEXTNOFecha del evento
tipoTEXTNOTipo de evento (texto libre: reforma, votacion, crisis, acuerdo, etc.)
descripcionTEXTNODescripción detallada del evento
consecuenciaTEXTYESConsecuencia o impacto del evento
fuente_urlTEXTYESURL de la fuente
motion_idTEXTYESFK → motion(id)Moción legislativa relacionada (si aplica)

Referencia de Índices

-- Búsquedas por membresía
CREATE INDEX idx_membership_person ON membership(person_id);
CREATE INDEX idx_membership_org    ON membership(org_id);

-- Búsquedas por evento de votación
CREATE INDEX idx_vote_event_motion ON vote_event(motion_id);
CREATE INDEX idx_vote_event_source ON vote_event(source_id);

-- Filtros por evento de votación
CREATE INDEX idx_vote_event_legislatura ON vote_event(legislatura);
CREATE INDEX idx_vote_event_org ON vote_event(organization_id);
CREATE INDEX idx_vote_event_start_date ON vote_event(start_date);

-- Búsquedas por voto individual
CREATE INDEX idx_vote_voter ON vote(voter_id);
CREATE INDEX idx_vote_event ON vote(vote_event_id);

-- Agregaciones de conteo
CREATE INDEX idx_count_event ON count(vote_event_id);
CREATE INDEX idx_count_group ON count(group_id);

-- Deduplicación (UNIQUE)
CREATE UNIQUE INDEX idx_vote_unique ON vote(vote_event_id, voter_id);
CREATE UNIQUE INDEX idx_count_unique ON count(vote_event_id, option, group_id);

-- Recorridos de relaciones de poder
CREATE INDEX idx_relacion_source ON relacion_poder(source_type, source_id);
CREATE INDEX idx_relacion_target ON relacion_poder(target_type, target_id);
CREATE INDEX idx_relacion_tipo   ON relacion_poder(tipo);

-- Análisis de lealtad
CREATE INDEX idx_person_corriente ON person(corriente_interna);

-- Filtrado de actores externos
CREATE INDEX idx_actor_tipo ON actor_externo(tipo);

Referencia de Triggers

Cuatro triggers aplican la restricción end_date >= start_date en las tablas person y membership, tanto para INSERT como para UPDATE.

-- Person: validar fechas en INSERT
CREATE TRIGGER trg_person_dates
BEFORE INSERT ON person
WHEN NEW.end_date IS NOT NULL AND NEW.start_date IS NOT NULL
BEGIN
    SELECT CASE WHEN NEW.end_date < NEW.start_date
    THEN RAISE(ABORT, 'end_date debe ser >= start_date en person')
    END;
END;

-- Person: validar fechas en UPDATE
CREATE TRIGGER trg_person_dates_update
BEFORE UPDATE ON person
WHEN NEW.end_date IS NOT NULL AND NEW.start_date IS NOT NULL
BEGIN
    SELECT CASE WHEN NEW.end_date < NEW.start_date
    THEN RAISE(ABORT, 'end_date debe ser >= start_date en person')
    END;
END;

-- Membership: validar fechas en INSERT
CREATE TRIGGER trg_membership_dates
BEFORE INSERT ON membership
WHEN NEW.end_date IS NOT NULL AND NEW.start_date IS NOT NULL
BEGIN
    SELECT CASE WHEN NEW.end_date < NEW.start_date
    THEN RAISE(ABORT, 'end_date debe ser >= start_date en membership')
    END;
END;

-- Membership: validar fechas en UPDATE
CREATE TRIGGER trg_membership_dates_update
BEFORE UPDATE ON membership
WHEN NEW.end_date IS NOT NULL AND NEW.start_date IS NOT NULL
BEGIN
    SELECT CASE WHEN NEW.end_date < NEW.start_date
    THEN RAISE(ABORT, 'end_date debe ser >= start_date en membership')
    END;
END;