Exemples / Gestion hospitalière
Gestion hospitalière
La base d’un hôpital tourne autour de deux tables d’événements. Une consultation est une rencontre en externe avec un médecin, une hospitalisation un séjour dans un service. Les deux tables référencent le patient. Les prescriptions sont rédigées à chaque consultation et référencent un catalogue de médicaments.
Ci-dessous, ErdDocs dessine ce schéma à partir de son SQL, avec toutes les tables et relations. L’onglet « Dictionnaire de données » contient la version imprimable, complète et gratuite sur cette page. Le SQL se trouve plus bas.
Survolez une table pour mettre en évidence ses relations. Un clic les fige.
Le rôle de chaque table
- patientsLe personnel utilise le numéro de dossier, mrn. L’id de substitution reste interne.
- doctors / departmentsUn simple un à plusieurs. La spécialité appartient au médecin, pas au service.
- appointmentsLa consultation en externe, avec patient, médecin, horaire et issue.
- admissionsLe séjour à l’hôpital. Tant que le patient est dans le service, discharged_at reste NULL.
- medications / prescriptionsLes prescriptions sont rattachées à la consultation, qui donne le contexte clinique de l’ordonnance.
Des choix de conception à reprendre
- Consultations et hospitalisations sont deux tables, et non une table « passages » avec une colonne de type. Elles n’ont presque aucune colonne commune. Les fusionner créerait des NULL dont le sens dépend du type.
- Les prescriptions référencent la consultation, et non directement le patient et le médecin. La consultation sert à l’audit, et on retrouve à partir d’elle le patient et le médecin.
- Un NULL dans discharged_at veut dire « encore hospitalisé ». C’est un fait que l’on peut interroger. Une colonne de statut séparée devrait, elle, être tenue à jour à la main.
Le SQL
Dialecte PostgreSQL. Ce SQL est déjà dans l’outil ci-dessus, et vous pouvez le copier librement dans votre base ou dans une migration.
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 'Numéro de dossier médical, l’identifiant qu’utilise vraiment le personnel';
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 'réservée -> vue, ou absent / annulée';
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 tant que le patient est hospitalisé';
CREATE TABLE medications (
id bigserial PRIMARY KEY,
name varchar(120) NOT NULL,
form varchar(40) NOT NULL
);
COMMENT ON COLUMN medications.form IS 'comprimé / injection / sirop …';
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
);Questions fréquentes
Où mettre les analyses de laboratoire ?
Il faut deux tables. La table lab_orders référence la consultation, comme les prescriptions. La table lab_results référence lab_orders, en un à un, ou en un à plusieurs si une analyse renvoie plusieurs valeurs.
Une table des médecins suffit-elle pour les infirmiers et le personnel ?
Pour un schéma d’exercice, une table staff avec une colonne de rôle suffit. Les vrais systèmes séparent le personnel soignant, car plannings, diplômes et paie diffèrent. Commencez simple et séparez quand une requête l’exige.