CodeGym /Kurse /SQL SELF /Typische Fehler beim Arbeiten mit JSON-Daten und wie du s...

Typische Fehler beim Arbeiten mit JSON-Daten und wie du sie vermeidest

SQL SELF
Level 34 , Lektion 4
Verfügbar

Mit JSON-Daten in PostgreSQL zu arbeiten ist ein mächtiges Tool, aber wie jedes Tool braucht es etwas Vorsicht. Schon kleine Fehler können deine Query in ein echtes Rätsel verwandeln. Heute schauen wir uns wieder typische Fehler an, die beim Arbeiten mit JSON und JSONB in PostgreSQL passieren – und wie du sie easy vermeiden kannst.

Problem 1: JSON statt JSONB verwenden

Viele Einsteiger nehmen fälschlicherweise den Datentyp JSON, weil sie denken, das wäre die beste Wahl für JSON-Daten. Aber JSON speichert die Daten in PostgreSQL als Text, was die Performance beim Suchen oder Filtern ordentlich runterziehen kann.

Beispiel für einen Fehler:

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    details JSON
);

INSERT INTO products (details) VALUES ('{"name": "Laptop", "price": 1000}');

INSERT INTO products (details) VALUES ('{"name": "Laptop", "price": 1000}');

Wenn du jetzt nach dem Schlüssel (price) filtern willst, läuft das deutlich langsamer als mit JSONB.

So machst du’s besser: Nimm JSONB, wenn du oft filtern oder auf die Daten zugreifen willst.

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    details JSONB
);

Problem 2: Keine Indizes für JSONB

JSONB ist mega mächtig, aber ohne Indizes kann die Performance bei komplexen Queries echt leiden.

Beispiel für einen Fehler: Stell dir vor, du hast eine Tabelle mit der Spalte details, in der viele JSON-Objekte stecken:

SELECT * FROM products WHERE details->>'name' = 'Laptop';

Wenn die Daten nicht indiziert sind, macht der Server einen Full Table Scan und braucht dafür viel mehr Zeit.

So machst du’s besser: Leg einen GIN-Index an, um die Suche nach Schlüsseln zu beschleunigen:

CREATE INDEX idx_details_name ON products USING gin (details jsonb_path_ops);

Problem 3: Fehler beim Auslesen von verschachtelten Daten

Das Auslesen von Daten aus verschachtelten Objekten oder Arrays kann verwirrend sein, vor allem wenn du den Unterschied zwischen -> und ->> nicht kennst.

Beispiel für einen Fehler:

SELECT details->'price' FROM products;

Diese Query gibt dir den Wert als JSON zurück, nicht als String ("1000" statt 1000). Wenn du wirklich den Wert willst, musst du ->> nehmen:

SELECT details->>'price' FROM products;

Problem 4: Falsche Verwendung von Operatoren

Vielleicht bist du schon mal über den Operator @> gestolpert und dachtest: "Klingt cool, den nehm ich immer!" Aber wenn du nicht weißt, wie er funktioniert, bekommst du komische Ergebnisse.

Beispiel für einen Fehler:

SELECT * FROM products WHERE details @> '{"price": 1000}';

Diese Query klappt nur, wenn price eine Zahl im JSON ist. Wenn der Wert als String "1000" gespeichert ist, kommt nix zurück.

So machst du’s besser: Achte auf die Datentypen im JSON:

SELECT * FROM products WHERE details->>'price' = '1000';

Problem 5: Große JSON-Objekte

Wenn du große JSON-Objekte ohne Optimierung speicherst, werden deine Queries langsam. Außerdem muss beim Lesen oder Ändern auch nur eines kleinen Teils im JSONB das ganze Objekt verarbeitet werden.

So machst du’s besser: Wenn bestimmte Schlüssel oft genutzt werden, pack sie in eigene Spalten. Zum Beispiel:

ALTER TABLE products ADD COLUMN price NUMERIC;
UPDATE products SET price = (details->>'price')::NUMERIC;

Jetzt kannst du easy filtern und sortieren, ohne jedes Mal das JSONB zu parsen.

Problem 6: Komplettes Neuaufbauen von Objekten bei Änderungen

Wenn du Funktionen wie jsonb_set() oder jsonb_insert() nutzt, baut PostgreSQL das komplette JSONB-Objekt neu auf – das kann ganz schön auf die Performance gehen.

So machst du’s besser: Halte die Anzahl der Updates am JSONB möglichst gering. Statt ständig ein Objekt zu ändern, pack lieber alle Änderungen in eine Query:

UPDATE products
SET details = jsonb_set(details, '{price}', '1500'::jsonb);

Problem 7: Array-Struktur nicht verstanden

Auch bei Arrays in JSONB musst du aufpassen. Stell dir vor, du hast ein Array:

{
    "tags": ["electronics", "laptop", "sale"]
}

Du willst checken, ob der Tag "laptop" drin ist. Wenn du aus Versehen den Operator @> falsch nutzt, bekommst du kein Ergebnis, weil er ein Array erwartet, keinen String.

Beispiel für einen Fehler:

SELECT * FROM products WHERE details->'tags' @> '"laptop"';

So machst du’s besser: Nimm das richtige Format beim Operator @>:

SELECT * FROM products WHERE details->'tags' @> '["laptop"]';

Tipps, um Fehler zu vermeiden

Damit du beim Arbeiten mit JSONB nicht in die typischen Fallen tappst, hier ein paar Tipps:

Wähl den richtigen Datentyp. Wenn du mit großen Datenmengen arbeitest und oft filterst, nimm immer JSONB statt JSON.

Indexiere deine Daten. Wenn Queries oft auf bestimmte Schlüssel gehen, leg einen passenden Index an (zum Beispiel GIN).

Check deine Daten vorm Einfügen. Nutze Validierungsfunktionen, um die Struktur zu prüfen:

DO $$
BEGIN
    IF jsonb_typeof('{"price": 1000}'::jsonb->'price') IS DISTINCT FROM 'number' THEN
        RAISE EXCEPTION 'Preis muss eine Zahl sein';
    END IF;
END $$;

Optimiere deine Datenstruktur. Wenn bestimmte Schlüssel öfter gebraucht werden, hol sie in eigene Spalten.

Lern die Operatoren und Funktionen. Lies dir die offizielle PostgreSQL-Doku genau durch, damit du die Unterschiede zwischen ->, ->>, @>, ?| und anderen Funktionen checkst.

JSON und JSONB können deine besten Freunde sein, wenn du mit flexiblen und komplexen Daten arbeitest. Wichtig ist, dass du die Tools mit Bedacht einsetzt und typische Fehler vermeidest – dann läuft dein Code schnell und bleibt easy zu pflegen.

1
Umfrage/Quiz
Daten in JSON-Objekten aktualisieren, Level 34, Lektion 4
Nicht verfügbar
Daten in JSON-Objekten aktualisieren
Daten in JSON-Objekten aktualisieren
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION