Définir ce qu'est une base de données en partant d'une analogie avec Excel
Evoquer les principes de conception qui permettent de créer une base de données
Aborder les notions de tables, de jointures et de schémas
Aborder le SQL, ce langage de programmation qui permet de requêter les bases de données
Principes de conception
Une base de données (BDD) est comme un grand tableur Excel, où chaque feuille représente une table.
Tout l’enjeu d’une base de données est :
d’éviter les redondances des données, pour prendre moins d’espace
de contenir le moins de cases vides possibles, toujours pour occuper moins d’espace
d’être le plus flexible possible, pour pouvoir ajouter de nouvelles données que l’on n’avait pas prévues initialement
Structurer les données en tables
Comment feriez-vous pour stocker dans un tableur Excel les données de biologie et les données démographiques de 5 patients ?
Mettons que l’on ait besoin de stocker le taux d’hémoglobine, les plaquettes et les leucocytes.
Le premier réflexe qui vient à l’esprit est de créer une colonne par paramètre de biologie.
Nous ajoutons une colonne date_biologie pour connaître la date de réalisation du prélèvement biologique.
patient_id
age
sexe
date_admission
date_sortie
date_biologie
hémoglobine
plaquettes
leucocytes
1
45
M
2024-10-01
2024-10-10
2024-10-03
13.5
/
/
1
45
M
2024-10-01
2024-10-10
2024-10-04
/
150,000
7,200
2
60
F
2024-09-25
2024-10-05
2024-09-26
12.8
180,000
8,000
3
38
F
2024-10-05
2024-10-12
2024-10-07
14.0
220,000
/
3
38
F
2024-10-05
2024-10-12
2024-10-08
/
/
6,500
4
52
M
2024-09-20
2024-09-30
2024-09-21
11.5
140,000
9,500
5
29
F
2024-10-08
2024-10-15
2024-10-09
13.2
170,000
7,800
5
29
F
2024-10-16
2024-10-20
2024-10-16
14.2
/
/
Comment lire ce tableau ?
Le patient 1 a un seul séjour (une seule date_admission) et deux dosages biologiques à deux dates différentes durant ce même séjour (deux valeurs pour date_biologie).
Le patient 5 a deux séjours (deux valeurs pour date_admission), avec une biologie prélevée par séjour (deux valeurs différentes de date_biologie).
Nous pouvons remarquer deux choses :
Il existe une redondance des données démographiques (âge, sexe, dates d'admission et de sortie)
Nous avons dû créer une ligne par date de prélèvement biologique, ce qui fait que nous avons des cases vides aux dates où certaines biologies n'ont pas été réalisées
Si l’on revient à nos trois principes de conception (éviter les redondances, moins de cases vides et flexibilité), il semblerait que l’on puisse faire mieux.
Pourquoi ne pas créer une table (ou une feuille Excel pour continuer avec l’analogie) pour les patients ?
patient_id
age
sexe
1
45
M
2
60
F
3
38
F
4
52
M
5
29
F
On gagne ainsi de la place avec 3 lignes en moins.
Pourquoi ne pas avoir intégré les séjours dans cette table ?
Si on avait intégré les séjours dans cette table (avec les colonnes date_admission et date_sortie), nous aurions certes eu une seule ligne pour les patients 1 à 4, mais deux lignes pour le patient 5, qui a deux séjours différents.
Toujours dans une logique de diminuer le nombre de lignes, on préférera créer une table pour les séjours.
patient_id
admission_id
date_admission
date_sortie
1
1
2024-10-01
2024-10-10
2
2
2024-09-25
2024-10-05
3
3
2024-10-05
2024-10-12
4
4
2024-09-20
2024-09-30
5
5
2024-10-08
2024-10-15
5
6
2024-10-16
2024-10-20
Pour finir, nous allons créer une table pour stocker les données de biologie.
patient_id
admission_id
date_biologie
hémoglobine
plaquettes
leucocytes
1
1
2024-10-03
13.5
/
/
1
1
2024-10-04
/
150,000
7,200
2
2
2024-09-26
12.8
180,000
8,000
3
3
2024-10-07
14.0
220,000
/
3
3
2024-10-07
/
/
6,500
4
4
2024-09-21
11.5
140,000
9,500
5
5
2024-10-09
13.2
170,000
7,800
5
6
2024-10-16
14.2
/
/
OK, mais ici nous avons encore des cases vides, nous pourrions optimiser.
La solution est de créer une colonne pour le nom du paramètre biologique, et une colonne pour sa valeur. Ainsi, plus de case vide !
patient_id
admission_id
date_biologie
paramètre
valeur
1
1
2024-10-03
hémoglobine
13.5
1
1
2024-10-04
plaquettes
150,000
1
1
2024-10-04
leucocytes
7,200
2
2
2024-09-26
hémoglobine
12.8
2
2
2024-09-26
plaquettes
180,000
2
2
2024-09-26
leucocytes
8,000
3
3
2024-10-07
hémoglobine
14.0
3
3
2024-10-07
plaquettes
220,000
3
3
2024-10-07
leucocytes
6,500
4
4
2024-09-21
hémoglobine
11.5
4
4
2024-09-21
plaquettes
140,000
4
4
2024-09-21
leucocytes
9,500
5
5
2024-10-09
hémoglobine
13.2
5
5
2024-10-09
plaquettes
170,000
5
5
2024-10-09
leucocytes
7,800
5
6
2024-10-16
hémoglobine
14.2
Nous venons de créer une base de données !
Alors certes, cela peut paraître moins lisible au premier abord, mais quand on a des millions de données, il est nécessaire d’optimiser leur stockage.
Et vous le verrez si vous faites un peu de programmation, cette manière d’organiser les données est finalement bien plus lisible qu’un fichier Excel à 50, 100 colonnes…
Jointures
Les données sont maintenant éparpillées sur plusieurs tables.
Comment les fusionner de nouveau ?
Si l’on veut fusionner plusieurs tables, on fera ce que l’on appelle une jointure.
Par exemple, si on fait une jointure entre les tables patients et séjours, en faisant une correspondance sur la colonne patient_id, nous obtiendrons cette table :
patient_id
age
sexe
admission_id
date_admission
date_sortie
1
45
M
1
2024-10-01
2024-10-10
2
60
F
2
2024-09-25
2024-10-05
3
38
F
3
2024-10-05
2024-10-12
4
52
M
4
2024-09-20
2024-09-30
5
29
F
5
2024-10-08
2024-10-15
5
29
F
6
2024-10-16
2024-10-20
On pourra joindre les données de la table biologie de la même façon, et obtenir le tableau du début de l’article.
Requêter une base de données
Il existe un langage de programmation qui permet spécifiquement de requêter les bases de données.
Ce langage se nomme SQL, pour Structured Query Language.
C’est un langage assez simple et facile d’accès.
Il se compose de quelques mots clefs qui permettent d’obtenir les données que l’on veut, dont (non exhaustif) :
SELECT : vous choisissez les colonnes que vous voulez garder
FROM : de quelle table seront extraites les données ?
WHERE : quels filtres appliquer sur les données ?
Par exemple :
SELECTpatient_id,age,sexeFROMpatientsWHEREage>45
On sélectionne les colonnes patient_id, age, sexe de la table patients où la valeur de la colonne age est supérieur à la valeur 45.
On a le résultat suivant :
patient_id
age
sexe
2
60
F
4
52
M
Schémas de BDD
Ce que l’on appelle un schéma de base de données est la structure des tables qui composent une base de données.
Il spécifie :
le nom des tables
le nom des colonnes de chaque table
le type de données de chaque colonne (si la colonne doit comprendre des données de type texte ou numérique par exemple)
Par exemple, OMOP est un schéma de BDD spécialisée dans les données de santé.
Le schéma de données du modèle OMOP
Cette base est assez complexe, ce qui est nécessaire pour englober toutes les données de santé.
De même que nous l’avons fait plus haut, vous pouvez retrouver la table person qui correspond aux patients et la table visit_detail qui correspond aux séjours.
Conclusion
Les points à retenir :
Une base de données est un ensemble de tables avec un schéma particulier (noms des colonnes et type des données)
Les schémas des bases sont contruits selon des principes : éviter les redondances, optimiser l'espace et permettre la flexibilité
Les tables peuvent être liées entre-elles à l'aide de jointures
Le SQL est un langage de programmation permettant de requêter les bases de données
Le modèle OMOP CDM organise les données de santé autour de tables standardisées. Pour explorer la structure complète, consultez le schéma OMOP v5.4.
Ctrl/Cmd + Entrée : Exécuter
Ctrl/Cmd + Shift + Entrée : Exécuter et valider
1PERSON
2VISIT_OCCURRENCE
3VISIT_DETAIL
4DEATH
5OBSERVATION_PERIOD
6CONCEPT
7SYNTHÈSE
Année 2135. Vous êtes data scientist spécialisé en données massives de santé, et référent OMOP de votre hôpital. Toutes les données des patients sont désormais informatisées et stockées dans des bases fédérées au format OMOP CDM, le standard international qui a unifié les systèmes de santé du monde entier.
Ce matin, une demande urgente arrive sur votre terminal : retrouver le dossier d'un patient. Seule information disponible : le patient est né en 2054.
À vous de jouer.
La table PERSON contient les informations démographiques de chaque patient. C’est le point de départ pour retrouver notre patient né en 2054.
1Exercice 1.1 : Explorer la table PERSON
Commencez par explorer la structure de la table person. Affichez les 5 premières lignes pour découvrir les colonnes disponibles.
Exercice 1.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 1.2 : Compter les patients
Combien de patients sont enregistrés dans la base de votre hôpital ? Cela vous donnera une idée de l’ampleur de la recherche.
Exercice 1.2
Utilisez COUNT(*)
3Exercice 1.3 : Trouver le patient
Vous savez que le patient recherché est né en 2054. Trouvez son person_id en filtrant sur l’année de naissance (year_of_birth).
Exercice 1.3
Filtrez avec WHERE sur l'année de naissance
Patient identifié : 8789342.
Pour comprendre son parcours médical, vous devez maintenant explorer son historique d'hospitalisations.
Quand a-t-il été hospitalisé ? Combien de fois ? Et quelle a été la durée de chaque séjour ?
La table VISIT_OCCURRENCE enregistre chaque hospitalisation d’un patient. Une hospitalisation peut contenir plusieurs séjours hospitaliers (dans la table visit_detail).
1Exercice 2.1 : Explorer les hospitalisations
Affichez les 5 premières hospitalisations de la table visit_occurrence.
Exercice 2.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 2.2 : Compter les hospitalisations
Combien y a-t-il d’hospitalisations au total dans la base ?
Exercice 2.2
Utilisez COUNT(*)
3Exercice 2.3 : Hospitalisations par patient
Combien d’hospitalisations a effectué notre patient (person_id = 8789342) ?
Exercice 2.3
Filtrez avec WHERE sur person_id
4Exercice 2.4 : Durée des hospitalisations
Calculez la durée en jours de chaque hospitalisation de notre patient, triées par date de début. Affichez l’identifiant de l’hospitalisation, les dates de début et fin, et créez une colonne duree_hospit pour la durée calculée.
Exercice 2.4
Calculez la différence entre date de fin et date de début, et nommez la colonne avec AS (ex: date_fin - date_debut AS duree_hospit)
Hospitalisation identifiée : 6687131 (25 jours).
Cette hospitalisation a duré 25 jours. Que s'est-il passé pendant ce séjour ? Dans quels services le patient est-il passé ?
La table VISIT_DETAIL contient les détails granulaires d’une hospitalisation : passages aux urgences, transferts entre unités, séjours dans différentes unités hospitalières…
1Exercice 3.1 : Explorer les détails
Affichez les 5 premières lignes de la table visit_detail pour découvrir sa structure.
Exercice 3.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 3.2 : Détails de l'hospitalisation
Combien de séjours hospitaliers (lignes dans visit_detail) sont liés à l’hospitalisation visit_occurrence_id = 6687131 ?
Exercice 3.2
Utilisez COUNT(*) et filtrez sur visit_occurrence_id
3Exercice 3.3 : Parcours du patient
Affichez tous les séjours de cette hospitalisation, triés par date de début. Sélectionnez visit_detail_id, visit_detail_start_date, visit_detail_end_date et care_site_id.
Exercice 3.3
Filtrez sur l'hospitalisation et triez par date de début de séjour
4Exercice 3.4 : Durée des séjours
Calculez la durée de chaque séjour pour cette hospitalisation. Ajoutez une colonne duree_sejour (en jours) à la requête précédente.
Exercice 3.4
Calculez la différence entre date de fin et date de début du séjour
5Exercice 3.5 : Nom des unités
En repartant de la requête précédente, récupérez le nom des unités (care_site_name) en joignant visit_detail avec la table care_site.
Exercice 3.5
Faites une jointure avec care_site pour obtenir le nom de l'unité
Intéressons-nous maintenant aux décès.
La table DEATH enregistre les décès des patients. Elle contient une ligne par patient décédé, avec la date et éventuellement la cause du décès. Explorons cette table pour comprendre la mortalité dans notre cohorte, et regardons si le patient que l'on suit est décédé.
1Exercice 4.1 : Explorer la structure de DEATH
Affichez toutes les colonnes de la table death pour découvrir sa structure.
Exercice 4.1
Utilisez SELECT * FROM ...
2Exercice 4.2 : Compter les décès
Combien de patients sont décédés dans cette base ?
Exercice 4.2
Utilisez COUNT(*)
3Exercice 4.3 : Notre patient est-il décédé ?
Vérifiez si notre patient 8789342 est décédé en faisant une jointure LEFT JOIN entre person et death. Affichez le person_id et la death_date (qui sera NULL si le patient est vivant).
Exercice 4.3
Faites une jointure entre person et death sur person_id
Notre patient 8789342 est vivant.
La table OBSERVATION_PERIOD définit la période pendant laquelle un patient est suivi dans le système de santé. Elle est calculée à partir des dates min et max des hospitalisations du patient. Cette information est essentielle pour les études longitudinales.
1Exercice 5.1 : Explorer les périodes d'observation
Affichez les 5 premières lignes de la table observation_period.
Exercice 5.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 5.2 : Durée de suivi de notre patient
Calculez la durée de suivi en jours pour notre patient 8789342. Affichez le person_id, les dates de début et fin, et créez une colonne duree_suivi.
Exercice 5.2
Filtrez sur person_id et calculez la différence entre les dates
Bien joué, vous avez exploré toutes les informations concernant le patient et ses séjours !
Maintenant voyons en détail la table CONCEPT, centrale dans le modèle OMOP. Cette table contient toutes les terminologies standardisées (SNOMED, LOINC, RxNorm...). C'est la clé pour comprendre les codes utilisés dans les autres tables.
1Exercice 6.1 : Explorer les concepts
Affichez les 5 premiers concepts de la table concept.
Exercice 6.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 6.2 : Trouver un concept
Recherchez le concept dont le concept_id est 8532.
Exercice 6.2
Filtrez avec WHERE sur concept_id
3Exercice 6.3 : Jointure patient-concept
Affichez le nom du genre (concept_name) pour notre patient 8789342. Joignez person et concept sur gender_concept_id.
Exercice 6.3
Joignez person avec concept sur gender_concept_id = concept_id
Félicitations ! Vous avez exploré les tables fondamentales du modèle OMOP.
Il est temps de mettre en pratique toutes vos connaissances en combinant plusieurs tables dans une seule requête. C'est le vrai travail d'un data scientist en santé : croiser les informations pour obtenir une vue complète des données patient.
1Exercice 7.1 : Synthèse - Vue complète des séjours
Créez une vue complète des séjours de l’hospitalisation 6687131 en combinant visit_detail, person, concept, care_site et death.
Affichez :
person_id
visit_occurrence_id
visit_detail_id
visit_detail_start_datetime
visit_detail_end_datetime
care_site_name : le nom du service
birth_datetime
gender_concept_name : le nom du genre
age : l'âge au moment du séjour
death_datetime : la date de décès (si applicable)
Exercice 7.1
Combinez visit_detail avec person, concept, care_site et death par des jointures
Niveau Intermédiaire : Données cliniques
Vous maîtrisez les bases du modèle OMOP. Ce niveau explore les tables cliniques : diagnostics, mesures, observations, procédures et dispositifs médicaux.
Ctrl/Cmd + Entrée : Exécuter
Ctrl/Cmd + Shift + Entrée : Exécuter et valider
1CONDITION
2MEASUREMENT
3OBSERVATION
4PROCEDURE
5DEVICE
6SYNTHÈSE
Bienvenue dans le niveau intermédiaire ! Nous allons explorer les tables cliniques du modèle OMOP.
Commençons par la table CONDITION_OCCURRENCE, qui contient les diagnostics posés. Dans OMOP, chaque diagnostic est encodé via un condition_concept_id standardisé.
La table CONDITION_OCCURRENCE stocke les diagnostics. Chaque ligne = un diagnostic posé pour un patient à une date donnée.
1Exercice 1.1 : Explorer la table CONDITION_OCCURRENCE
Découvrez la structure de la table condition_occurrence en affichant les 5 premières lignes.
Exercice 1.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 1.2 : Compter les diagnostics du patient
Combien de diagnostics ont été posés pour notre patient 8789342 ?
Exercice 1.2
Utilisez COUNT(*) et filtrez sur person_id
3Exercice 1.3 : Lister les diagnostics avec leur nom
Affichez les diagnostics du patient avec leur nom lisible. Joignez la table concept pour traduire les condition_concept_id.
Exercice 1.3
Joignez avec concept sur condition_concept_id = concept_id
4Exercice 1.4 : Diagnostics uniques du patient
Un même diagnostic peut apparaître plusieurs fois (à chaque hospitalisation). Listez les diagnostics uniques du patient avec leur nombre d’occurrences.
Exercice 1.4
Utilisez GROUP BY et COUNT(*), triez par ordre décroissant
Nous avons maintenant une connaissance plus précise du patient, après avoir vu ses antécédents médicaux.
Explorons maintenant la table MEASUREMENT, qui contient les résultats quantitatifs : paramètres vitaux, examens biologiques, scores cliniques. C'est souvent la table la plus volumineuse d'une base OMOP.
La table MEASUREMENT stocke les mesures avec leur valeur numérique, leur unité et leurs bornes de référence.
1Exercice 2.1 : Explorer la table MEASUREMENT
Découvrez la structure de la table measurement en affichant les 5 premières lignes.
Exercice 2.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 2.2 : Compter les mesures du patient
Combien de mesures ont été enregistrées pour notre patient 8789342 ?
Exercice 2.2
Utilisez COUNT(*) et filtrez sur person_id
3Exercice 2.3 : Types de mesures les plus fréquents
Quels types de mesures sont les plus fréquents pour ce patient ? Affichez le nom de chaque type de mesure et son nombre d’occurrences.
Exercice 2.3
Joignez avec concept, groupez et triez par count décroissant. Nommez la colonne du comptage nb_mesures (ex: COUNT(*) AS nb_mesures)
4Exercice 2.4 : Évolution de la fréquence cardiaque
Analysez l’évolution de la fréquence cardiaque (Heart rate, concept_id = 3027018) du patient. Affichez la date, la valeur et l’unité.
Exercice 2.4
Filtrez sur le concept_id de la fréquence cardiaque, triez par datetime
5Exercice 2.5 : Statistiques sur la fréquence cardiaque
Calculez les statistiques de la fréquence cardiaque : valeur minimale, maximale et moyenne.
Exercice 2.5
Utilisez MIN(), MAX(), AVG() sur value_as_number
Explorons maintenant les observations cliniques. La table OBSERVATION capture les observations médicales : échelles de douleur, résultats d'examen clinique...
La table OBSERVATION contient des informations diverses : antécédents, habitudes, évaluations qualitatives.
1Exercice 3.1 : Explorer la table OBSERVATION
Découvrez la structure de la table observation en affichant les 5 premières lignes.
Exercice 3.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 3.2 : Types d'observations
Quels types d’observations sont enregistrés pour ce patient ? Affichez le nom et le nombre d’occurrences de chaque type.
Exercice 3.2
Joignez avec concept, groupez et triez par count
3Exercice 3.3 : Mode d'oxygénation
Le patient a reçu différents modes d’oxygénation (concept_id = 4036936). Affichez la date et le mode d’administration stocké dans value_as_string.
Note : ce concept n’apparaît pas dans l’exercice précédent car il n’est pas disponible dans notre table concept réduite (licence SNOMED). Les données existent néanmoins dans observation.
Exercice 3.3
Filtrez sur observation_concept_id et affichez value_as_string
Voyons maintenant les actes médicaux réalisés. La table PROCEDURE_OCCURRENCE contient les procédures : interventions chirurgicales, examens d'imagerie, gestes techniques...
La table PROCEDURE_OCCURRENCE enregistre tous les actes médicaux réalisés sur le patient.
1Exercice 4.1 : Explorer la table PROCEDURE_OCCURRENCE
Découvrez la structure de la table procedure_occurrence en affichant les 5 premières lignes.
Exercice 4.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 4.2 : Procédures du patient
Listez les procédures réalisées pour notre patient avec leur nom et leur nombre d’occurrences.
Exercice 4.2
Joignez avec concept et groupez par concept_name
3Exercice 4.3 : Chronologie des procédures
Affichez la chronologie des procédures du patient : date, nom de la procédure, triées par date. Utilisez DISTINCT pour éviter les doublons.
Exercice 4.3
Utilisez DISTINCT, joignez avec concept, triez par datetime
Terminons avec les dispositifs médicaux. La table DEVICE_EXPOSURE enregistre les dispositifs utilisés : sondes, cathéters, prothèses, pompes...
La table DEVICE_EXPOSURE contient les dispositifs médicaux utilisés pour le patient.
1Exercice 5.1 : Explorer la table DEVICE_EXPOSURE
Découvrez la structure de la table device_exposure en affichant les 5 premières lignes.
Exercice 5.1
Utilisez SELECT * FROM ... LIMIT 5
2Exercice 5.2 : Dispositifs utilisés
Quels dispositifs ont été utilisés pour ce patient ? Affichez le nom du dispositif et le nombre d’utilisations.
Exercice 5.2
Joignez avec concept et groupez par dispositif
Synthèse finale : Combinez vos connaissances pour créer une vue complète du patient. Vous allez croiser les données de plusieurs tables cliniques pour obtenir un résumé médical complet.
1Exercice 6.1 : Du format long au format large
Repartez de la requête de synthèse du niveau Facile (fournie ci-dessous) et enrichissez-la en ajoutant pour chaque séjour :
hr_min : la fréquence cardiaque minimale (measurement_concept_id = 3027018)
septic_shock : 1 si le patient a eu un choc septique durant le séjour (condition_concept_id = 10420211), 0 sinon
On suppose que chaque personne avec un identifiant unique différent est en fait une personne différente et que les données de deux personnes différentes ne doivent pas être combinées.
Toute liaison de personnes nécessaire pour identifier de manière unique les Personnes doit être effectuée avant l'écriture de cette table. Cet identifiant peut être l'id original des données source s'il s'agit d'un entier, sinon il peut être un numéro auto-généré.
integer
Oui
PK
-
-
-
gender_concept_id
Ce champ est destiné à capturer le sexe biologique à la naissance de la Personne. Ce champ ne doit pas être utilisé pour étudier les questions d'identité de genre.
Utilisez la valeur de genre présente dans les données en supposant qu'il s'agit du sexe biologique à la naissance. Si les données source capturent l'identité de genre, elle doit être stockée dans la table OBSERVATION.
Pour les sources de données avec date de naissance, l'année doit être extraite. Si aucune année de naissance n'est disponible, supprimez les données de la personne de l'instance CDM.
integer
Oui
-
-
-
-
month_of_birth
-
Pour les sources de données qui fournissent la date de naissance précise, le mois doit être extrait et stocké dans ce champ.
integer
Non
-
-
-
-
day_of_birth
-
Pour les sources de données qui fournissent la date de naissance précise, le jour doit être extrait et stocké dans ce champ.
integer
Non
-
-
-
-
birth_datetime
Ce champ n'est pas requis mais fortement recommandé.
Pour les sources de données qui fournissent la date et l'heure précises de naissance, cette valeur doit être stockée dans ce champ.
datetime
Non
-
-
-
-
race_concept_id
Ce champ capture l'origine ethnique de la personne.
N'utilisez ce champ que si vous avez des informations sur l'origine ethnique disponibles dans les données source. Les origines mixtes ne sont actuellement pas supportées. Si une personne a plus d'une origine enregistrée, mettez Concept_Id 0.
Cette table sert de gestion centrale de l'identité pour toutes les Personnes dans la base de données. Elle contient des enregistrements qui identifient de manière unique chaque personne ou patient, ainsi que quelques informations démographiques.
Guide utilisateur
Tous les enregistrements de cette table sont des Personnes indépendantes.
Conventions ETL
Toutes les Personnes d'une base de données doivent avoir un enregistrement dans cette table, sauf si elles échouent aux exigences de qualité des données spécifiées dans l'ETL. Les Personnes sans Événements doivent quand même avoir un enregistrement. Si plus d'une source de données contribue aux Événements de la base de données, les Personnes doivent être réconciliées, si possible, entre les sources pour créer un seul enregistrement par Personne. Le contenu de BIRTH_DATETIME doit être équivalent au contenu de BIRTH_DAY, BIRTH_MONTH et BIRTH_YEAR.
Pour les conventions détaillées, consultez le dépôt THEMIS.
OBSERVATION_PERIOD
Champ CDM
Guide utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
observation_period_id
Identifie chaque période d'observation distincte par personne.
Attribuez un ID unique à chaque période discrète par personne.
integer
Oui
PK
-
-
-
person_id
Lien vers la personne concernée par la période d'observation.
Doit correspondre à une entrée valide dans la table PERSON.
La table OBSERVATION_PERIOD définit les périodes de temps pendant lesquelles les événements cliniques sont censés être enregistrés pour une personne. Elle établit la période où les événements indiquent des occurrences réelles, et leur absence suggère une non-occurrence.
Guide utilisateur
Chaque personne peut avoir plusieurs enregistrements OBSERVATION_PERIOD non chevauchants. Les événements peuvent exister en dehors de ces périodes mais ne peuvent pas être présumés absents. Les calculs d'incidence et de prévalence ne doivent utiliser que les périodes d'observation actives. Lors de la définition des cohortes, les événements en dehors de ces périodes peuvent informer les critères d'inclusion, bien que l'exhaustivité ne soit pas garantie. Les périodes courtes (jours uniques) peuvent fausser les calculs de taux, donc l'application d'exigences minimales de temps d'observation est recommandée.
Conventions ETL
Chaque personne nécessite au moins un OBSERVATION_PERIOD représentant les intervalles avec une capture élevée d'événements cliniques. Ceux-ci peuvent dériver des périodes d'affiliation (données d'assurance) ou nécessiter une inférence (systèmes DPI). Le début reflète typiquement l'événement clinique le plus ancien, et la fin reflète soit l'événement le plus récent, soit la date de coupure de la base de données. Les périodes à événement unique sont valides. Les périodes chevauchantes ou adjacentes doivent être fusionnées en une seule.
La table DEATH contient l'événement clinique du décès d'une personne. Chaque personne peut avoir au maximum un enregistrement dans cette table. La cause du décès peut être capturée si disponible.
Guide utilisateur
Les personnes vivantes ne doivent pas avoir d'enregistrement dans cette table. Chaque personne ne peut avoir qu'un seul enregistrement de décès. Si plusieurs enregistrements de décès existent dans les données source, choisissez le plus fiable en fonction de l'évaluation de la qualité des données.
Conventions ETL
Si les informations de décès proviennent de plusieurs sources (par ex. DPI et données d'assurance), réconciliez-les pour créer un seul enregistrement de décès. Le death_type_concept_id doit refléter la source la plus fiable. La cause du décès doit être mappée vers un Concept Standard dans le domaine Condition quand c'est possible.
VISIT_OCCURRENCE
Champ CDM
Guide utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
visit_occurrence_id
Identifiant unique pour chaque interaction.
Créé en attribuant un ID distinct à chaque rencontre patient-système de santé.
La table VISIT_OCCURRENCE contient des événements représentant les périodes où les personnes interagissent avec le système de santé. Ces rencontres sont configurées par des circonstances spécifiques incluant la localisation du patient (institutionnelle vs. à distance), la disponibilité du prestataire et la durée du séjour.
Guide utilisateur
Les types de visites sont organisés hiérarchiquement en utilisant des concepts standardisés du domaine Visit. Les configurations de visites courantes incluent : Visite hospitalière (admission à l'hôpital avec séjour au lit dépassant un jour), Visite aux urgences (soins d'urgence le même jour), Visite ambulatoire (soins ambulatoires le même jour sans lit), Visite à domicile (le prestataire fournit le service au domicile du patient), Visite de télésanté (interaction patient-prestataire à distance), Visites en pharmacie/laboratoire (visites spécialisées le même jour), Visite de gestion de cas (interaction administrative sans prestataires). La durée de la visite, ou 'durée de séjour', est définie comme VISIT_END_DATE - VISIT_START_DATE.
Conventions ETL
Les concepts de visite dérivent des systèmes de codage de santé (CPT, Place of Service). Lorsqu'ils ne sont pas disponibles, les visites doivent être inférées par des hypothèses ETL définies. Les visites peuvent être adjacentes mais ne peuvent pas se chevaucher sur des dates non-limites. Les visites multi-jours ne peuvent pas partager de jours sauf aux points de début/fin.
VISIT_DETAIL
Champ CDM
Guide utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
visit_detail_id
Identifiant unique pour chaque enregistrement de détail de visite.
La table VISIT_DETAIL représente les détails granulaires des enregistrements VISIT_OCCURRENCE parents. Elle maintient une relation 1:n où chaque VISIT_OCCURRENCE peut avoir zéro ou plusieurs enregistrements VISIT_DETAIL associés. Les exemples incluent les transferts d'unité pendant les séjours hospitaliers ou les lignes de facturation individuelles dans les demandes de remboursement.
Guide utilisateur
Les enregistrements VISIT_DETAIL doivent avoir leur VISIT_OCCURRENCE_ID associé spécifié. Chaque VISIT_DETAIL_CONCEPT_ID doit être un descendant du VISIT_CONCEPT_ID de la visite parente, maintenant une cohérence hiérarchique au sein de la structure du domaine des visites.
Conventions ETL
Le remplissage de VISIT_DETAIL est optionnel mais recommandé lorsque les données sources nécessitent une logique d'agrégation pour créer des enregistrements VISIT_OCCURRENCE unifiés. Dans les systèmes de dossiers médicaux électroniques, plusieurs interactions avec des professionnels de santé peuvent être consolidées en une seule visite en utilisant VISIT_DETAIL pour préserver les informations granulaires des rencontres.
CONDITION_OCCURRENCE
Champ CDM
Guide utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
condition_occurrence_id
Identifiant unique pour chaque occurrence de condition.
Cette table documente les événements cliniques indiquant une maladie ou une condition médicale. Les enregistrements capturent les diagnostics, signes ou symptômes soit observés par les professionnels de santé, soit rapportés par les patients.
Guide utilisateur
Les conditions sont organisées dans un système hiérarchique au sein du domaine Condition. Enregistrer toutes les conditions sources sans appliquer de filtres analytiques. Les diagnostics d'exclusion doivent être exclus. Les antécédents familiaux et les événements médicaux passés appartiennent à la table OBSERVATION.
Conventions ETL
Tous les codes sources mappant vers des concepts standard du domaine Condition doivent être enregistrés dans cette table. Les conditions en double au sein d'une même rencontre nécessitent une logique ETL pour déterminer s'il faut les consolider ou maintenir des enregistrements séparés.
DRUG_EXPOSURE
Champ CDM
Guide utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
drug_exposure_id
Identifiant unique pour chaque enregistrement d'exposition médicamenteuse.
La table DRUG_EXPOSURE capture les enregistrements documentant l'exposition d'une personne à un médicament ou une substance biochimique introduite dans le corps. Les médicaments comprennent les médicaments sur ordonnance et en vente libre, les vaccins et les thérapies biologiques.
Guide utilisateur
Les enregistrements de cette table indiquent l'exposition aux médicaments. La table documente les prescriptions rédigées, les prescriptions dispensées et les médicaments administrés par les professionnels de santé, le DRUG_TYPE_CONCEPT_ID différenciant ces types.
Conventions ETL
Les informations sur la quantité et la dose arrivent dans des formats variés ; l'ETL doit capturer autant de détails que possible. Les enregistrements multiples le même jour pour des médicaments identiques ne doivent pas être dédupliqués sans preuve solide de vraie duplication. Une attention particulière est requise pour les renouvellements de prescription.
PROCEDURE_OCCURRENCE
Champ CDM
Guide utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
procedure_occurrence_id
Identifiant unique pour chaque occurrence de procédure.
La table PROCEDURE_OCCURRENCE contient les enregistrements des activités ou processus prescrits par, ou réalisés par, un professionnel de santé sur le patient à des fins diagnostiques ou thérapeutiques.
Guide utilisateur
Les examens de laboratoire sont distincts des procédures. Les mesures représentent des résultats observés avec des quantités et unités attendues, tandis que les procédures sont des actions. La phlébotomie, bien que techniquement une procédure, est rarement capturée séparément car elle est généralement associée aux examens de laboratoire.
Conventions ETL
Lors du traitement des enregistrements en double, l'ETL doit déterminer s'il faut les consolider en un seul enregistrement ou les maintenir séparément. Les codes sources mappés vers des Concepts Standard du domaine Procedure doivent être enregistrés dans cette table.
DEVICE_EXPOSURE
Champ CDM
Guide utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
device_exposure_id
Identifiant unique pour chaque enregistrement d'exposition à un dispositif.
Le domaine Device capture les informations concernant l'exposition d'une personne à un objet physique étranger ou un instrument utilisé à des fins diagnostiques ou thérapeutiques. Cela inclut les objets implantables comme les pacemakers et les stents, les équipements et fournitures médicaux, les instruments utilisés dans les procédures médicales et les matériaux utilisés dans les soins cliniques.
Guide utilisateur
La distinction entre les dispositifs ou fournitures et les procédures est parfois floue, mais les premiers sont des objets physiques tandis que les secondes sont des actions, souvent pour appliquer un dispositif ou une fourniture.
Conventions ETL
Les codes sources et les champs de texte source qui mappent vers des Concepts Standard du domaine Device doivent être enregistrés dans cette table.
MEASUREMENT
Champ CDM
Guide utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
measurement_id
Identifiant unique pour chaque enregistrement de mesure.
La table MEASUREMENT enregistre des valeurs structurées (numériques ou catégorielles) obtenues par un examen ou des tests systématiques et standardisés d'une personne ou de son échantillon. Cela inclut les examens de laboratoire, les signes vitaux et les résultats quantitatifs de pathologie.
Guide utilisateur
Les mesures sont principalement des examens de laboratoire avec quelques exceptions, comme la pression artérielle ou les tests fonctionnels. Les résultats sont donnés sous forme de combinaison valeur et unité. Lors de l'investigation des mesures, recherchez les operator_concept_ids (<, >, etc.).
Conventions ETL
Seules les valeurs sources mappant vers des concepts du domaine Measurement appartiennent à cette table. Bien que les mesures aient toujours des résultats, les champs VALUE_AS_NUMBER et VALUE_AS_CONCEPT_ID sont optionnels car les données sources manquent souvent d'informations sur les résultats.
OBSERVATION
Champ CDM
Guide utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
observation_id
Identifiant unique pour chaque enregistrement d'observation.
La table OBSERVATION capture les faits cliniques sur une personne obtenus par examen, interrogatoire ou procédures. Elle enregistre les données qui ne peuvent pas être représentées ailleurs, comme les faits sociaux, les choix de mode de vie et les antécédents médicaux.
Guide utilisateur
Les observations diffèrent des mesures car elles ne nécessitent pas de tests standardisés pour générer des faits cliniques. La table enregistre généralement quand les observations ont été obtenues. Les exemples incluent les antécédents médicaux, les antécédents familiaux, les besoins de traitement, les circonstances sociales et les schémas d'utilisation des soins de santé.
Conventions ETL
Les enregistrements mappant vers des domaines autres que Condition, Procedure, Drug, Specimen, Measurement ou Device appartiennent ici. Les observations fonctionnent comme des paires attribut-valeur avec le Concept d'Observation comme attribut et les faits cliniques comme valeurs. Les valeurs peuvent être des Concepts, numériques ou textuelles.
NOTE
Description de la table
La table NOTE capture les notes cliniques et de texte libre documentant les soins du patient. Ces notes sont écrites par les professionnels de santé et contiennent des informations narratives sur les visites, les diagnostics, les traitements et les observations qui ne peuvent pas être facilement structurées.
La table NOTE contient les enregistrements de texte libre générés lors des interactions cliniques. Elle est essentielle pour capturer les informations narratives qui ne peuvent pas être codées dans les tables structurées. Les notes peuvent être analysées par des outils de NLP pour extraire des concepts (voir NOTE_NLP).
Conventions ETL
Le champ note_class_concept_id permet de catégoriser les notes (lettre de sortie, compte-rendu d'imagerie, etc.). L'encodage et la langue doivent être spécifiés pour permettre le traitement NLP ultérieur. Les champs note_event_id et note_event_field_concept_id permettent de lier la note à un événement clinique spécifique.
NOTE_NLP
Description de la table
La table NOTE_NLP stocke les résultats de l'analyse NLP (Natural Language Processing) appliquée aux notes cliniques. Elle capture les termes et concepts médicaux extraits automatiquement du texte libre, permettant de transformer les données non structurées en informations codifiées exploitables.
Contexte temporel du terme (passé, présent, futur).
Indique si le terme réfère à un état actuel ou historique.
VARCHAR(50)
Non
term_modifiers
Modificateurs contextuels du terme.
Informations sur la négation, l'incertitude, etc.
VARCHAR(2000)
Non
Guide Utilisateur
NOTE_NLP stocke les résultats des pipelines de traitement automatique du langage naturel. Chaque enregistrement représente un concept médical extrait d'une note clinique, avec son contexte (snippet), sa position dans le texte, et le mapping vers les vocabulaires standards OMOP.
Conventions ETL
Les champs term_exists et term_temporal sont essentiels pour l'interprétation : un terme peut être mentionné comme absent ("pas de diabète") ou historique ("antécédent de pneumonie"). Le nlp_system doit documenter l'outil utilisé pour permettre la reproductibilité et l'évaluation de la qualité des extractions.
EPISODE
Description de la table
La table EPISODE représente des séquences d'événements cliniques liés à un même contexte médical, typiquement un épisode de soins pour une condition spécifique comme un cancer ou une grossesse. Elle permet de regrouper les événements associés à une maladie ou un traitement particulier.
EPISODE est particulièrement utile pour l'oncologie où l'on suit des épisodes de maladie et de traitement. Un patient peut avoir plusieurs épisodes pour différents cancers ou différentes lignes de traitement. Les épisodes peuvent être hiérarchisés via episode_parent_id.
Conventions ETL
episode_concept_id définit la nature de l'épisode (Disease Episode pour une maladie, Treatment Episode pour un traitement). episode_object_concept_id spécifie de quoi il s'agit (ex: le type de cancer). Les événements individuels sont liés via la table EPISODE_EVENT.
EPISODE_EVENT
Description de la table
La table EPISODE_EVENT lie les épisodes aux événements cliniques individuels qui les composent. Elle permet d'associer des diagnostics, procédures, médicaments et autres événements cliniques à un épisode de soins spécifique.
EPISODE_EVENT est une table de liaison qui associe les événements cliniques (conditions, procédures, médicaments) à leurs épisodes respectifs. Par exemple, pour un épisode de cancer, on peut lier le diagnostic initial, les différentes chimiothérapies, et les bilans de surveillance.
Conventions ETL
Le champ episode_event_field_concept_id indique de quelle table provient event_id. Les concepts utilisés correspondent aux identifiants de champs CDM (ex: concept pour condition_occurrence_id, drug_exposure_id, etc.). Un même événement peut être associé à plusieurs épisodes si cliniquement pertinent.
SPECIMEN
Description de la table
La table SPECIMEN contient les informations sur les prélèvements biologiques collectés chez les patients. Elle documente les échantillons tels que le sang, l'urine, les biopsies tissulaires et autres spécimens utilisés pour les analyses de laboratoire ou les examens anatomopathologiques.
SPECIMEN documente les prélèvements biologiques indépendamment des analyses effectuées. Les résultats d'analyses sur ces spécimens sont dans MEASUREMENT. Cette table est particulièrement importante pour les biobanques et la recherche où la traçabilité des échantillons est essentielle.
Conventions ETL
Un même spécimen physique peut générer plusieurs enregistrements MEASUREMENT si plusieurs analyses sont effectuées. Le champ anatomic_site_concept_id utilise les concepts SNOMED pour la localisation. Le disease_status_concept_id est utile en oncologie pour distinguer les tissus sains des tissus tumoraux.
FACT_RELATIONSHIP
Description de la table
La table FACT_RELATIONSHIP permet de créer des relations entre les enregistrements de différentes tables cliniques. Elle établit des liens sémantiques entre les faits, comme la relation entre un diagnostic et un médicament prescrit pour ce diagnostic, ou entre une mesure et sa procédure associée.
Champ CDM
Guide Utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
domain_concept_id_1
Domaine du premier fait.
Concept identifiant le domaine (Condition, Drug, etc.).
FACT_RELATIONSHIP permet d'exprimer des relations complexes entre événements cliniques. Par exemple : "ce médicament a été prescrit pour cette condition", "cette mesure a été effectuée lors de cette procédure", ou "ces deux observations sont liées". Les relations peuvent être bidirectionnelles.
Conventions ETL
Les domain_concept_id utilisent les concepts de domaine (Drug, Condition, Measurement, etc.). Pour les relations symétriques, il faut créer deux enregistrements (A vers B et B vers A). Les relationship_concept_id définissent la sémantique de la relation (ex: "Has associated procedure", "Caused by").
LOCATION
Description de la table
La table LOCATION contient les adresses géographiques et informations de localisation. Elle peut représenter des adresses de patients, de prestataires de soins ou d'établissements de santé. Les données sont généralisées pour protéger la vie privée des patients.
LOCATION stocke les adresses de manière générique, utilisables pour les patients (via PERSON.location_id), les prestataires (via PROVIDER) et les établissements (via CARE_SITE). Les coordonnées géographiques peuvent être utilisées pour des analyses spatiales.
Conventions ETL
Pour la protection de la vie privée, les adresses des patients doivent être généralisées (ex: code postal uniquement, pas d'adresse complète). Les coordonnées latitude/longitude peuvent être décalées ou arrondies. Les localisations des établissements peuvent être plus précises.
CARE_SITE
Description de la table
La table CARE_SITE identifie les lieux physiques où les soins sont dispensés. Cela inclut les hôpitaux, cliniques, cabinets médicaux, services hospitaliers, et autres établissements ou unités de soins où les patients reçoivent des traitements.
Champ CDM
Guide Utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
care_site_id
Identifiant unique du site de soins.
Clé primaire générée automatiquement.
INTEGER
Oui
PK
care_site_name
Nom du site de soins.
Nom de l'établissement ou du service.
VARCHAR(255)
Non
place_of_service_concept_id
Type d'établissement.
Concept décrivant le type de lieu (hôpital, clinique, etc.).
Code original du type de lieu dans le système source.
VARCHAR(50)
Non
Guide Utilisateur
CARE_SITE représente la hiérarchie des établissements de soins. Un hôpital peut avoir plusieurs sites de soins (urgences, réanimation, cardiologie). Les visites et événements cliniques peuvent être rattachés à un care_site pour analyser les variations de pratique entre établissements.
Conventions ETL
La granularité du care_site dépend des données sources et des besoins analytiques. On peut représenter l'hôpital entier ou descendre au niveau du service. Le place_of_service_concept_id utilise les concepts CMS Place of Service ou équivalents européens.
PROVIDER
Description de la table
La table PROVIDER contient les informations sur les professionnels de santé qui dispensent les soins. Cela inclut les médecins, infirmiers, pharmaciens et autres praticiens impliqués dans la prise en charge des patients.
Champ CDM
Guide Utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
provider_id
Identifiant unique du prestataire.
Clé primaire générée automatiquement.
INTEGER
Oui
PK
provider_name
Nom du prestataire.
Nom complet ou pseudonyme.
VARCHAR(255)
Non
npi
National Provider Identifier (USA).
Identifiant national du professionnel.
VARCHAR(20)
Non
dea
Drug Enforcement Administration ID (USA).
Identifiant pour la prescription de substances contrôlées.
VARCHAR(20)
Non
specialty_concept_id
Spécialité médicale.
Concept décrivant la spécialité (cardiologie, chirurgie, etc.).
PROVIDER permet d'analyser les patterns de prescription et de soins par professionnel ou spécialité. Les événements cliniques peuvent référencer le provider_id pour identifier qui a réalisé l'acte ou prescrit le traitement. La spécialité est importante pour les études de variation des pratiques.
Conventions ETL
Le NPI et DEA sont des identifiants américains ; utiliser les identifiants nationaux équivalents pour d'autres pays (RPPS en France par exemple). Le provider_name peut être pseudonymisé pour la protection des données. Un même prestataire peut intervenir dans plusieurs care_sites.
COST
Description de la table
La table COST capture les informations de coûts associés aux événements cliniques. Elle permet de stocker les coûts des médicaments, procédures, visites et autres services de santé pour les analyses médico-économiques.
Champ CDM
Guide Utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
cost_id
Identifiant unique du coût.
Clé primaire générée automatiquement.
INTEGER
Oui
PK
cost_event_id
ID de l'événement associé au coût.
Référence polymorphe vers l'événement (drug_exposure_id, procedure_id, etc.).
INTEGER
Oui
cost_domain_id
Domaine de l'événement associé.
Nom du domaine (Drug, Procedure, Visit, etc.).
VARCHAR(20)
Oui
cost_type_concept_id
Type de coût.
Concept indiquant la nature du coût (facturé, remboursé, etc.).
COST permet les analyses de coût-efficacité et les études médico-économiques. Chaque coût est lié à un événement clinique spécifique via cost_event_id et cost_domain_id. Les différents champs permettent de distinguer les différentes composantes du financement des soins.
Conventions ETL
Les montants sont en unité monétaire définie par currency_concept_id. Pour la France, utiliser les codes GHM/GHS pour drg_source_value. Les champs de paiement détaillés dépendent de la structure du système de santé local. Tous les montants sont optionnels selon les données disponibles.
PAYER_PLAN_PERIOD
Description de la table
La table PAYER_PLAN_PERIOD capture les périodes de couverture d'assurance santé des patients. Elle documente les différents régimes d'assurance et les dates pendant lesquelles le patient était couvert par chaque plan.
PAYER_PLAN_PERIOD permet de suivre l'historique de couverture d'assurance des patients. Un patient peut avoir plusieurs périodes consécutives ou simultanées (assurance primaire et complémentaire). Cette information est cruciale pour les analyses d'accès aux soins et de suivi de population.
Conventions ETL
En France, distinguer l'assurance maladie obligatoire (AMO) des complémentaires (AMC). Créer des périodes séparées pour chaque changement de couverture. Les périodes ne doivent pas se chevaucher pour un même type de couverture. Les dates doivent être précises au jour près.
CONCEPT
Description de la table
La table CONCEPT est le cœur du système de vocabulaires OMOP. Elle contient tous les concepts standardisés utilisés pour représenter les données cliniques. Chaque concept a un identifiant unique et appartient à un vocabulaire et un domaine spécifiques.
Champ CDM
Guide Utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
concept_id
Identifiant unique du concept.
Clé primaire, attribuée par OHDSI.
INTEGER
Oui
PK
concept_name
Nom descriptif du concept.
Libellé lisible du concept.
VARCHAR(255)
Oui
domain_id
Domaine du concept.
Domaine auquel appartient le concept (Condition, Drug, etc.).
S = Standard, C = Classification, NULL = Non-standard.
VARCHAR(1)
Non
concept_code
Code original du concept.
Code dans le vocabulaire source (ex: code CIM-10, code SNOMED).
VARCHAR(50)
Oui
valid_start_date
Date de début de validité.
Date à partir de laquelle le concept est utilisable.
DATE
Oui
valid_end_date
Date de fin de validité.
Date jusqu'à laquelle le concept est valide.
DATE
Oui
invalid_reason
Raison d'invalidation.
U = Upgraded, D = Deleted, NULL = Valide.
VARCHAR(1)
Non
Guide Utilisateur
CONCEPT est la table de référence pour tous les codes utilisés dans le CDM. Les concepts standards (standard_concept = 'S') sont ceux vers lesquels toutes les données doivent être mappées. Les concepts non-standards servent de source pour le mapping. Utiliser CONCEPT_RELATIONSHIP pour trouver les mappings.
Conventions ETL
Cette table est fournie par OHDSI et ne doit pas être modifiée. Lors de l'ETL, mapper les codes sources vers les concept_id standards. Toujours vérifier que le concept est valide (valid_end_date dans le futur, invalid_reason NULL) avant de l'utiliser.
VOCABULARY
Description de la table
La table VOCABULARY liste tous les vocabulaires médicaux disponibles dans le CDM OMOP. Elle contient les métadonnées des terminologies comme SNOMED CT, ICD-10, LOINC, RxNorm, et les vocabulaires personnalisés.
VOCABULARY permet de connaître les terminologies disponibles et leurs versions. Les vocabulaires les plus utilisés sont : SNOMED (conditions, procédures), RxNorm/RxNorm Extension (médicaments), LOINC (mesures de laboratoire), ICD10CM/ICD10 (classifications diagnostiques).
Conventions ETL
Cette table est fournie par OHDSI via Athena. La version du vocabulaire est importante pour la reproductibilité des analyses. Les vocabulaires personnalisés peuvent être ajoutés avec un vocabulary_id commençant par un numéro élevé (>2000000000).
DOMAIN
Description de la table
La table DOMAIN définit les domaines sémantiques du CDM OMOP. Chaque domaine correspond à une catégorie de données cliniques et détermine dans quelle table les concepts doivent être stockés.
Champ CDM
Guide Utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
domain_id
Identifiant unique du domaine.
Code du domaine (ex: Condition, Drug, Measurement).
Les principaux domaines sont : Condition (diagnostics), Drug (médicaments), Procedure (actes), Measurement (mesures/analyses), Observation (observations), Device (dispositifs), Specimen (prélèvements). Le domaine d'un concept détermine la table de destination lors de l'ETL.
Conventions ETL
Cette table est fournie par OHDSI. Lors de l'ETL, vérifier le domain_id du concept pour savoir dans quelle table insérer l'enregistrement. Un même code source peut mapper vers des concepts de domaines différents selon le contexte.
CONCEPT_CLASS
Description de la table
La table CONCEPT_CLASS définit les classes de concepts au sein des vocabulaires. Elle permet de catégoriser les concepts selon leur niveau de granularité ou leur type au sein d'un vocabulaire donné.
Champ CDM
Guide Utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
concept_class_id
Identifiant de la classe.
Code de la classe (ex: Clinical Finding, Ingredient).
Les classes varient selon le vocabulaire. Pour SNOMED : Clinical Finding, Procedure, etc. Pour RxNorm : Ingredient, Clinical Drug, Branded Drug, etc. Pour LOINC : Lab Test, Clinical Observation, etc. La classe aide à filtrer les concepts lors des recherches.
Conventions ETL
Table fournie par OHDSI. Utile pour comprendre la hiérarchie des concepts dans un vocabulaire. Par exemple, dans RxNorm, les Ingredients sont les principes actifs, les Clinical Drugs combinent ingrédient + dosage + forme.
CONCEPT_SYNONYM
Description de la table
La table CONCEPT_SYNONYM stocke les noms alternatifs et synonymes pour les concepts. Elle permet de rechercher des concepts en utilisant différentes dénominations dans plusieurs langues.
CONCEPT_SYNONYM est utile pour la recherche de concepts en texte libre. Un concept peut avoir plusieurs synonymes, y compris dans différentes langues. Par exemple, "Myocardial infarction" peut avoir comme synonymes "Heart attack", "MI", "Infarctus du myocarde".
Conventions ETL
Table fournie par OHDSI. Peut être enrichie avec des traductions locales. Le language_concept_id utilise les concepts de langue ISO (ex: 4180186 pour l'anglais, 4182503 pour le français). Utile pour construire des interfaces de recherche multilingues.
CONCEPT_RELATIONSHIP
Description de la table
La table CONCEPT_RELATIONSHIP définit les relations entre concepts. Elle est essentielle pour le mapping des codes sources vers les concepts standards et pour naviguer dans les hiérarchies de vocabulaires.
Relations clés : "Maps to" (mapping vers concept standard), "Is a" (hiérarchie parent-enfant), "Has ingredient" (composition des médicaments). Pour le mapping ETL, rechercher les relations "Maps to" depuis les concepts source vers les concepts standards.
Conventions ETL
Lors du mapping, utiliser la requête : SELECT concept_id_2 FROM concept_relationship WHERE concept_id_1 = [source_concept_id] AND relationship_id = 'Maps to' AND invalid_reason IS NULL. Les relations sont directionnelles ; la relation inverse existe souvent avec un relationship_id inverse.
RELATIONSHIP
Description de la table
La table RELATIONSHIP liste tous les types de relations possibles entre concepts. Chaque type de relation a une relation inverse correspondante, permettant la navigation bidirectionnelle dans le graphe de concepts.
Relations principales : "Maps to" / "Mapped from" (mapping), "Is a" / "Subsumes" (hiérarchie), "Has ingredient" / "Ingredient of" (composition). Les relations hiérarchiques (is_hierarchical = 1) sont utilisées pour naviguer dans les arbres de concepts.
Conventions ETL
Table fournie par OHDSI. Les relations avec defines_ancestry = 1 sont utilisées pour calculer la table CONCEPT_ANCESTOR. Toujours utiliser la relation appropriée selon le sens de navigation souhaité.
CONCEPT_ANCESTOR
Description de la table
La table CONCEPT_ANCESTOR contient la fermeture transitive des hiérarchies de concepts. Elle permet de trouver rapidement tous les ancêtres ou descendants d'un concept sans parcourir récursivement les relations.
Nombre minimum de niveaux entre ancêtre et descendant.
INTEGER
Oui
max_levels_of_separation
Distance maximale.
Nombre maximum de niveaux entre ancêtre et descendant.
INTEGER
Oui
Guide Utilisateur
CONCEPT_ANCESTOR est essentiel pour les requêtes inclusives. Par exemple, pour trouver tous les patients avec un "diabète", la requête inclut automatiquement "diabète de type 1", "diabète de type 2", etc. Chaque concept est aussi son propre ancêtre (min_levels = 0).
Conventions ETL
Table calculée par OHDSI à partir des relations hiérarchiques. Exemple de requête pour trouver tous les descendants : SELECT descendant_concept_id FROM concept_ancestor WHERE ancestor_concept_id = [parent_id]. Utiliser min_levels_of_separation = 0 pour inclure le concept lui-même.
SOURCE_TO_CONCEPT_MAP
Description de la table
La table SOURCE_TO_CONCEPT_MAP permet de stocker les mappings personnalisés entre les codes sources locaux et les concepts OMOP standards. Elle est utilisée lors de l'ETL pour convertir les terminologies locales.
Champ CDM
Guide Utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
source_code
Code source local.
Valeur du code dans le système source.
VARCHAR(50)
Oui
source_concept_id
Concept source (si existant).
Concept OMOP non-standard correspondant au code source.
SOURCE_TO_CONCEPT_MAP est la table de travail pour l'ETL. Elle stocke les correspondances entre vos codes locaux (codes maison, codes établissement) et les concepts standards OMOP. C'est un complément à CONCEPT_RELATIONSHIP pour les vocabulaires non-standards.
Conventions ETL
Créer un vocabulary_id personnalisé pour votre source (ex: "HOPITAL_LOCAL"). Remplir cette table avant l'ETL avec tous les mappings nécessaires. Un même source_code peut mapper vers plusieurs target_concept_id si nécessaire. Documenter les mappings manuels pour la reproductibilité.
DRUG_STRENGTH
Description de la table
La table DRUG_STRENGTH contient les informations de dosage des médicaments. Elle détaille la quantité de principe actif par unité de forme pharmaceutique et permet le calcul des doses quotidiennes.
DRUG_STRENGTH permet de calculer les doses administrées. Pour les formes solides, utiliser amount_value/amount_unit. Pour les liquides, utiliser le ratio numerator/denominator. Un médicament multi-ingrédient a plusieurs lignes, une par ingrédient.
Conventions ETL
Table fournie par OHDSI pour les vocabulaires RxNorm et RxNorm Extension. Utile pour standardiser les calculs de dose et pour les études de pharmacoépidémiologie. La formule DDD (Defined Daily Dose) peut être calculée à partir de ces données.
CONDITION_ERA
Description de la table
La table CONDITION_ERA contient des périodes continues pendant lesquelles un patient avait une condition. Elle agrège les enregistrements CONDITION_OCCURRENCE consécutifs ou proches pour former des épisodes de maladie.
CONDITION_ERA simplifie l'analyse des durées de maladie. Les conditions proches dans le temps (gap <= 30 jours par défaut) sont fusionnées en une seule ère. Utile pour identifier les patients avec une condition chronique ou les récidives.
Conventions ETL
Table dérivée, générée par un script ETL à partir de CONDITION_OCCURRENCE. L'algorithme standard utilise un gap de 30 jours pour fusionner les occurrences consécutives. Le condition_concept_id est standardisé au niveau le plus spécifique disponible.
DRUG_ERA
Description de la table
La table DRUG_ERA représente des périodes d'exposition continue à un principe actif (ingrédient). Elle agrège les DRUG_EXPOSURE pour créer des périodes de traitement cohérentes, en tenant compte des renouvellements d'ordonnance.
Dernier jour d'exposition (incluant la durée de la dernière prescription).
DATE
Oui
drug_exposure_count
Nombre d'expositions agrégées.
Nombre de DRUG_EXPOSURE dans cette ère.
INTEGER
Non
gap_days
Jours de gap cumulés.
Total des jours sans traitement au sein de l'ère.
INTEGER
Non
Guide Utilisateur
DRUG_ERA représente l'exposition au niveau de l'ingrédient actif. Ainsi, des prescriptions d'Amoxicilline 500mg et d'Augmentin (amoxicilline + acide clavulanique) génèrent des ères distinctes pour chaque ingrédient. Utile pour les études de pharmacoépidémiologie.
Conventions ETL
Table dérivée à partir de DRUG_EXPOSURE. L'algorithme utilise un gap de 30 jours par défaut pour fusionner les expositions. Les drug_concept_id sont remontés au niveau ingrédient via les relations RxNorm. Le gap_days mesure la compliance du patient.
DOSE_ERA
Description de la table
La table DOSE_ERA représente des périodes d'exposition à une dose spécifique d'un médicament. Elle permet de suivre les changements de posologie au cours du temps pour un même traitement.
DOSE_ERA capture les changements de posologie. Un patient sous metformine passant de 500mg/jour à 1000mg/jour aura deux ères de dose distinctes. Utile pour les études de titration et d'efficacité dose-dépendante.
Conventions ETL
Table dérivée à partir de DRUG_EXPOSURE et DRUG_STRENGTH. La dose_value représente la dose quotidienne standardisée. Une nouvelle ère est créée à chaque changement de posologie. Moins fréquemment implémentée que DRUG_ERA.
COHORT
Description de la table
La table COHORT stocke les résultats des définitions de cohortes. Une cohorte est un ensemble de patients partageant des critères communs (exposition, condition, etc.) pendant une période définie.
COHORT est une table de résultats utilisée par les outils OHDSI comme ATLAS pour stocker les populations d'étude. Un patient peut appartenir à plusieurs cohortes et peut avoir plusieurs périodes dans une même cohorte (entrées/sorties multiples).
Conventions ETL
Table générée par les outils d'analyse, pas par l'ETL initial. Les cohortes sont définies via COHORT_DEFINITION et instanciées dans cette table. Le subject_id est généralement le person_id mais peut représenter d'autres entités selon le cas d'usage.
COHORT_DEFINITION
Description de la table
La table COHORT_DEFINITION stocke les définitions formelles des cohortes. Elle contient les métadonnées et la logique utilisée pour identifier les patients appartenant à chaque cohorte.
Champ CDM
Guide Utilisateur
Conventions ETL
Type
Requis
PK
FK
Table FK
Domaine FK
cohort_definition_id
Identifiant unique de la définition.
Clé primaire de la définition de cohorte.
INTEGER
Oui
PK
cohort_definition_name
Nom de la cohorte.
Nom descriptif de la population étudiée.
VARCHAR(255)
Oui
cohort_definition_description
Description de la cohorte.
Explication détaillée des critères d'inclusion/exclusion.
COHORT_DEFINITION décrit formellement comment une cohorte est construite. Les définitions peuvent être créées via ATLAS (interface graphique) et exportées en JSON, ou écrites directement en SQL. La reproductibilité des études repose sur ces définitions.
Conventions ETL
Table générée par les outils d'analyse. Le cohort_definition_syntax contient généralement du JSON ATLAS ou du SQL OHDSI. Documenter précisément les critères d'inclusion/exclusion dans cohort_definition_description pour la transparence scientifique.
CDM_SOURCE
Description de la table
La table CDM_SOURCE contient les métadonnées sur la source des données et l'instance CDM. Elle documente l'origine des données, la version du CDM utilisée, et les dates de couverture des données.
CDM_SOURCE est essentielle pour la traçabilité et la reproductibilité. Elle permet de savoir quelles données sont présentes, d'où elles viennent, et avec quelle version des outils elles ont été traitées. Cette table ne contient généralement qu'une seule ligne.
Conventions ETL
Remplir cette table à chaque nouveau chargement de données. Documenter la version des vocabulaires OHDSI (Athena) utilisée. Le cdm_etl_reference devrait pointer vers le code ETL ou sa documentation pour la reproductibilité.
METADATA
Description de la table
La table METADATA stocke des métadonnées structurées sous forme clé-valeur. Elle permet de documenter des informations supplémentaires sur les données CDM qui ne sont pas capturées dans CDM_SOURCE.
METADATA offre une flexibilité pour stocker des informations additionnelles non prévues par le schéma CDM standard. Par exemple : paramètres de configuration de l'ETL, statistiques sur les données, informations de qualité, ou métadonnées spécifiques au site.
Conventions ETL
Utiliser des concepts standards pour metadata_concept_id quand ils existent. Pour les métadonnées personnalisées, créer des concepts locaux. Cette table peut être utilisée pour stocker des informations d'audit, de traçabilité ou de configuration.
4 - MIMIC
Description de la base
La base de données MIMIC, pour Medical Information Mart for Intensive Care, est une base de données nord-américaine contenant des données de plus de 50 000 patients admis en réanimation. Il s’agit de l’une des bases de données de réanimation les plus utilisées, du fait de son accès gratuit.
Malgré des données d’une qualité imparfaite, elle constitue un bon socle pour apprendre à manipuler les données issues d’entrepôts de données de santé (EDS).
Elle existe en plusieurs versions, dont la plus récente est la MIMIC-IV.
Données test (publiques)
La base de données MIMIC comporte pour les versions III et IV des bases tests, qui contiennent les données anonymisées de 100 patients et qui sont accessibles publiquement.
Vous devez donc commencer par vous inscrire sur le site physionet.org.
Vous devrez faire une demande d’accès à Physionet, en renseignant quelques informations et en donnant les coordonnées d’un superviseur ou d’un collègue, à qui un mail sera envoyé.
Vous devrez ensuite compléter le CITI Course, il s’agit d’une formation nécessaire afin d’accéder aux données hébergées sur le site Physionet. Les différentes étapes sont détaillées ici.
Vous pourrez ensuite télécharger le certificat une fois le CITI Course terminé, vous pourrez le le déposer ici pour validation par l’équipe de Physionet.