Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/tutosrive/db-relacionales-2026-1/llms.txt

Use this file to discover all available pages before exploring further.

Este proyecto de referencia presenta el modelado e implementación de una base de datos relacional para una EPS colombiana (Entidad Promotora de Salud). El esquema abarca la afiliación de pacientes con su plan de salud, la red de clínicas IPS organizadas por consultorio y departamento, el cuerpo médico con sus turnos, la programación de citas, el historial clínico con diagnósticos vinculados a medicamentos y servicios, y las visitas domiciliarias atendidas por auxiliares. Fue construido como ejemplo guía del curso Bases de Datos Relacionales 2026-I y está acompañado por un contraejemplo en MongoDB para comparar los enfoques relacional y documental sobre el mismo dominio.
Este proyecto fue diseñado originalmente para MySQL. Los tipos AUTO_INCREMENT, DATE y TIME como columnas separadas y las restricciones ON DELETE CASCADE son compatibles con MySQL 8. Para migrar a PostgreSQL reemplaza AUTO_INCREMENT por SERIAL y ajusta las restricciones de cascada según el comportamiento deseado.

Universo de Discurso

Una EPS actúa como aseguradora de salud: ofrece planes de salud a sus pacientes afiliados y coordina una red de IPS (Instituciones Prestadoras de Servicios). Cada IPS alberga consultorios organizados en departamentos clínicos (medicina general, cardiología, pediatría, etc.). Los médicos ejercen en un consultorio y cubren turnos programados. Los pacientes agendan citas con médicos, cuyo resultado genera un diagnóstico que puede prescribir medicamentos y ordenar servicios médicos. El sistema registra también visitas domiciliarias con un auxiliar y un vehículo asignado para atender pacientes con movilidad reducida. La gestión de insumos cierra el ciclo operativo: los proveedores suministran insumos a las IPS mediante registros InsumoxIps, y cada entrega queda vinculada al proveedor en ProveedorxInsumo. La relación entre IPS y EPS se formaliza en IpsxEps mediante un tipo de convenio.

Esquema Relacional

-- ──────────────────────────────────────────────
-- Tablas maestras independientes
-- ──────────────────────────────────────────────

-- Tabla: Proveedor
CREATE TABLE Proveedor (
    idProveedor INT AUTO_INCREMENT,
    nombre      VARCHAR(100),
    apellidos   VARCHAR(100),
    direccion   VARCHAR(255),
    telefono    VARCHAR(15),
    correo      VARCHAR(100),
    CONSTRAINT PK_PROVEEDOR PRIMARY KEY (idProveedor)
) AUTO_INCREMENT = 1001;

-- Tabla: Insumo
CREATE TABLE Insumo (
    idInsumo      INT AUTO_INCREMENT,
    nombre        VARCHAR(100),
    descripcion   TEXT,
    tipoInsumo    VARCHAR(50),
    cantidad      INT,
    unidadMedida  VARCHAR(50),
    CONSTRAINT PK_INSUMO PRIMARY KEY (idInsumo)
) AUTO_INCREMENT = 2001;

-- Tabla: Ips
CREATE TABLE Ips (
    idIps     INT AUTO_INCREMENT,
    nombre    VARCHAR(100),
    direccion VARCHAR(255),
    telefono  VARCHAR(15),
    correo    VARCHAR(100),
    CONSTRAINT PK_IPS PRIMARY KEY (idIps)
) AUTO_INCREMENT = 4001;

-- Tabla: Eps
CREATE TABLE Eps (
    idEps       INT AUTO_INCREMENT,
    nombre      VARCHAR(100),
    tipoEntidad VARCHAR(50),
    direccion   VARCHAR(255),
    telefono    VARCHAR(15),
    correo      VARCHAR(100),
    CONSTRAINT PK_EPS PRIMARY KEY (idEps)
) AUTO_INCREMENT = 6001;

-- Tabla: Departamento (departamento clínico interno de la IPS)
CREATE TABLE Departamento (
    idDepartamento INT AUTO_INCREMENT,
    nombre         VARCHAR(100),
    especialidad   VARCHAR(100),
    descripcion    TEXT,
    CONSTRAINT PK_DEPARTAMENTO PRIMARY KEY (idDepartamento)
) AUTO_INCREMENT = 8001;

-- Tabla: PlanSalud
CREATE TABLE PlanSalud (
    idPlanSalud INT AUTO_INCREMENT,
    precio      INT,
    tipo        VARCHAR(100),
    CONSTRAINT PK_PLANSALUD PRIMARY KEY (idPlanSalud)
) AUTO_INCREMENT = 19001;

-- Tabla: Medicamento
CREATE TABLE Medicamento (
    idMedicamento    INT AUTO_INCREMENT,
    nombre           VARCHAR(100),
    cantidad_mg      INT,
    viaAdministracion VARCHAR(100),
    CONSTRAINT PK_MEDICAMENTO PRIMARY KEY (idMedicamento)
) AUTO_INCREMENT = 17001;

-- Tabla: Servicio
CREATE TABLE Servicio (
    idServicio  INT AUTO_INCREMENT,
    nombre      VARCHAR(100),
    descripcion TEXT,
    CONSTRAINT PK_SERVICIO PRIMARY KEY (idServicio)
) AUTO_INCREMENT = 18001;

-- Tabla: Vehiculo
CREATE TABLE Vehiculo (
    placaVehiculo VARCHAR(20),
    equipamiento  VARCHAR(255),
    CONSTRAINT PK_VEHICULO PRIMARY KEY (placaVehiculo)
);

-- Tabla: Auxiliar
CREATE TABLE Auxiliar (
    idAuxiliar INT AUTO_INCREMENT,
    nombre     VARCHAR(100),
    apellidos  VARCHAR(100),
    telefono   VARCHAR(15),
    correo     VARCHAR(100),
    CONSTRAINT PK_AUXILIAR PRIMARY KEY (idAuxiliar)
) AUTO_INCREMENT = 22001;

-- Tabla: Turno
CREATE TABLE Turno (
    idTurno    INT AUTO_INCREMENT,
    horaInicio TIME,
    horaFin    TIME,
    CONSTRAINT PK_TURNO PRIMARY KEY (idTurno)
) AUTO_INCREMENT = 24001;

-- ──────────────────────────────────────────────
-- Tablas de relación y dependientes
-- ──────────────────────────────────────────────

-- Tabla: ProveedorxInsumo
CREATE TABLE ProveedorxInsumo (
    idProveedorxInsumo INT AUTO_INCREMENT,
    idProveedor        INT NOT NULL,
    idInsumo           INT,
    cantidad           INT,
    fecha              DATE,
    CONSTRAINT PK_PROVEEDORXINSUMO PRIMARY KEY (idProveedorxInsumo),
    CONSTRAINT FK_PXI_PROVEEDOR FOREIGN KEY (idProveedor) REFERENCES Proveedor(idProveedor)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_PXI_INSUMO    FOREIGN KEY (idInsumo)    REFERENCES Insumo(idInsumo)
        ON DELETE CASCADE ON UPDATE CASCADE
) AUTO_INCREMENT = 3001;

-- Tabla: InsumoxIps
CREATE TABLE InsumoxIps (
    idInsumoxIps   INT AUTO_INCREMENT,
    idInsumo       INT  NOT NULL,
    idIps          INT  NOT NULL,
    fechaEntrega   DATE,
    estadoEntrega  VARCHAR(50),
    CONSTRAINT PK_INSUMOXIPS PRIMARY KEY (idInsumoxIps),
    CONSTRAINT FK_IXIPS_INSUMO FOREIGN KEY (idInsumo) REFERENCES Insumo(idInsumo)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_IXIPS_IPS    FOREIGN KEY (idIps)    REFERENCES Ips(idIps)
        ON DELETE CASCADE ON UPDATE CASCADE
) AUTO_INCREMENT = 5001;

-- Tabla: IpsxEps
CREATE TABLE IpsxEps (
    idIpsxEps    INT AUTO_INCREMENT,
    idIps        INT NOT NULL,
    idEps        INT NOT NULL,
    tipoConvenio VARCHAR(100),
    CONSTRAINT PK_IPSXEPS PRIMARY KEY (idIpsxEps),
    CONSTRAINT FK_IXE_IPS FOREIGN KEY (idIps) REFERENCES Ips(idIps)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_IXE_EPS FOREIGN KEY (idEps) REFERENCES Eps(idEps)
        ON DELETE CASCADE ON UPDATE CASCADE
) AUTO_INCREMENT = 7001;

-- Tabla: Consultorio
CREATE TABLE Consultorio (
    idConsultorio  INT AUTO_INCREMENT,
    idIps          INT NOT NULL,
    idDepartamento INT NOT NULL,
    localizacion   VARCHAR(255),
    CONSTRAINT PK_CONSULTORIO PRIMARY KEY (idConsultorio),
    CONSTRAINT FK_CONSULTORIO_IPS         FOREIGN KEY (idIps)          REFERENCES Ips(idIps)
        ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT FK_CONSULTORIO_DEPARTAMENTO FOREIGN KEY (idDepartamento) REFERENCES Departamento(idDepartamento)
        ON UPDATE CASCADE ON DELETE CASCADE
) AUTO_INCREMENT = 9001;

-- Tabla: Medico
CREATE TABLE Medico (
    idMedico      INT AUTO_INCREMENT,
    idConsultorio INT NOT NULL,
    nombre        VARCHAR(100),
    apellidos     VARCHAR(100),
    especialidad  VARCHAR(100),
    telefono      VARCHAR(15),
    correo        VARCHAR(100),
    CONSTRAINT PK_MEDICO PRIMARY KEY (idMedico),
    CONSTRAINT FK_MEDICO_CONSULTORIO FOREIGN KEY (idConsultorio) REFERENCES Consultorio(idConsultorio)
        ON DELETE CASCADE ON UPDATE CASCADE
) AUTO_INCREMENT = 13001;

-- Tabla: Paciente
CREATE TABLE Paciente (
    idPaciente  INT AUTO_INCREMENT,
    idEps       INT NOT NULL,
    idPlanSalud INT NOT NULL,
    nombre      VARCHAR(100),
    apellidos   VARCHAR(100),
    edad        INT,
    genero      VARCHAR(15),
    telefono    VARCHAR(15),
    direccion   VARCHAR(255),
    correo      VARCHAR(100),
    CONSTRAINT PK_PACIENTE PRIMARY KEY (idPaciente),
    CONSTRAINT FK_PACIENTE_EPS       FOREIGN KEY (idEps)       REFERENCES Eps(idEps)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_PACIENTE_PLANSALUD FOREIGN KEY (idPlanSalud) REFERENCES PlanSalud(idPlanSalud)
        ON DELETE CASCADE ON UPDATE CASCADE
) AUTO_INCREMENT = 14001;

-- Tabla: Cita
CREATE TABLE Cita (
    idCita     INT AUTO_INCREMENT,
    idMedico   INT NOT NULL,
    idPaciente INT NOT NULL,
    fecha      DATE,
    hora       TIME,
    motivo     TEXT,
    CONSTRAINT PK_CITA PRIMARY KEY (idCita),
    CONSTRAINT FK_CITA_MEDICO   FOREIGN KEY (idMedico)   REFERENCES Medico(idMedico)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_CITA_PACIENTE FOREIGN KEY (idPaciente) REFERENCES Paciente(idPaciente)
        ON DELETE CASCADE ON UPDATE CASCADE
) AUTO_INCREMENT = 15001;

-- Tabla: HistoriaClinica
CREATE TABLE HistoriaClinica (
    idHistoriaClinica INT AUTO_INCREMENT,
    idPaciente        INT NOT NULL,
    fecha_creacion    DATE,
    CONSTRAINT PK_HISTORIACLINICA PRIMARY KEY (idHistoriaClinica),
    CONSTRAINT FK_HC_PACIENTE FOREIGN KEY (idPaciente) REFERENCES Paciente(idPaciente)
        ON DELETE CASCADE ON UPDATE CASCADE
) AUTO_INCREMENT = 21001;

-- Tabla: Diagnostico
CREATE TABLE Diagnostico (
    idDiagnostico     INT AUTO_INCREMENT,
    idHistoriaClinica INT,
    idCita            INT,
    descripcion       TEXT,
    tratamiento       TEXT,
    CONSTRAINT PK_DIAGNOSTICO PRIMARY KEY (idDiagnostico),
    CONSTRAINT FK_DIAGNOSTICO_HISTORIACLINICA FOREIGN KEY (idHistoriaClinica)
        REFERENCES HistoriaClinica(idHistoriaClinica) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_DIAGNOSTICO_CITA           FOREIGN KEY (idCita)
        REFERENCES Cita(idCita)               ON DELETE CASCADE ON UPDATE CASCADE
) AUTO_INCREMENT = 16001;

-- Tabla: DiagnosticoxMedicamento
CREATE TABLE DiagnosticoxMedicamento (
    idDiagnostico INT,
    idMedicamento INT,
    fecha         DATE,
    cantidad      INT,
    CONSTRAINT PK_DIAGNOSTICOXMEDICAMENTO
        PRIMARY KEY (idDiagnostico, idMedicamento, fecha),
    CONSTRAINT FK_DXM_DIAGNOSTICO FOREIGN KEY (idDiagnostico) REFERENCES Diagnostico(idDiagnostico)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_DXM_MEDICAMENTO FOREIGN KEY (idMedicamento) REFERENCES Medicamento(idMedicamento)
        ON DELETE CASCADE ON UPDATE CASCADE
);

-- Tabla: DiagnosticoxServicio
CREATE TABLE DiagnosticoxServicio (
    idDiagnostico INT,
    idServicio    INT,
    fecha         DATE,
    descripcion   TEXT,
    CONSTRAINT PK_DIAGNOSTICOXSERVICIO
        PRIMARY KEY (idDiagnostico, idServicio, fecha),
    CONSTRAINT FK_DXS_DIAGNOSTICO FOREIGN KEY (idDiagnostico) REFERENCES Diagnostico(idDiagnostico)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_DXS_SERVICIO    FOREIGN KEY (idServicio)    REFERENCES Servicio(idServicio)
        ON DELETE CASCADE ON UPDATE CASCADE
);

-- Tabla: VisitaDomiciliaria
CREATE TABLE VisitaDomiciliaria (
    idVisita      INT AUTO_INCREMENT,
    idPaciente    INT,
    placaVehiculo VARCHAR(20),
    idAuxiliar    INT,
    motivo        TEXT,
    fecha         DATE,
    reporte       TEXT,
    CONSTRAINT PK_VISITADOMICILIARIA PRIMARY KEY (idVisita),
    CONSTRAINT FK_VD_VEHICULO  FOREIGN KEY (placaVehiculo) REFERENCES Vehiculo(placaVehiculo)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_VD_AUXILIAR  FOREIGN KEY (idAuxiliar)   REFERENCES Auxiliar(idAuxiliar)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_VD_PACIENTE  FOREIGN KEY (idPaciente)   REFERENCES Paciente(idPaciente)
        ON DELETE CASCADE ON UPDATE CASCADE
) AUTO_INCREMENT = 23001;

-- Tabla: MedicoxTurno
CREATE TABLE MedicoxTurno (
    idMedico INT,
    idTurno  INT,
    fecha    DATE,
    CONSTRAINT PK_MEDICOXTURNO PRIMARY KEY (idMedico, idTurno, fecha),
    CONSTRAINT FK_MXT_MEDICO FOREIGN KEY (idMedico) REFERENCES Medico(idMedico)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_MXT_TURNO  FOREIGN KEY (idTurno)  REFERENCES Turno(idTurno)
        ON DELETE CASCADE ON UPDATE CASCADE
);

Diagrama Entidad-Relación

Consultas SQL de Referencia

-- Citas por médico y especialidad
SELECT
  CONCAT(m.nombre, ' ', m.apellidos) AS medico,
  m.especialidad,
  COUNT(c.idCita)                     AS total_citas
FROM Medico m
LEFT JOIN Cita c ON m.idMedico = c.idMedico
GROUP BY m.idMedico, m.nombre, m.apellidos, m.especialidad
ORDER BY total_citas DESC;

-- Citas programadas para una fecha específica
SELECT
  CONCAT(p.nombre, ' ', p.apellidos) AS paciente,
  CONCAT(m.nombre, ' ', m.apellidos) AS medico,
  m.especialidad,
  c.fecha,
  c.hora,
  c.motivo
FROM Cita c
JOIN Paciente p ON c.idPaciente = p.idPaciente
JOIN Medico   m ON c.idMedico   = m.idMedico
WHERE c.fecha = '2026-03-15'
ORDER BY c.hora;

Diccionario de Datos

ColumnaTipoRestriccionesDescripción
idEpsINTPK, AUTO_INCREMENT (desde 6001)Identificador interno de la EPS.
nombreVARCHAR(100)Razón social de la EPS.
tipoEntidadVARCHAR(50)Tipo de entidad: pública, privada, mixta.
direccionVARCHAR(255)Dirección de la sede principal.
telefonoVARCHAR(15)Número de contacto general.
correoVARCHAR(100)Correo electrónico institucional.
ColumnaTipoRestriccionesDescripción
idPlanSaludINTPK, AUTO_INCREMENT (desde 19001)Identificador del plan de salud.
precioINTValor mensual del plan en pesos colombianos.
tipoVARCHAR(100)Nombre o categoría del plan (ej. básico, complementario).
ColumnaTipoRestriccionesDescripción
idIpsINTPK, AUTO_INCREMENT (desde 4001)Identificador de la IPS.
nombreVARCHAR(100)Nombre de la clínica u hospital.
direccionVARCHAR(255)Dirección física de la IPS.
telefonoVARCHAR(15)Número de contacto de la IPS.
correoVARCHAR(100)Correo electrónico de la IPS.
ColumnaTipoRestriccionesDescripción
idIpsxEpsINTPK, AUTO_INCREMENT (desde 7001)Identificador del convenio.
idIpsINTFK → Ips, NOT NULLIPS que firma el convenio.
idEpsINTFK → Eps, NOT NULLEPS que firma el convenio.
tipoConvenioVARCHAR(100)Tipo de convenio (ej. pleno, parcial, urgencias).
ColumnaTipoRestriccionesDescripción
idDepartamentoINTPK, AUTO_INCREMENT (desde 8001)Identificador del departamento clínico.
nombreVARCHAR(100)Nombre del departamento (ej. Medicina General, Cardiología).
especialidadVARCHAR(100)Especialidad médica principal del departamento.
descripcionTEXTDescripción de los servicios que presta el departamento.
ColumnaTipoRestriccionesDescripción
idConsultorioINTPK, AUTO_INCREMENT (desde 9001)Identificador del consultorio.
idIpsINTFK → Ips, NOT NULLIPS a la que pertenece el consultorio.
idDepartamentoINTFK → Departamento, NOT NULLDepartamento clínico al que pertenece.
localizacionVARCHAR(255)Ubicación dentro de la IPS (piso, ala, número de sala).
ColumnaTipoRestriccionesDescripción
idMedicoINTPK, AUTO_INCREMENT (desde 13001)Identificador del médico.
idConsultorioINTFK → Consultorio, NOT NULLConsultorio donde ejerce el médico.
nombreVARCHAR(100)Nombre del médico.
apellidosVARCHAR(100)Apellidos del médico.
especialidadVARCHAR(100)Especialidad médica (ej. Cardiología, Pediatría).
telefonoVARCHAR(15)Número de contacto del médico.
correoVARCHAR(100)Correo electrónico del médico.
ColumnaTipoRestriccionesDescripción
idTurnoINTPK, AUTO_INCREMENT (desde 24001)Identificador del turno.
horaInicioTIMEHora de inicio del turno.
horaFinTIMEHora de finalización del turno.
ColumnaTipoRestriccionesDescripción
idMedicoINTPK (compuesta), FK → MedicoMédico asignado al turno.
idTurnoINTPK (compuesta), FK → TurnoTurno asignado.
fechaDATEPK (compuesta)Fecha en la que el médico cubre el turno.
ColumnaTipoRestriccionesDescripción
idPacienteINTPK, AUTO_INCREMENT (desde 14001)Identificador del paciente.
idEpsINTFK → Eps, NOT NULLEPS a la que está afiliado el paciente.
idPlanSaludINTFK → PlanSalud, NOT NULLPlan de salud del paciente.
nombreVARCHAR(100)Nombre del paciente.
apellidosVARCHAR(100)Apellidos del paciente.
edadINTEdad del paciente en años.
generoVARCHAR(15)Género del paciente.
telefonoVARCHAR(15)Número de contacto del paciente o acudiente.
direccionVARCHAR(255)Dirección de residencia del paciente.
correoVARCHAR(100)Correo electrónico del paciente.
ColumnaTipoRestriccionesDescripción
idCitaINTPK, AUTO_INCREMENT (desde 15001)Identificador de la cita.
idMedicoINTFK → Medico, NOT NULLMédico que atiende la cita.
idPacienteINTFK → Paciente, NOT NULLPaciente que solicita la cita.
fechaDATEFecha programada para la cita.
horaTIMEHora programada para la cita.
motivoTEXTMotivo de consulta registrado al agendar.
ColumnaTipoRestriccionesDescripción
idHistoriaClinicaINTPK, AUTO_INCREMENT (desde 21001)Identificador de la historia clínica.
idPacienteINTFK → Paciente, NOT NULLPaciente al que pertenece la historia.
fecha_creacionDATEFecha en que se creó la historia clínica.
ColumnaTipoRestriccionesDescripción
idDiagnosticoINTPK, AUTO_INCREMENT (desde 16001)Identificador del diagnóstico.
idHistoriaClinicaINTFK → HistoriaClinicaHistoria clínica a la que pertenece.
idCitaINTFK → CitaCita en la que se emitió el diagnóstico.
descripcionTEXTDescripción clínica del diagnóstico.
tratamientoTEXTPlan de tratamiento indicado por el médico.
ColumnaTipoRestriccionesDescripción
idMedicamentoINTPK, AUTO_INCREMENT (desde 17001)Identificador del medicamento.
nombreVARCHAR(100)Nombre comercial del medicamento.
cantidad_mgINTDosis estándar en miligramos.
viaAdministracionVARCHAR(100)Vía de administración: oral, intravenosa, tópica, etc.
ColumnaTipoRestriccionesDescripción
idDiagnosticoINTPK (compuesta), FK → DiagnosticoDiagnóstico que genera la prescripción.
idMedicamentoINTPK (compuesta), FK → MedicamentoMedicamento prescrito.
fechaDATEPK (compuesta)Fecha de la prescripción.
cantidadINTCantidad de unidades prescritas.
ColumnaTipoRestriccionesDescripción
idServicioINTPK, AUTO_INCREMENT (desde 18001)Identificador del servicio.
nombreVARCHAR(100)Nombre del servicio (ej. Laboratorio clínico, Rayos X).
descripcionTEXTDescripción detallada del servicio médico.
ColumnaTipoRestriccionesDescripción
idDiagnosticoINTPK (compuesta), FK → DiagnosticoDiagnóstico que ordena el servicio.
idServicioINTPK (compuesta), FK → ServicioServicio ordenado.
fechaDATEPK (compuesta)Fecha de la orden del servicio.
descripcionTEXTObservaciones o instrucciones específicas para el servicio.
ColumnaTipoRestriccionesDescripción
idAuxiliarINTPK, AUTO_INCREMENT (desde 22001)Identificador del auxiliar.
nombreVARCHAR(100)Nombre del auxiliar.
apellidosVARCHAR(100)Apellidos del auxiliar.
telefonoVARCHAR(15)Número de contacto del auxiliar.
correoVARCHAR(100)Correo electrónico del auxiliar.
ColumnaTipoRestriccionesDescripción
placaVehiculoVARCHAR(20)PKPlaca del vehículo; actúa como clave natural.
equipamientoVARCHAR(255)Equipamiento médico disponible en el vehículo.
ColumnaTipoRestriccionesDescripción
idVisitaINTPK, AUTO_INCREMENT (desde 23001)Identificador de la visita.
idPacienteINTFK → PacientePaciente que recibe la visita.
placaVehiculoVARCHAR(20)FK → VehiculoVehículo utilizado para el desplazamiento.
idAuxiliarINTFK → AuxiliarAuxiliar que realiza la visita.
motivoTEXTMotivo de la visita domiciliaria.
fechaDATEFecha de la visita.
reporteTEXTInforme del auxiliar sobre la visita realizada.
ColumnaTipoRestriccionesDescripción
idProveedorINTPK, AUTO_INCREMENT (desde 1001)Identificador del proveedor.
nombreVARCHAR(100)Nombre del proveedor o representante.
apellidosVARCHAR(100)Apellidos del proveedor.
direccionVARCHAR(255)Dirección del proveedor.
telefonoVARCHAR(15)Número de contacto del proveedor.
correoVARCHAR(100)Correo electrónico del proveedor.
ColumnaTipoRestriccionesDescripción
idInsumoINTPK, AUTO_INCREMENT (desde 2001)Identificador del insumo.
nombreVARCHAR(100)Nombre del insumo (ej. jeringa, guante, mascarilla).
descripcionTEXTDescripción detallada del insumo.
tipoInsumoVARCHAR(50)Categoría del insumo: descartable, reutilizable, fármaco.
cantidadINTCantidad actual en inventario.
unidadMedidaVARCHAR(50)Unidad de medida: unidades, cajas, litros, etc.
ColumnaTipoRestriccionesDescripción
idProveedorxInsumoINTPK, AUTO_INCREMENT (desde 3001)Identificador del registro de suministro.
idProveedorINTFK → Proveedor, NOT NULLProveedor que suministra el insumo.
idInsumoINTFK → InsumoInsumo suministrado.
cantidadINTCantidad entregada en este suministro.
fechaDATEFecha del suministro.
ColumnaTipoRestriccionesDescripción
idInsumoxIpsINTPK, AUTO_INCREMENT (desde 5001)Identificador de la entrega.
idInsumoINTFK → Insumo, NOT NULLInsumo entregado.
idIpsINTFK → Ips, NOT NULLIPS receptora del insumo.
fechaEntregaDATEFecha de la entrega.
estadoEntregaVARCHAR(50)Estado: pendiente, entregado, rechazado.

Comparación: SQL vs NoSQL

El repositorio del curso también incluye una versión MongoDB de este mismo dominio. La siguiente comparación ilustra las diferencias de modelado para una entidad central como el paciente y su historial clínico.
La contraparte NoSQL del proyecto EPS utiliza colecciones MongoDB (pacientes, citas, medicos, ips). El esquema documental desnormaliza datos para optimizar lecturas, mientras que el esquema relacional prioriza la integridad referencial y la consistencia transaccional. Ambos enfoques son válidos según el contexto; este curso se centra en el modelo relacional.

Modelo Relacional (SQL)

-- Historia clínica con diagnósticos y medicamentos
SELECT
  p.nombre, p.apellidos,
  d.descripcion  AS diagnostico,
  med.nombre     AS medicamento,
  dxm.cantidad
FROM Paciente p
JOIN HistoriaClinica hc ON p.idPaciente       = hc.idPaciente
JOIN Diagnostico     d  ON hc.idHistoriaClinica = d.idHistoriaClinica
JOIN DiagnosticoxMedicamento dxm ON d.idDiagnostico = dxm.idDiagnostico
JOIN Medicamento     med ON dxm.idMedicamento  = med.idMedicamento
WHERE p.idPaciente = 14001;
Ventajas: integridad referencial garantizada, sin duplicación, consultas complejas con JOINs, transacciones ACID.

Modelo Documental (MongoDB)

// Perfil completo del paciente con historial embebido
db.pacientes.findOne(
  { _id: 14001 },
  { nombre: 1, apellidos: 1, historiaClinica: 1 }
)
// Documento resultante:
// { nombre: "Ana", apellidos: "Gómez",
//   historiaClinica: {
//     diagnosticos: [
//       { descripcion: "Hipertensión",
//         medicamentos: [{ nombre: "Losartán", cantidad_mg: 50 }]
//       }
//     ]
//   }
// }
Ventajas: lectura del perfil completo en una operación, esquema flexible, escalabilidad horizontal nativa.

Extensiones Sugeridas

Facturación de Citas

Agregar tabla Factura(idFactura, idCita, idPaciente, fecha, total, estadoPago) para registrar el cobro de copagos y la liquidación de servicios cubiertos por el plan de salud.

Incapacidades Médicas

Tabla Incapacidad(idIncapacidad, idCita, idPaciente, fechaInicio, fechaFin, diasConcedidos, descripcion) para gestionar el flujo de incapacidades emitidas por los médicos.

Búsqueda Semántica con pgvector

Agregar embedding vector(384) en Medicamento y Servicio para recomendación semántica basada en síntomas descritos por el paciente en lenguaje natural.

Auditoría de Cambios

Tabla Auditoria(id, tabla, operacion, usuario, fecha, datos_anteriores JSON) para registrar INSERT, UPDATE y DELETE sobre las tablas sensibles del sistema.

Build docs developers (and LLMs) love