Des données de santé qui fonctionnent
Des données de haute qualité constituent l'épine dorsale d'un système de santé numérique efficace—mais saisir ces données et en tirer du sens est loin d'être simple. De nombreuses organisations de santé peinent encore avec des dossiers fragmentés, des saisies de patients incohérentes et des flux de travail manuels chronophages qui nuisent à la prise de décision et ralentissent la prestation des soins. C'est là qu'interviennent Aidbox Forms et SQL on FHIR. Ces outils puissants transforment la façon dont les équipes soignantes collectent et utilisent les données.
Aidbox Forms permet la création de formulaires numériques structurés qui utilisent les codes SNOMED CT ou LOINC pour standardiser la saisie, automatiser des calculs tels que l'IMC, et garantir la qualité et l'interopérabilité des données—en éliminant les erreurs fréquentes avec la saisie sur papier. Une fois les données collectées, SQL on FHIR transforme les ressources FHIR complexes en tables interrogeables, ce qui permet aux équipes soignantes d'analyser et de visualiser les données sans avoir à naviguer dans des structures imbriquées. Ensemble, ces outils rationalisent les flux de travail, réduisent la charge de travail manuelle et libèrent les équipes soignantes pour qu'elles puissent se concentrer sur ce qui compte le plus—prodiguer de meilleurs soins.
Dans cet article, nous vous guiderons à travers l'ensemble du processus à l'aide d'un exemple concret : un formulaire d'évaluation des risques conçu pour collecter des mesures liées au mode de vie, comme le statut tabagique, la consommation d'alcool, l'activité physique et les habitudes alimentaires. Le formulaire complet est disponible dans la Galerie de formulaires Aidbox. Par souci de simplicité, nous nous concentrerons sur une partie de ce formulaire, portant sur le statut tabagique et l'IMC.

1. Collecte de données avec FHIR SDC
Avant qu'une analyse significative puisse avoir lieu, les données doivent être collectées de manière structurée et cohérente—et c'est là qu'intervient le FHIR Structured Data Capture (SDC). Dans FHIR, les formulaires sont construits comme des ressources Questionnaire, et les formulaires remplis sont enregistrés comme des ressources QuestionnaireResponse. Autrement dit, les données sont structurées et standardisées de manière à faciliter leur partage, leur compréhension et leur réutilisation entre différents systèmes de santé—un facteur essentiel pour les soins coordonnés et l'analytique à l'échelle du système. FHIR SDC apporte également des fonctionnalités puissantes, notamment :
- Des champs pré-remplis automatiquement à partir des données existantes du patient pour réduire les saisies redondantes
- Des calculs automatisés, tels que l'IMC à partir de la taille et du poids, ou l'âge à partir de la date de naissance
- Des contrôles et une logique avancés pour guider les utilisateurs à travers des formulaires complexes de manière intuitive.
Voyons cela en action en créant un formulaire numérique avec le Aidbox Form Builder. Notre exemple portera sur la saisie de quelques mesures clés liées au mode de vie : le statut tabagique, la taille et le poids, avec l'IMC calculé automatiquement. Voici à quoi ressemblera la ressource Questionnaire :
{
"resourceType": "Questionnaire",
"id": "health-metrics",
"title": "Health Metrics",
"status": "active",
"item": [
{
"linkId": "smoking-status",
"text": "What is your smoking status?",
"type": "choice",
"answerOption": [
{"valueCoding": {"code": "266919005", "display": "Never smoked", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "449868002", "display": "Current smoker", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "8517006", "display": "Former smoker", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "266927001", "display": "Passive smoker", "system": "http://snomed.info/sct"}}
]
},
{
"linkId": "height",
"text": "What is your height (in cm)?",
"type": "decimal"
},
{
"linkId": "weight",
"text": "What is your weight (in kg)?",
"type": "decimal"
},
{
"linkId": "bmi",
"text": "Body Mass Index (calculated)",
"type": "decimal",
"readOnly": true,
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-calculatedExpression",
"valueExpression": {
"language": "text/fhirpath",
"expression": "weight / ((height / 100) * (height / 100))"
}
}
]
}
]
}
Ce formulaire standardise les principales saisies liées au mode de vie :
- Le statut tabagique est codé avec SNOMED CT, assurant une cohérence sémantique.
- La taille et le poids sont enregistrés en unités métriques.
- L'IMC est calculé à la volée à l'aide d'une expression FHIRPath, ce qui améliore l'efficacité et réduit les erreurs manuelles.
En tirant parti de FHIR SDC et d'outils comme le Aidbox Form Builder, les équipes soignantes peuvent collecter des données de haute qualité et interopérables.
2. Structurer les données pour l'analyse
La collecte de données n'est que la première étape—la véritable valeur vient lorsque ces données sont structurées pour l'analyse et la réutilisation. Dans FHIR, les formulaires remplis sont stockés comme des ressources QuestionnaireResponse. Ce format convient bien pour capturer ce qu'un patient a soumis, directement lié aux questions du formulaire. Mais à lui seul, il répond souvent mal aux besoins concrets des soins de santé.
Voici pourquoi.
Une QuestionnaireResponse stocke des données brutes étroitement couplées à la structure du formulaire d'origine. Par exemple, elle peut capturer qu'un patient est un « fumeur actuel » ou qu'il a un IMC calculé—mais pour récupérer cette information ultérieurement, les systèmes doivent comprendre la disposition spécifique du formulaire. Cela rend l'interrogation de données entre patients ou le partage de données avec d'autres systèmes beaucoup plus difficile. De plus, la QuestionnaireResponse n'est pas conçue pour prendre en charge les flux de travail cliniques tels que la visualisation des tendances dans le temps, le remplissage des dossiers patients ou le déclenchement d'aide à la décision clinique.
Pour résoudre ce problème, les réponses clés peuvent être extraites et converties en ressources FHIR structurées, comme des Observations. C'est là qu'Aidbox Forms apporte une valeur ajoutée considérable.
Lorsque vous activez l'extraction, Aidbox Forms transforme les réponses sélectionnées en Observations autonomes et réutilisables.
Par exemple :
- Un statut tabagique « fumeur actuel » devient une Observation codée avec LOINC 72166-2 (statut tabagique) et SNOMED CT pour la valeur de la réponse.
- L'IMC calculé est extrait en utilisant LOINC 39156-5, et la taille et le poids peuvent être traités de façon similaire avec des codes standards.
Cette séparation offre des avantages clés :
- Interopérabilité : Les Observations s'alignent sur des profils FHIR largement utilisés comme US Core, de sorte que d'autres systèmes peuvent les interpréter sans avoir besoin du formulaire d'origine.
- Flexibilité : Les Observations discrètes peuvent être interrogées indépendamment—par exemple, pour trouver tous les patients avec un IMC supérieur à 30—sans avoir à parcourir les structures QuestionnaireResponse.
- Utilisation contextuelle : Les Observations peuvent être liées à des patients, des rencontres ou des horodatages, ce qui favorise le suivi longitudinal ou la prise de décision clinique.
- Sources multiples : Les données peuvent provenir de différentes sources—questionnaires, appareils portables ou dossiers médicaux électroniques. L'extraction vers des Observations les standardise dans un format commun, permettant une intégration et une analyse transparentes quelle que soit l'origine.
Avec le Aidbox Form Builder, il est facile de spécifier quelles réponses doivent être extraites. Vous configurez simplement les éléments du formulaire pour inclure l'extension observationExtract. Voici le même questionnaire health-metrics de la section 1, maintenant avec l'extraction configurée pour « smoking-status » et « bmi » :
{
"resourceType": "Questionnaire",
"id": "health-metrics",
"title": "Health Metrics",
"status": "active",
"item": [
{
"linkId": "smoking-status",
"text": "What is your smoking status?",
"type": "choice",
"answerOption": [
{"valueCoding": {"code": "266919005", "display": "Never smoked", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "449868002", "display": "Current smoker", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "8517006", "display": "Former smoker", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "266927001", "display": "Passive smoker", "system": "http://snomed.info/sct"}}
],
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/sdc-questionnaire-observationExtract",
"valueBoolean": true
},
{
"url": "http://hl7.org/fhir/StructureDefinition/sdc-questionnaire-observationExtract-code",
"valueCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "72166-2", "display": "Tobacco smoking status"}]}
}
]
},
{
"linkId": "height",
"text": "What is your height (in cm)?",
"type": "decimal"
},
{
"linkId": "weight",
"text": "What is your weight (in kg)?",
"type": "decimal"
},
{
"linkId": "bmi",
"text": "Body Mass Index (calculated)",
"type": "decimal",
"readOnly": true,
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-calculatedExpression",
"valueExpression": {
"language": "text/fhirpath",
"expression": "weight / ((height / 100) * (height / 100))"
}
},
{
"url": "http://hl7.org/fhir/StructureDefinition/sdc-questionnaire-observationExtract",
"valueBoolean": true
},
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-observationLinkPeriod",
"valueDuration": {"value": 0, "unit": "days", "system": "http://unitsofmeasure.org"}
},
{
"url": "http://hl7.org/fhir/StructureDefinition/sdc-questionnaire-observationExtract-code",
"valueCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "39156-5", "display": "Body Mass Index"}]}
}
]
}
]
}
Supposons qu'un patient soumette :
- Statut tabagique : « Fumeur actuel »
- Taille : 170 cm
- Poids : 70 kg
- IMC : (calculé à 24,22)
La QuestionnaireResponse résultante ressemblerait à ceci (simplifiée) :
{
"resourceType": "QuestionnaireResponse",
"questionnaire": "Questionnaire/health-metrics",
"status": "completed",
"subject": {"reference": "Patient/123"},
"item": [
{
"linkId": "smoking-status",
"answer": [{"valueCoding": {"code": "449868002", "display": "Current smoker", "system": "http://snomed.info/sct"}}]
},
{"linkId": "height", "answer": [{"valueDecimal": 170}]},
{"linkId": "weight", "answer": [{"valueDecimal": 70}]},
{"linkId": "bmi", "answer": [{"valueDecimal": 24.22}]}
]
}
Grâce à l'extension observationExtract, Aidbox Forms génèrera automatiquement ces ressources Observation pour les éléments marqués :
Observation du statut tabagique :
{
"resourceType": "Observation",
"status": "final",
"code": {"coding": [{"system": "http://loinc.org", "code": "72166-2", "display": "Tobacco smoking status"}]},
"subject": {"reference": "Patient/123"},
"valueCodeableConcept": {"coding": [{"system": "http://snomed.info/sct", "code": "449868002", "display": "Current smoker"}]}
}
Observation de l'IMC :
{
"resourceType": "Observation",
"status": "final",
"code": {"coding": [{"system": "http://loinc.org", "code": "39156-5", "display": "Body Mass Index"}]},
"subject": {"reference": "Patient/123"},
"valueQuantity": {"value": 24.22, "unit": "kg/m2", "system": "http://unitsofmeasure.org"}
}
Aidbox Forms automatise cette extraction en mappant les réponses vers un format facile à interroger, de sorte que les équipes soignantes n'ont pas à perdre de temps sur la préparation manuelle des données. La taille et le poids demeurent dans la QuestionnaireResponse ici, car ils n'ont pas été configurés pour l'extraction—mais cela peut être facilement modifié en ajoutant les mêmes extensions, ce qui les rend faciles à récupérer et à partager entre les systèmes.
3. Création de définitions de vues pour l'analyse avec SQL on FHIR
L'analyse des données de santé devrait être intuitive. SQL on FHIR vous permet d'interroger des ressources FHIR en utilisant une syntaxe SQL familière—par exemple, pour compter les fumeurs ou suivre les tendances de l'IMC. Mais il y a un défi : les données FHIR, comme les Observations, sont stockées dans un format imbriqué et hiérarchique qui ne convient pas naturellement aux outils SQL standards. C'est là que les ViewDefinitions, une fonctionnalité de la suite d'outils de Health Samurai, deviennent essentielles.
Sans ViewDefinitions, interroger directement des ressources FHIR signifie naviguer dans des structures JSON profondément imbriquées. Une Observation typique comprend des tableaux de codages, des références à d'autres ressources et des types de données intégrés. Par exemple, tenter de trouver toutes les entrées « fumeur actuel » nécessiterait d'analyser chaque champ valueCodeableConcept.coding, ce qui est fastidieux et susceptible d'erreurs si vous vous fiez à du SQL brut. Les ViewDefinitions résolvent ce problème en aplatissant les données FHIR dans une vue tabulaire, la faisant se comporter comme une table de base de données traditionnelle.
Voici pourquoi les ViewDefinitions sont précieuses :
- Simplification : Elles transforment les données FHIR imbriquées en lignes et colonnes, afin que vous puissiez les interroger avec du SQL simple plutôt qu'avec des outils spécifiques à FHIR ou des scripts personnalisés.
- Personnalisation : Vous définissez exactement quels champs—comme l'identifiant du patient ou la valeur de l'IMC—importent pour votre analyse, en filtrant le bruit.
- Efficacité : Les vues prédéfinies font gagner du temps, permettant aux équipes d'exécuter des requêtes cohérentes sans reconstruire une logique complexe à chaque fois.
Par exemple, voici une ViewDefinition pour les observations de statut tabagique :
{
"name": "observation_smoking_view",
"resource": "observation",
"select": [
{
"column": [
{
"name": "observation_id",
"path": "getResourceKey()"
},
{
"name": "code",
"path": "value.ofType(CodeableConcept).coding.first().code"
},
{
"name": "display",
"path": "value.ofType(CodeableConcept).coding.first().display"
},
{
"name": "qr_id",
"path": "derivedFrom.first().getReferenceKey()"
}
]
}
],
"where": [
{
"path": "code.coding.where(code = '365981007').exists()"
}
],
"status": "active",
"id": "observation_smoking_view",
"resourceType": "ViewDefinition"
}
Et en voici une pour les observations de l'IMC :
{
"name": "observation_bmi_view",
"resource": "observation",
"select": [
{
"column": [
{
"name": "observation_id",
"path": "getResourceKey()"
},
{
"name": "bmi",
"path": "value.ofType(Quantity).value",
"type": "decimal"
},
{
"name": "qr_id",
"path": "derivedFrom.first().getReferenceKey()"
}
]
}
],
"where": [
{
"path": "code.coding.where(code = '60621009').exists()"
}
],
"status": "active",
"id": "observation_bmi_view",
"resourceType": "ViewDefinition"
}
Ces vues transforment des structures FHIR complexes en tables propres prêtes pour l'analyse. La SmokingStatusView extrait les identifiants des patients et le statut tabagique (LOINC 72166-2), tandis que la BMIView extrait les valeurs d'IMC (LOINC 39156-5) avec leurs unités. Vous pourriez les interroger ainsi :
Tabagisme :
SELECT * FROM SmokingStatusView
IMC :
SELECT * FROM BMIView
Chaque requête retourne un jeu de données plat et structuré, déjà pratique à utiliser :
Sortie de BMIView :
| gen-obs-bmi-1 | 24.064332204316088 | gen-qr-1 |
|---|---|---|
| gen-obs-bmi-10 | 23.320073211330087 | gen-qr-10 |
| gen-obs-bmi-100 | 30.760773314666764 | gen-qr-100 |
| gen-obs-bmi-1000 | 24.825445454831456 | gen-qr-1000 |
| gen-obs-bmi-10000 | 27.455811393648887 | gen-qr-10000 |
« SELECT * FROM BMIView »
Sortie de SmokingStatusView :
| gen-obs-smoking-1 | 77176002 | Smoker | gen-qr-1 |
|---|---|---|---|
| gen-obs-smoking-10 | 266919005 | Never smoked tobacco | gen-qr-10 |
| gen-obs-smoking-100 | 77176002 | Smoker | gen-qr-100 |
| gen-obs-smoking-1000 | 266919005 | Never smoked tobacco | gen-qr-1000 |
| gen-obs-smoking-10000 | 160617001 | Stopped smoking | gen-qr-10000 |
« SELECT * FROM SmokingStatusView »
4. Visualisation des données avec Metabase et les ViewDefinitions
Donner vie aux données par la visualisation, c'est là que les véritables constats émergent. En intégrant SQL on FHIR avec des outils comme Metabase—un outil de visualisation à code source ouvert—vous pouvez transformer des requêtes brutes en graphiques et tableaux de bord dynamiques, sans recourir à des feuilles de calcul manuelles. Les ViewDefinitions, telles que présentées à la section 3, servent de pont entre les structures FHIR complexes et l'analyse SQL. Elles transforment les données de santé imbriquées en vues tabulaires propres que des outils de visualisation comme Metabase peuvent facilement consommer. Examinons deux exemples pratiques à l'aide des données sur le statut tabagique et l'IMC que nous avons collectées précédemment.
Tendances tabagiques par sexe


Un simple graphique à barres peut montrer comment les habitudes tabagiques diffèrent selon le sexe—par exemple, révélant qu'un pourcentage plus élevé d'hommes se déclarent fumeurs actuels. Ce type de visualisation facilite la détection de tendances à l'échelle de la population et oriente les interventions ciblées.
Tableau de bord de l'état de santé global
Un tableau de bord combinant plusieurs mesures—comme la distribution de l'IMC, le statut tabagique et la consommation d'alcool—peut offrir un aperçu immédiat de la santé de la population. Ces vues aident les cliniciens et les analystes à identifier rapidement les risques et les tendances sans avoir à fouiller dans les données brutes.
Pour que cela fonctionne en pratique :
- Le formulaire d'évaluation des risques doit être configuré pour extraire les données vers des ressources Observation.
- Les ViewDefinitions convertissent ensuite ces données en tables plates interrogeables en SQL.
- Metabase se connecte à l'interface SQL on FHIR et visualise les résultats.
Ce formulaire, doté de champs encodés et d'une extraction de données configurée, est disponible en téléchargement depuis la Galerie de formulaires.
Nous fournissons également un Notebook public dans chaque instance d'Aidbox avec des instructions étape par étape pour créer des ViewDefinitions adaptées à ce formulaire.
Conclusion
Aidbox Forms et SQL on FHIR rationalisent l'ensemble du parcours des données de santé—de la collecte structurée à la visualisation significative. Fondés sur les standards FHIR et conçus pour la facilité d'utilisation, ils aident les organisations de santé à démêler la complexité et à se concentrer sur ce qui importe : de meilleurs soins grâce à de meilleures perspectives. Que vous collectiez des mesures liées au mode de vie, créiez des tableaux de bord ou effectuiez des analyses de santé populationnelle, Aidbox vous offre les outils pour aller vite, rester conforme et prodiguer de meilleurs soins.
Prêt à voir comment cela s'intègre dans votre flux de travail? Explorez Aidbox Forms sur aidbox.app.





