Esempi / Gestione di un ospedale
Gestione di un ospedale
Il database di un ospedale ruota attorno a due tabelle di eventi. La visita è un incontro ambulatoriale con un medico, il ricovero una degenza in reparto. Entrambe le tabelle fanno riferimento al paziente. Le prescrizioni si fanno a ogni visita e rimandano a un catalogo di farmaci.
Qui sotto ErdDocs disegna questo schema dal suo SQL, con tutte le tabelle e le relazioni. Nella scheda «Dizionario dati» c’è la versione da stampare, completa e gratis in questa pagina. Il SQL è più in basso.
Passa sopra una tabella per evidenziarne le relazioni. Un clic le fissa.
A cosa serve ogni tabella
- patientsIl personale usa il numero di cartella, mrn. L’id surrogato resta interno.
- doctors / departmentsUn semplice uno a molti. La specializzazione appartiene al medico, non al reparto.
- appointmentsLa visita ambulatoriale, con paziente, medico, orario ed esito.
- admissionsIl ricovero in reparto. Finché la degenza dura, discharged_at resta NULL.
- medications / prescriptionsLe prescrizioni sono legate alla visita, perché è la visita a dare il contesto clinico.
Scelte di progetto da riprendere
- Visite e ricoveri sono tabelle distinte, non un’unica tabella «accessi» con una colonna di tipo. Hanno pochissime colonne in comune. Unirle genererebbe NULL il cui significato dipende dal tipo.
- Le prescrizioni fanno riferimento alla visita, non direttamente al paziente e al medico. La visita serve all’audit, e da lì si risale a paziente e medico.
- Un NULL in discharged_at significa «ancora ricoverato». È un fatto che si può interrogare. Una colonna di stato separata andrebbe invece tenuta sincronizzata a mano.
Il SQL
Dialetto PostgreSQL. Questo SQL è già nello strumento qui sopra, e puoi copiarlo liberamente nel tuo database o in una migrazione.
CREATE TABLE departments (
id bigserial PRIMARY KEY,
name varchar(80) NOT NULL UNIQUE
);
CREATE TABLE doctors (
id bigserial PRIMARY KEY,
department_id bigint NOT NULL REFERENCES departments(id),
full_name varchar(120) NOT NULL,
specialty varchar(80) NOT NULL
);
CREATE TABLE patients (
id bigserial PRIMARY KEY,
mrn varchar(20) NOT NULL UNIQUE,
full_name varchar(120) NOT NULL,
born_on date NOT NULL,
blood_type varchar(3)
);
COMMENT ON COLUMN patients.mrn IS 'Numero di cartella clinica, l’identificativo che usa davvero il personale';
CREATE TABLE appointments (
id bigserial PRIMARY KEY,
patient_id bigint NOT NULL REFERENCES patients(id),
doctor_id bigint NOT NULL REFERENCES doctors(id),
at timestamptz NOT NULL,
status varchar(20) NOT NULL DEFAULT 'booked',
notes text
);
COMMENT ON COLUMN appointments.status IS 'prenotata -> svolta, oppure mancata / annullata';
CREATE TABLE admissions (
id bigserial PRIMARY KEY,
patient_id bigint NOT NULL REFERENCES patients(id),
ward varchar(40) NOT NULL,
admitted_at timestamptz NOT NULL,
discharged_at timestamptz
);
COMMENT ON COLUMN admissions.discharged_at IS 'NULL finché il paziente è ricoverato';
CREATE TABLE medications (
id bigserial PRIMARY KEY,
name varchar(120) NOT NULL,
form varchar(40) NOT NULL
);
COMMENT ON COLUMN medications.form IS 'compressa / iniezione / sciroppo …';
CREATE TABLE prescriptions (
id bigserial PRIMARY KEY,
appointment_id bigint NOT NULL REFERENCES appointments(id),
medication_id bigint NOT NULL REFERENCES medications(id),
dosage varchar(60) NOT NULL,
days int NOT NULL
);Domande frequenti
Dove vanno gli esami di laboratorio?
Servono due tabelle. La tabella lab_orders fa riferimento alla visita, come le prescrizioni. La tabella lab_results fa riferimento a lab_orders, in un rapporto uno a uno, o uno a molti se un esame riporta più valori.
Una tabella dei medici basta anche per infermieri e personale?
Per uno schema da esercizio basta una tabella staff con una colonna ruolo. I sistemi reali separano il personale sanitario perché turni, abilitazioni e retribuzioni sono diversi. Parti dalla soluzione semplice e separa quando una query lo richiede.