Proyecto final
Proyecto final
Enunciado:
El Hospital Central busca implementar un sistema de información que permita organizar y almacenar digitalmente los datos de su personal médico, pacientes y sus contactos de emergencia. Actualmente, la información se gestiona manualmente, lo cual dificulta el acceso rápido, la trazabilidad de la atención médica y la asignación eficiente de recursos humanos. El sistema deberá permitir registrar y consultar los datos de doctores, enfermeros, pacientes, familiares, las relaciones entre ellos, y el historial de atención médica. Además, debe contemplar la programación de turnos, las especialidades médicas y los tratamientos asignados a los pacientes.
El nuevo sistema debe permitir:
Registrar datos personales, contacto y especialidades del personal médico.
Asociar a pacientes con sus respectivos doctores, enfermeros y familiares.
Almacenar y consultar tratamientos médicos, turnos laborales, y especialidades clínicas.
Facilitar el manejo de relaciones entre entidades mediante tablas intermedias.
Mejorar la trazabilidad y eficiencia del servicio clínico.
Tablas:
1. Doctor
id_doctor (PK)
nombre_completo
documento
telefono
especialidad_id (FK a Especialidad)
2. Enfermero
id_enfermero (PK)
nombre_completo
documento
telefono
especialidad_id (FK a Especialidad)
3. Paciente
id_paciente (PK)
nombre_completo
documento
telefono
fecha_nacimiento
direccion
4. Familiar
id_familiar (PK)
nombre_completo
documento
telefono
correo
5. Especialidad
id_especialidad (PK)
nombre_especialidad
6. Doctor_Paciente
id_doctor (FK)
id_paciente (FK)
fecha_asignacion
7. Enfermero_Paciente
id_enfermero (FK)
id_paciente (FK)
fecha_asignacion
8. Paciente_Familiar
id_paciente (FK)
id_familiar (FK)
parentesco
9. Doctor_Enfermero
id_doctor (FK)
id_enfermero (FK)
fecha_colaboracion
10. Turno
id_turno (PK)
id_personal (FK a Doctor o Enfermero)
tipo_personal (Enum: Doctor/Enfermero)
fecha
hora_inicio
hora_fin
11. Tratamiento
id_tratamiento (PK)
descripcion
duracion_estimada
medicamentos
12. Paciente_Tratamiento
id_paciente (FK)
id_tratamiento (FK)
fecha_inicio
fecha_fin
estado (activo/finalizado)
Cardinalidades:
Doctor – Especialidad
Un doctor tiene una especialidadRelación: Muchos doctores (N) → Una especialidad (1)
(N:1)
Enfermero – Especialidad
Un enfermero tiene una especialidadRelación: Muchos enfermeros (N) → Una especialidad (1)
(N:1)
Doctor – Paciente (tabla doctor_paciente)
Un doctor puede atender a muchos pacientes y un paciente puede ser atendido por muchos doctoresRelación: Muchos doctores (N) ↔ Muchos pacientes (M)
(N:M)
Enfermero – Paciente (tabla enfermero_paciente)
Un enfermero puede cuidar a muchos pacientes y un paciente puede ser cuidado por muchos enfermerosRelación: Muchos enfermeros (N) ↔ Muchos pacientes (M)
(N:M)
Paciente – Familiar (tabla paciente_familiar)
Un paciente puede tener muchos familiares y un familiar puede estar relacionado con muchos pacientesRelación: Muchos pacientes (N) ↔ Muchos familiares (M)
(N:M)
Doctor – Enfermero (tabla doctor_enfermero)
Un doctor puede colaborar con muchos enfermeros y un enfermero puede colaborar con muchos doctoresRelación: Muchos doctores (N) ↔ Muchos enfermeros (M)
(N:M)
Paciente – Tratamiento (tabla paciente_tratamiento)
Un paciente puede tener varios tratamientos y un tratamiento puede ser asignado a varios pacientesRelación: Muchos pacientes (N) ↔ Muchos tratamientos (M)
(N:M)
Nombre de la base de datos:
bd_hospital
Listado de tablas(Maestras y de movimiento):
Maestras: doctor, enfermero, paciente, familiar, especialidad, tratamiento
Movimiento: doctor_paciente, enfermero_paciente, paciente_familiar, doctor_enfermero, turno, paciente_tratamiento
Diccionario de datos:
MER
MR
Base de datos:
Ejercicios:
Obtener los pacientes atendidos por doctores durante el último año.
Que se desea calcular y de que tabla(s): mostrar los pacientes atendidos por doctores en el ultimo año
Que tablas se ven afectadas o involucradas? : paciente, doctor_paciente
Condición (es): where dp.fecha_asignacion >= curdate() - interval 1 year;
Como se relacionan las tablas?: dp.id_paciente = p.id_paciente
Función a Utilizar: select, distinct, from, join, on, where, curdate, interval
Sintaxis: select distinct p.id_paciente, p.nombre_completo from doctor_paciente dp join paciente p on dp.id_paciente = p.id_paciente where dp.fecha_asignacion >= curdate() - interval 1 year;
Crear un trigger que registre en una tabla de logs cada vez que se inserte un nuevo paciente.
Que se desea calcular y de que tabla(s): agregar un trigger que registre cada vez que se inserte un paciente nuevo.
Que tablas se ven afectadas o involucradas? : log_paciente, paciente
Condición (es): N/A
Como se relacionan las tablas?: N/A
Función a Utilizar: create, after, insert, timestamp, current_timestamp
Sintaxis: create table log_paciente (id_log int auto_increment primary key,id_paciente int, accion varchar(50),fecha timestamp default current_timestamp);
delimiter //
create trigger after_insert_paciente
after insert on paciente
for each row
begin
insert into log_paciente (id_paciente, accion)
values (new.id_paciente, 'insert');
end;
//
Listar los doctores que han atendido más de 5 pacientes.
Que se desea calcular y de que tabla(s): mostrar los doctores que han atendido a mas de 5 pacientes
Que tablas se ven afectadas o involucradas? : doctor, doctor_paciente
Condición (es): where dp.id_doctor = d.id_doctor) > 5;
Como se relacionan las tablas?: dp.id_doctor = d.id_doctor
Función a Utilizar: select, from, where, count
Sintaxis: select d.id_doctor, d.nombre_completo from doctor d where (select count(*) from doctor_paciente dp where dp.id_doctor = d.id_doctor) > 5;
Mostrar los nombres de familiares con el texto "Sr./Sra." agregado al principio.
Que se desea calcular y de que tabla(s): mostrar y colocar "sr/sra" al principio de los nombres de los familiares
Que tablas se ven afectadas o involucradas? : familiar
Condición (es): N/A
Como se relacionan las tablas?: N/A
Función a Utilizar: select, concat, as, from
Sintaxis: select concat('sr./sra. ', nombre_completo) as nombre_formal, correo from familiar;
Agregar un campo genero a la tabla paciente y un campo alergias como SET.
Que se desea calcular y de que tabla(s): agregar un campo genero y alergias en la tabla paciente
Que tablas se ven afectadas o involucradas? : paciente
Condición (es): N/A
Como se relacionan las tablas?: N/A
Función a Utilizar: alter table, add, enum, not null, default, set
Sintaxis: ALTER TABLE paciente ADD genero ENUM('M', 'F', 'Otro') NOT NULL DEFAULT 'Otro', ADD alergias SET('Penicilina', 'Polen', 'Gluten', 'L cteos', 'Ninguna') DEFAULT 'Ninguna';
Crear una tabla de respaldo de pacientes mayores de 40 años.
Que se desea calcular y de que tabla(s): crear una tabla de pacientes mayores de 40 años
Que tablas se ven afectadas o involucradas? : pacientes_mayores, paciente
Condición (es): where timestampdiff(year, fecha_nacimiento, curdate()) > 40;
Como se relacionan las tablas?: N/A
Función a Utilizar: create, as, select, from, where, timestampdiff, curdate
Sintaxis: create table pacientes_mayores as select * from paciente where timestampdiff(year, fecha_nacimiento, curdate()) > 40;
Mostrar los pacientes que no han sido atendidos por ningún doctor en el último año.
Que se desea calcular y de que tabla(s): mostrar pacientes que no han sido atendidos en el ultimo año
Que tablas se ven afectadas o involucradas? : paciente, doctor_paciente
Condición (es): where dp.fecha_asignacion >= curdate() - interval 1 year);
Como se relacionan las tablas?: N/A
Función a Utilizar: select, from, where, not in, curdate, interval
Sintaxis: select p.id_paciente, p.nombre_completo from paciente p where p.id_paciente not in (select dp.id_paciente from doctor_paciente dp where dp.fecha_asignacion >= curdate() - interval 1 year);
Obtener una lista de los pacientes, el doctor que los atendió y su especialidad.
Que se desea calcular y de que tabla(s): mostrar a los pacientes con los doctores que los atendió, mas su especialidad
Que tablas se ven afectadas o involucradas? : paciente, doctor, doctor_paciente, especialidad
Condición (es): N/A
Como se relacionan las tablas?: dp.id_paciente = p.id_paciente, dp.id_doctor = d.id_doctor, d.especialidad_id = e.id_especialidad
Función a Utilizar: select, as, from, join, on
Sintaxis: select p.nombre_completo as paciente, d.nombre_completo as doctor, e.nombre_especialidad from doctor_paciente dp join paciente p on dp.id_paciente = p.id_paciente join doctor d on dp.id_doctor = d.id_doctor join especialidad e on d.especialidad_id = e.id_especialidad;
Mostrar cuántos pacientes ha atendido cada doctor, ordenados de mayor a menor.
Que se desea calcular y de que tabla(s): mostrar los pacientes ordenados de mayor a menos que ha atendido cada doctor
Que tablas se ven afectadas o involucradas? : doctor, doctor_paciente
Condición (es): N/A
Como se relacionan las tablas?: d.id_doctor = dp.id_doctor
Función a Utilizar: select, as, count, from, left join, group by, order by, desc
Sintaxis: select d.nombre_completo as doctor, count(dp.id_paciente) as total_pacientes from doctor d left join doctor_paciente dp on d.id_doctor = dp.id_doctor group by d.id_doctor order by total_pacientes desc;
Mostrar pacientes con una columna extra que diga si es "Adulto" (más o igual de 30 años) o "Adulto joven".
Que se desea calcular y de que tabla(s): mostrar a los pacientes y que diga si son "adulto" o "adulto joven" según su edad
Que tablas se ven afectadas o involucradas? : paciente
Condición (es): timestampdiff(year, fecha_nacimiento, curdate()) >= 30
Como se relacionan las tablas?: N/A
Función a Utilizar: select, case, when, timestampdiff, curdate, then, else, end, as, from
Sintaxis: select nombre_completo, fecha_nacimiento, case when timestampdiff(year, fecha_nacimiento, curdate()) >= 30 then 'adulto' else 'adulto joven' end as tipo_paciente from paciente;
Asegurar que si se elimina un paciente, también se eliminen sus relaciones con sus tratamientos.
Que se desea calcular y de que tabla(s): Asegurar que si se elimina un paciente, también se eliminen sus relaciones con sus tratamientos.
Que tablas se ven afectadas o involucradas? : paciente, tratamiento, paciente_tratamiento
Condición (es): paciente where id_paciente = 101;
Como se relacionan las tablas?: N/A
Función a Utilizar: insert, into, values, delete, from, where
Sintaxis: insert into paciente (id_paciente, nombre_completo, documento, telefono, fecha_nacimiento, direccion) values (101, 'mario rodr¡guez', '1023456789', '3012345678', '1988-04-15', 'carrera 10 #45-32');
insert into tratamiento (id_tratamiento, descripcion, duracion_estimada, medicamentos) values (501, 'tratamiento respiratorio intensivo', '2 semanas', 'broncodilatadores, corticoides');
insert into paciente_tratamiento (id_paciente, id_tratamiento, fecha_inicio) values (101, 501, '2025-05-10');