CodeGym /Kurse /SQL SELF /Vergleich von Arrays und JSONB

Vergleich von Arrays und JSONB

SQL SELF
Level 36 , Lektion 0
Verfügbar

Heute schauen wir uns genauer an, was Arrays sind, vergleichen sie mit JSONB, checken ihre Stärken und Schwächen und suchen die besten Praktiken für den Einsatz in echten Projekten.

Arrays vs JSONB: kleine Daten-Ninjas vs Flexibilität in der Box

Du weißt bestimmt schon, dass du in PostgreSQL-Arrays Werte von genau einem Datentyp speichern kannst: ein Array aus Zahlen, Strings oder Datumswerten. Beispiel: Eine Liste von Noten eines Studenten, wo alle Elemente Zahlen sind.

-- Tabelle mit Studenten und ihren Noten
CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT,
    grades INTEGER[]    -- Array von Noten
);

JSONB dagegen speichert Daten als JSON-Struktur. Das erinnert stark an ein JavaScript-Objekt, aber mit dem Vorteil von schnellem Parsen und Indexierung. In JSONB kannst du sowohl geordnete Listen als auch Objekte mit Keys und Values speichern.

-- Tabelle mit Studenten und verschiedenen Infos über sie
CREATE TABLE students_details (
    id SERIAL PRIMARY KEY,
    name TEXT,
    details JSONB  -- flexible JSON-Struktur
);

Beispiel für Daten in JSONB:

{
    "noten": [90, 82, 77],
    "adresse": {
        "stadt": "Berlin",
        "plz": "352912"
    }
}

Also: Arrays sind ein einfacher Weg, um mit Listen von Werten zu arbeiten, während JSONB viel mehr Möglichkeiten für komplexe Daten bietet.

Hauptunterschiede zwischen Arrays und JSONB

Merkmal Arrays JSONB
Strukturtyp Lineare Datenstruktur Hierarchische Datenstruktur
Elementtypen Nur ein Datentyp Verschiedene Datentypen
Strukturgröße Fix (linear) Flexibel, kann Listen und Objekte enthalten
Zugriffsgeschwindigkeit Schnell bei festen Daten Langsamer bei komplexen Suchen
Indexierung Gute Index-Unterstützung Braucht GIN-Indexierung
Einsatzgebiet Einfache Liste oder Array von Werten Komplexe Daten: verschachtelte Objekte/Listen

Jetzt schauen wir uns an, wie das Ganze in der Praxis aussieht.

Wann solltest du Arrays benutzen?

Angenommen, wir haben eine Datenbank mit Büchern, und jedes Buch kann zu mehreren Genres gehören. Hier ist ein Array eine gute Wahl.

CREATE TABLE books (
    id SERIAL PRIMARY KEY,
    title TEXT,
    genres TEXT[]    -- Array von Genres
);

-- Beispiel: Ein Buch mit mehreren Genres einfügen
INSERT INTO books (title, genres)
VALUES ('1984', ARRAY['Dystopie', 'Politische Fiktion', 'Science Fiction']);

Arrays sind super, wenn du sicher bist, dass:

  • deine Daten sich klar als Liste speichern lassen,
  • die Listen klein und einheitlich sind (z.B. Strings oder Zahlen),
  • du einfach nur Listen speichern und abrufen willst (ohne komplizierte Operationen).

Vorteile von Arrays

  • Einfaches Speichern von gleichartigen Daten.
  • Praktisch für kleine Listen wie Tags, Kategorien oder Noten.

Wann solltest du JSONB benutzen?

Stell dir vor, du willst komplexere Infos zu Büchern speichern, z.B. Genres, ISBN und Bewertung. Hier reichen Arrays nicht mehr – Zeit für JSONB.

CREATE TABLE books_details (
    id SERIAL PRIMARY KEY,
    title TEXT,
    details JSONB    -- Buchdetails als JSONB
);

-- Beispiel: Komplexe Infos zu einem Buch einfügen
INSERT INTO books_details (title, details)
VALUES (
    '1984',
    '{"genres": ["Dystopie", "Politische Fiktion", "Science Fiction"],
      "isbn": "9780451524935",
      "bewertung": 8.9}'
);

JSONB ist super, wenn du:

  • komplexe oder gemischte Daten speichern willst (Zahlen, Strings, Listen, Objekte),
  • Parameter dynamisch hinzufügen willst, ohne die Tabellenstruktur zu ändern,
  • verschachtelte Daten speichern willst (z.B. Adressen, Eigenschaften, Einstellungen).

Vorteile von JSONB

  • Sehr flexibel. Du kannst neue Keys und Werte hinzufügen, ohne die Tabellenstruktur zu ändern.
  • Ideal für komplexe Daten, z.B. JSON-API-Antworten.

Die Wahl zwischen Arrays und JSONB

Wenn du nur Listen von gleichartigen Daten speichern willst – nimm Arrays. Zum Beispiel:

-- Speicherung von Teilnehmer-IDs bei Events
CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    participant_ids INTEGER[]
);

Wenn die Daten gemischt oder komplex sind – besser JSONB. Zum Beispiel:

-- Speicherung von Kundeninfos mit Adressen
CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    info JSONB
);

Arrays und JSONB werden unterschiedlich indexiert. Für Arrays nimmt man meistens GIN-Indizes, für JSONB – GIN und BTREE, je nach Datenstruktur.

Performance

Arrays sind bei typischen Suchaufgaben schneller. JSONB ist etwas langsamer, aber dafür flexibler. Wenn du einfach nur Elemente suchst (z.B. Genres oder IDs), sind Arrays flotter:

-- Arrays mit GIN-Index nutzen
CREATE INDEX idx_genres ON books USING GIN(genres);

-- Bücher nach Genre filtern
SELECT * FROM books WHERE genres @> ARRAY['Science Fiction'];

Prüfen, ob Daten vorhanden sind

Mit JSONB hast du mehr Möglichkeiten, nach Keys zu filtern:

-- Prüfen, ob der Key "genres" existiert
SELECT * FROM books_details WHERE details ? 'genres';

-- Prüfen, ob ein Element in der Liste ist
SELECT * FROM books_details WHERE details->'genres' ?| ARRAY['Fantasy', 'Dystopie'];

Mit Arrays kannst du Werte direkt suchen:

-- Prüfen, ob ein Element im Array ist
SELECT * FROM books WHERE genres @> ARRAY['Fantasy'];

Struktur-Flexibilität

JSONB ist unschlagbar, wenn deine Daten komplexe, verschachtelte Strukturen haben:

{
    "genres": ["Fantasy", "Abenteuer"],
    "bewertungen": {"goodreads": 8.5, "amazon": 4.7}
}

Mit Arrays ist das ohne Normalisierung oder Extra-Felder nicht machbar.

Am Ende sind Arrays und JSONB keine Konkurrenten, sondern Tools für unterschiedliche Aufgaben. Wenn deine Daten wie eine Liste aussehen – nimm Arrays. Wenn sie komplex, verschachtelt oder gemischt sind – nimm JSONB. Wichtig: Denk immer an Performance und Indexierung!

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION