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.
GO TO FULL VERSION