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 especialidad
Relación: Muchos doctores (N) → Una especialidad (1)
(N:1)


Enfermero – Especialidad

Un enfermero tiene una especialidad
Relació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 doctores
Relació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 enfermeros
Relació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 pacientes
Relació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 doctores
Relació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 pacientes
Relació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:

Link para acceder


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');


delete from paciente where id_paciente = 101;

¡Crea tu página web gratis! Esta página web fue creada con Webnode. Crea tu propia web gratis hoy mismo! Comenzar