---
{
  "title": "Einführung von $materialize: SQL-Schnittstelle für FHIR-Daten",
  "description": "Die neue $materialize-Operation in Aidbox erstellt SQL-Tabellen oder -Views aus FHIR-ViewDefinition-Ressourcen und erleichtert die Abfrage verschachtelter FHIR-Daten. Sie hilft dabei, komplexe JSON-Strukturen in vertraute tabellarische Formate umzuwandeln, die mit Standard-SQL-Tools verwendet werden können.",
  "date": "2025-09-17",
  "author": "Andrew Listopadov",
  "reading-time": "7 minutes",
  "tags": [
    "SQL on FHIR",
    "Aidbox"
  ]
}
---
FHIR-Datenstrukturen sind komplex und verschachtelt, was die Arbeit mit Standard-SQL-Tools und Analyseplattformen erschwert.

Um diesem Problem zu begegnen, führt Aidbox eine neue [SQL on FHIR](/blog/aidbox-becomes-the-first-fhir-server-to-pass-all-sql-on-fhir-tests)-Operation namens `$materialize` ein. Sie erstellt eine SQL-Repräsentation einer `ViewDefinition`-Ressource und wandelt komplexe FHIR-Strukturen in vertraute Tabellenformate um, die nahtlos mit Tools wie DBeaver, Metabase und anderen SQL-basierten Analyseplattformen funktionieren.

Stand September 2025 ist dies noch nicht in der [SQL on FHIR-Spezifikation](https://build.fhir.org/ig/FHIR/sql-on-fhir-v2/) enthalten, aber wir hoffen, dass sie in Zukunft standardisiert wird.

## Was `$materialize` leistet

Im Kern verbindet `$materialize` zwei Welten: die Flexibilität von FHIR und die Vertrautheit von SQL. Es:
- Erstellt eine SQL-Tabelle oder -View aus einer `ViewDefinition`-Ressource.
- Wandelt verschachtelte FHIR-Daten in flache, abfragbare Strukturen um, die SQL-Tools verarbeiten können.
- Bietet eine vertraute Schnittstelle für Analysten und Entwickler, die mit FHIR-Daten arbeiten.

## Warum das wichtig ist

FHIR-Ressourcen weisen komplexe, verschachtelte JSON-Strukturen auf, die sich nur schwer direkt mit SQL abfragen lassen.

Bisher war dafür Folgendes erforderlich:
- Schreiben komplexer JSON-Path-Abfragen
- Detailliertes Verständnis von FHIR-Ressourcenstrukturen
- Eigener Code zum Abflachen und Transformieren von Daten

`$materialize` löst dieses Problem, indem Sie die Datentransformation einmalig als `ViewDefinition` definieren und anschließend eine einfache SQL-Schnittstelle erstellt wird, die jeder Analyst mit vertrauten Tools nutzen kann.

Vorteile auf einen Blick:
- **Einfache SQL-Abfragen** statt komplexer JSON-Operationen
- **Kompatibel mit jedem SQL-Tool** (DBeaver, Metabase, Tableau usw.)
- **Wiederverwendbare Definitionen** — einmal definieren, überall abfragen
- **Standardisierter FHIR-Ansatz** mit `ViewDefinition`-Ressourcen
- **Leistungsvorteile** — komplexe JSON-Abfragen bei jeder Anfrage vermeiden

## Materialisierungstypen

$materialize unterstützt drei Typen der Materialisierung und bietet Ihnen je nach Anwendungsfall die passende Flexibilität:

- `view` (Standard) — erstellt eine Datenbankview, die Daten dynamisch transformiert

  - **Immer aktuell** mit den neuesten FHIR-Daten

  - **Kein zusätzlicher Speicher** erforderlich

  - **Ideal für die meisten Anwendungsfälle**, die eine SQL-Schnittstelle benötigen

- `table` — erstellt eine persistente Tabelle mit einer Momentaufnahme der Daten

  - **Schnellste Lesezugriffe** für große Datensätze und komplexe Abfragen

  - **Erfordert manuelle Aktualisierung**, um Daten auf dem neuesten Stand zu halten

  - **Belegt Speicher**, eliminiert aber die Verarbeitungszeit bei Abfragen

- `materialized-view` — erstellt eine materialisierte View, die aktualisiert werden kann

  - **Ausgewogener Ansatz** zwischen Leistung und Aktualität

  - **Kann bei Bedarf oder zeitgesteuert aktualisiert** werden

  - **Unterstützt Indizes** für optimierte Abfrageleistung

## Funktionsweise
- Erstellen Sie eine `ViewDefinition`-Ressource, die FHIR-Daten auf einfache Spalten abbildet.
- Senden Sie einen POST an /`fhir/ViewDefinition/$materialize`.
- Der Server erstellt eine SQL-View/-Tabelle mit den abgeflachten Daten.
- Die resultierende Repräsentation ist in der Datenbank verfügbar.
- Alternativ können Sie sie mit einem beliebigen SQL-Tool oder dem `/$sql`-Endpunkt von Aidbox abfragen.

## Beispielanfrage

So sieht es in der Praxis aus.


```javascript
POST /fhir/ViewDefinition/$materialize
Content-Type: application/json

{
  "resourceType": "Parameters",
  "parameter": [{
    "name": "type",
    "valueCode": "view"
  }, {
    "name": "viewResource",
    "resource": {
      "name": "patient_view",
      "status": "draft",
      "resource": "Patient",
      "description": "Patient flat view",
      "id": "a099e84c-b3c2-4b6e-8115-a580d25f6495",
      "resourceType": "ViewDefinition",
      "select": [{
        "column": [{
          "name": "id",
          "path": "id",
          "type": "id"
        }, {
          "name": "birth_date",
          "path": "birthDate",
          "type": "date"
        }, {
          "name": "family_name",
          "path": "name.family",
          "type": "string"
        }]
      }]
    }
  }]
}
```


Die Antwort enthält Informationen über die erstellte View:


```javascript
{
  "resourceType": "Parameters",
  "parameter": [{
    "name": "viewName",
    "valueString": "sof.patient_view"
  }, {
    "name": "viewType",
    "valueString": "view"
  }, {
    "name": "viewSchema",
    "valueString": "sof"
  }]
}
```


Jetzt können Sie die abgeflachten Daten mit einfachem SQL abfragen:


```javascript
SELECT * FROM sof.patient_view WHERE birth_date > '1990-01-01';
```


Beispiel: Patienten-IDs und demografische Daten

| id | birth_date | family_name |
| --- | --- | --- |
| d3c79580-592d-491b-acdf-db335896a886 | 1991-02-21 | Smith |
| 4a37e330-1bf9-48f6-9891-52a39e3a0579 | 1990-08-02 | Johnson |
| 4ae699f4-8efa-4879-84ef-e5301397f3ae | 1998-11-11 | Williams |

## Praktische Einsatzmöglichkeiten

Da `$materialize` Standard-SQL ausgibt, eröffnet es ein breites Spektrum an Möglichkeiten:
- **Analysen und Berichte** — FHIR-Daten mit BI-Tools wie Metabase oder Tableau verbinden
- **Datenerkundung** — FHIR-Daten mit SQL-Tools wie DBeaver erkunden
- **ETL-Pipelines** — abgeflachte Daten für nachgelagerte Systeme extrahieren
- **Eigene Anwendungen** — Apps entwickeln, die tabellarische Views von FHIR-Daten benötigen
- **Forschung und Analyse** — Forschenden ermöglichen, FHIR-Daten mit Standard-SQL abzufragen

## Leistungsüberlegungen

Obwohl der primäre Nutzen von `$materialize` in der Vereinfachung des Datenzugriffs liegt, spielt die Leistung bei bestimmten Anwendungsfällen eine wichtige Rolle:
- **Häufig wiederholte Abfragen:** Wenn Sie dieselben komplexen Abfragen wiederholt ausführen (Dashboards, Berichte), können die Typen `materialized-view` oder `table` die Antwortzeiten erheblich reduzieren.
- **Große Datensätze:** Bei der Arbeit mit Millionen von FHIR-Ressourcen vermeidet materialisierter Speicher die erneute Verarbeitung von JSON-Strukturen bei jeder Abfrage.
- **Komplexe Transformationen:** `[ViewDefinitions](/blog/what-is-a-viewdefinition)` mit mehreren Joins und Aggregationen profitieren von einer Vorberechnung.
- **Analytische Workloads:** BI-Tools, die umfangreiche Scans über große Datensätze durchführen, erzielen mit materialisiertem Speicher deutliche Leistungsverbesserungen.

Für die meisten explorativen Arbeiten und moderate Abfragevolumina bietet der Standard-Typ `view` die beste Balance aus Einfachheit und Leistung.

## Abschließende Hinweise

Der Standard-Typ `view` eignet sich hervorragend für die meisten Szenarien, in denen Sie eine SQL-Schnittstelle zu FHIR-Daten benötigen — stets aktuell und ohne zusätzlichen Wartungsaufwand.

Ziehen Sie die Typen `table` oder `materialized-view` in Betracht, wenn Sie häufig wiederholte Abfragen oder große Datensätze verarbeiten, die von vorberechneten Ergebnissen profitieren würden.

`$materialize` wandelt komplexe FHIR-Strukturen in einfache SQL-Schnittstellen um, macht FHIR-Daten für alle zugänglich, die SQL beherrschen, und ermöglicht den Einsatz standardisierter Analyse-Tools im gesamten Ökosystem der Gesundheitsdaten.

Weitere Informationen zur Funktionsweise von `$materialize` und seinen Parametern finden Sie in der [Aidbox-Dokumentation](https://www.health-samurai.io/docs/aidbox/modules/sql-on-fhir/operation-materialize).