Blog-Logo auf schwarzem Grund mit dem Schriftzug "Discover What's Next in Tech!"

Die Integration von JSON in Relationale Datenbanken

In der modernen Datenbankentwicklung gewinnen flexible Datenformate wie JSON zunehmend an Bedeutung, auch in Kombination mit relationalen Datenbanken. Der Beitrag erklärt die Integration von JSON, den Unterschied zu JSONB und zeigt praxisnahe Beispiele für die vielseitige Nutzung des Formats.

JSON in Relationale Datenbanken

Seit einigen Jahren bieten die meisten relationalen Datenbanken Funktionen zur direkten Speicherung und Verarbeitung von JSON-Daten an. PostgreSQL, eine der führenden Datenbankplattformen, führte mit Version 9.2 den Datentyp json ein, um JSON-Daten in einer relationalen Umgebung zu unterstützen und so eine Brücke zwischen strukturierten und unstrukturierten Daten zu schlagen.

Vorteile der JSON-Integration

Die Kombination von relationalen Datenbanken und JSON ermöglicht es, sowohl strukturierte als auch semi- oder unstrukturierte Daten in einem System zu speichern. Dies erhöht die Flexibilität und vereinfacht die Speicherung komplexer Datenstrukturen. Besonders vorteilhaft ist dies für Daten mit variierenden Attributen, wie sie häufig im IoT-Bereich auftreten. IoT-Geräte senden Daten mit unterschiedlichen Strukturen und Attributen, die sich je nach Gerät oder Plattform ändern können. JSON ermöglicht die flexible Speicherung solcher heterogenen Daten ohne starre Tabellenschemata. Ein Beispiel hierfür sind Geräte wie Thermostate oder Sensoren, deren Attribute als Strings, Integer-Werte, Booleans oder Arrays vorliegen können – mit JSON können diese direkt und flexibel gespeichert werden.

Durch die Integration von JSON entfällt oft auch die Notwendigkeit komplexer Join-Operationen, was bei der Arbeit mit verschachtelten oder umfangreichen Datenstrukturen die Performance erheblich verbessern kann.

Herausforderungen und Nachteile der JSON-Nutzung

Die Nutzung von JSON in relationalen Datenbanken bringt jedoch auch einige Herausforderungen mit sich. Eine davon ist der Verlust der relationalen Datenintegrität, da JSON-Daten nicht denselben Integritätsregeln unterliegen wie klassische relationale Daten. Dies kann zu Inkonsistenzen führen. Darüber hinaus kann die Komplexität von Abfragen steigen, insbesondere bei der Verwendung von ORM (Object-Relational Mapping)-Frameworks. Zudem kann die JSON-Nutzung in einigen Szenarien den Speicherbedarf erhöhen, da redundante Informationen innerhalb von JSON-Daten mehrfach vorkommen können.


JSON vs. JSONB: Ein Vergleich in PostgreSQL

In PostgreSQL wurde mit Version 9.4 der Datentyp jsonb eingeführt, um einige der Performance-Herausforderungen des ursprünglichen json-Datentyps zu lösen. Der entscheidende Unterschied: Während json die Daten als reinen Text speichert und diese bei jeder Abfrage erneut analysiert werden müssen, speichert jsonb die Daten im binären Format. JSONB-Daten sind dadurch bereits analysiert und strukturiert, was die Abfragegeschwindigkeit verbessert. Zudem können JSONB-Daten indexiert werden, was die Performance komplexer Abfragen weiter erhöht.

Wann JSON und wann JSONB verwenden?

In den meisten Anwendungsfällen ist jsonb zu bevorzugen, da es für regelmäßig abgefragte und indexierte JSON-Daten optimiert ist. Der json-Datentyp eignet sich eher dann, wenn JSON-Daten lediglich gespeichert, jedoch selten oder gar nicht abgefragt werden. Bei weniger komplexen JSON-Strukturen kann der Einsatz von json zudem etwas Speicherplatz sparen.


Praxisbeispiele zur Nutzung von JSONB

Beispiel 1: Einfache Speicherung von IoT-Geräteinformationen

Ein typisches JSON-Dokument für ein IoT-Gerät könnte folgendermaßen aussehen:
{
    "device_id": "thermostat-001",
    "device_type": "smart_thermostat",
    "location": {
        "room": "living_room",
        "floor": 1,
        "building": "home"
    }
}

 

Abfragen in PostgreSQL:

Mit JSONB können spezifische Daten einfach und effizient abgefragt werden. Hier zwei Beispielabfragen in PostgreSQL:

SELECT * FROM devices WHERE device_info->>'device_type' = 'smart_thermostat';
SELECT * FROM devices WHERE device_info->'location'->>'room' = 'living_room';

 

Abfragen mit JPA CriteriaBuilder:

Auch in Java lässt sich der JSONB-Zugriff mit dem CriteriaBuilder realisieren:

Predicate deviceTypePredicate = cb.equal(
    cb.function("jsonb_extract_path_text", String.class, root.get("deviceInfo"), cb.literal("device_type")),
    deviceType
);
Predicate roomPredicate = cb.equal(
    cb.function("jsonb_extract_path_text", String.class, root.get("deviceInfo"), cb.literal("location"), cb.literal("room")),
    room
);
query.where(cb.and(deviceTypePredicate, roomPredicate));

Beispiel 2: Speicherung von Key-Value-Daten im JSON-Format

 

Ein weiteres Beispiel für die Speicherung komplexerer Key-Value-Daten:

[
    {"key": "name", "value": "test-name"},
    {"key": "isOnline", "value": true},
    {"key": "languages", "value": ["english", "german"]}
]

 

Abfragen in PostgreSQL:

SELECT jsonb_element->>'value' 
FROM jsonb_array_elements(jsonb_column) AS jsonb_element 
WHERE jsonb_element ->> 'key' = 'isOnline';

 

Abfragen mit JPA CriteriaBuilder:

Für die Abfrage in Java lässt sich die SQL-Query auch als Funktion erstellen und dann über den CriteriaBuilder verwenden.

CREATE OR REPLACE FUNCTION get_jsonb_attribute_value_function(jsonb_column jsonb, p_name text) 
RETURNS TEXT AS $
BEGIN 
    RETURN ( 
        SELECT jsonb_element->>'value'
        FROM jsonb_array_elements(jsonb_column) AS jsonb_element 
        WHERE jsonb_element ->> 'key' = p_name LIMIT 1
    ); 
END;
$ LANGUAGE plpgsql;
// Verwenden der SQL-Funktion get_jsonb_attribute_value_function mit CriteriaBuilder
Predicate attributePredicate = cb.equal(
    cb.function(
        "get_jsonb_attribute_value_function",
        String.class,
        root.get("deviceAttributes"),
        cb.literal(attributeName)
    ),
    attributeValue
);
query.where(attributePredicate);

Fazit:

Die Integration von JSON und JSONB in relationale Datenbanken bietet Entwicklern und Architekten eine wertvolle Möglichkeit, mit variierenden und unstrukturierten Daten flexibler zu arbeiten. Während JSON und JSONB die Strukturierungsfreiheit erhöhen, bietet JSONB durch bessere Abfrageleistung und Indexierung klare Performance-Vorteile. Ein fundiertes Verständnis der Unterschiede und Einsatzgebiete beider Datentypen ermöglicht es, die Vorteile moderner Datenbanken optimal zu nutzen und eine leistungsstarke, flexible Architektur zu schaffen.


https://www.postgresql.org/docs/9.5/functions-json.html

Paul Seifried

Über MICH

Paul Seifried hat Angewandte Informatik an der HTWG Konstanz studiert. Seit September 2023 arbeitet er als Softwareentwickler bei doubleSlash und bringt umfangreiches Know-how in den Bereichen Software Engineering und Java mit.

Alle Beiträge von Paul Seifried

Mehr erfahren

Weitere Infos auf unserer Website und in unserem Newsletter

Pfeil hoch