ErdDocs

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.

Il tuo schema

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.

Altri esempi