CodeGym /Kurse /SQL SELF /Vergleich von JSON mit anderen Typen: ARRAY...

Vergleich von JSON mit anderen Typen: ARRAY, TEXT, HSTORE

SQL SELF
Level 34, Lektion 3
Verfügbar

In PostgreSQL stehen viele Entwickler:innen vor der Frage: Welche Datenstruktur soll ich zum Speichern von Infos nehmen? Arrays (ARRAY) für einfachere Strukturen? Oder Textfelder (TEXT) für Strings? Vielleicht HSTORE für Key-Value-Paare? Und natürlich: Wann ist JSON oder JSONB die bessere Wahl?

Damit du da besser durchblickst, reden wir über die Vor- und Nachteile jeder Methode und zeigen dir Beispiele, wie du sie nutzen kannst.

Wann Arrays (ARRAY) und wann JSONB?

Arrays (ARRAY) sind super für Daten, die einfach aus gleichartigen Werten bestehen. Zum Beispiel, wenn du eine Liste von Noten für Studierende oder Tags für einen Eintrag hast, sind Arrays perfekt.

Beispiel für ein Array:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT,
    grades INTEGER[] -- Noten-Array
);

INSERT INTO students (name, grades)
VALUES ('Alice', ARRAY[90, 85, 88]),
       ('Bob', ARRAY[70, 75, 78]);

Auf der anderen Seite ist JSONB für komplexere, verschachtelte Strukturen gedacht. Wenn du zu jedem Eintrag noch zusätzliche Infos speichern willst, z.B. eine Beschreibung zu jeder Note, dann ist JSONB die richtige Wahl.

Beispiel für JSONB:

CREATE TABLE students_json (
    id SERIAL PRIMARY KEY,
    name TEXT,
    grades JSONB -- Objekt mit Noteninfos
);

INSERT INTO students_json (name, grades)
VALUES ('Alice', '{"Mathe": 90, "Naturwissenschaften": 85, "Englisch": 88}'),
       ('Bob', '{"Mathe": 70, "Naturwissenschaften": 75, "Englisch": 78}');

Wichtigste Unterschiede

Kriterium Arrays (ARRAY) JSONB
Struktur Homogene Daten eines Typs Komplexe, verschachtelte Datenstrukturen
Datenzugriff Per Index: grades[1] Per Key: grades->'Mathe'
Index-Unterstützung Nur GIN oder BTREE für das ganze Array Bequeme GIN und BTREE Indizes auf Keys
Wann verwenden Einfache Listen (Tags, Noten, IDs) Komplexe Objekte mit Keys und Werten

Beispiele für Umwandlung zwischen Array und JSONB

Schauen wir uns an, wie man Daten zwischen Arrays und JSONB umwandeln kann:

Array → JSONB

SELECT to_jsonb(grades) AS grades_jsonb
FROM students;

-- Ergebnis:
-- [{"90","85","88"}]

JSONB → Array

SELECT array_agg(value::INTEGER) AS grades_array
FROM jsonb_array_elements_text('["90", "85", "88"]');
-- Ergebnis:
-- {90,85,88}

Vergleich von JSONB und Textdaten (TEXT)

Textfelder sind ideal, wenn du einfach nur Strings oder kleine unstrukturierte Daten speichern willst. Wenn du z.B. nach einem Produktnamen oder einer Beschreibung suchen willst, ist TEXT die richtige Wahl.

CREATE TABLE books (
    id SERIAL PRIMARY KEY,
    title TEXT,
    description TEXT
);

INSERT INTO books (title, description)
VALUES ('SQL Grundlagen', 'Eine kurze Einführung in SQL'),
       ('Fortgeschrittenes PostgreSQL', 'Ein ausführlicher Guide zur PostgreSQL Performance');

Wann ist JSONB besser?

Wenn dein String zu einer Info mit verschachtelter Struktur wird (z.B. Beschreibung mit Kategorie und Tag-Liste), dann nimm lieber JSONB.

CREATE TABLE books_json (
    id SERIAL PRIMARY KEY,
    info JSONB
);

INSERT INTO books_json (info)
VALUES ('{"title": "SQL Grundlagen", "tags": ["anfänger", "datenbank"]}'),
       ('{"title": "Fortgeschrittenes PostgreSQL", "tags": ["performance", "optimierung"]}');

Wichtigste Unterschiede

Kriterium Text (TEXT) JSONB
Struktur Unstrukturierte Daten Strukturierte, verschachtelte Daten
Suche Volltextsuche Suche nach Keys, Werten, verschachtelter Struktur
Daten ändern Nur kompletter Austausch Einzelne Keys ändern
Wann verwenden Einfache Textstrings Komplexe Key-Value-Daten

Vergleich von JSONB und HSTORE

HSTORE ist quasi der große Bruder von JSONB, mit dem du Key-Value-Paare speichern kannst. Wenn deine Datenstruktur einfach ist (keine Verschachtelung, keine Arrays), ist HSTORE leichter und schneller.

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    attributes HSTORE
);

INSERT INTO products (attributes)
VALUES ('"farbe"=>"rot", "größe"=>"M"'),
       ('"farbe"=>"blau", "größe"=>"L"');

Warum hat JSONB HSTORE abgelöst?

Auch wenn HSTORE für Key-Value-Paare praktisch ist, unterstützt es keine Verschachtelung oder Arrays, was JSONB viel flexibler macht. Wenn du aus einfachen Objekten rauswächst, ist JSONB der logische nächste Schritt.

Wichtigste Unterschiede

Kriterium HSTORE JSONB
Struktur Key-Value-Paare, keine Verschachtelung Vollwertige verschachtelte Strukturen
Array-Unterstützung Nein Ja
Suche Nur nach Key Nach Keys, Werten, verschachtelter Struktur
Wann verwenden Einfache Key-Value-Paare Komplexe Datenstrukturen

Wie wählst du den passenden Datentyp?

Wenn du:

  • Einfache Struktur – Listen oder homogene Daten, nimm Arrays (ARRAY).
  • Einfache Strings oder Beschreibungen, nimm Textfelder (TEXT).
  • Key-Value-Paare ohne Verschachtelung, wähle HSTORE.
  • Verschachtelte Objekte und Arrays, komplexe Datenstruktur – du brauchst JSONB.

Beispiele für Umwandlung zwischen Formaten

TEXT → JSONB

SELECT to_jsonb('Einfaches Textbeispiel') AS jsonb_form;
-- Ergebnis: "Einfaches Textbeispiel"

JSONB → TEXT

SELECT info::TEXT AS text_form
FROM books_json;
-- Ergebnis: {"title": "SQL Grundlagen", "tags": ["anfänger", "datenbank"]}

HSTORE → JSONB

SELECT hstore_to_jsonb(attributes) AS jsonb_form
FROM products;
-- Ergebnis: {"farbe": "rot", "größe": "M"}

JSONB → HSTORE

SELECT jsonb_to_hstore('{"farbe": "rot", "größe": "M"}') AS hstore_form;
-- Ergebnis: "farbe"=>"rot", "größe"=>"M"

Worauf solltest du achten?

Wenn du maximale Flexibilität und Unterstützung für komplexe Strukturen brauchst, nimm JSONB. Aber wenn du einfache Datenstrukturen hast, wie Arrays, Text oder Key-Value-Paare, dann nutze die passenden Datentypen (ARRAY, TEXT, HSTORE).

Denk dran: Die richtige Wahl der Datenstruktur erspart dir später Kopfschmerzen beim Entwickeln und macht deine Abfragen schneller.

2
Aufgabe
SQL SELF, Level 34, Lektion 3
Gesperrt
Arbeiten mit Arrays (`ARRAY`)
Arbeiten mit Arrays (`ARRAY`)
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION