Klassisches SQL sieht nicht vor, mehrere Werte in einer Zelle zu speichern — das relationale Modell erfordert Normalisierung. In modernen Anwendungen sind jedoch häufig Felder vom Typ „Tag-Liste“, „Bewertungsskala“ anzutreffen, bei denen es praktisch ist, in einer einzelnen Zeile mit mehreren Werten zu operieren. Einige DBMS (PostgreSQL, Oracle) bieten Datentypen wie ARRAY oder ähnliche Mechanismen an.
Die Verwendung von Arrays verletzt das Prinzip der Normalisierung, erschwert viele Operationen (Filterung, Aktualisierung, Indizierung) und macht den Code weniger portabel zwischen den DBMS. Manchmal ist es jedoch praktisch oder unvermeidlich — z. B. zur Caching oder schnellen Suche in kleinen Werte Listen.
CREATE TABLE products ( id SERIAL PRIMARY KEY, tags TEXT[] ); -- Einfügen: INSERT INTO products(tags) VALUES (ARRAY['eco','sale','hot']); -- Suche über das Array: SELECT * FROM products WHERE 'eco' = ANY (tags);
Wichtige Merkmale:
Kann man einzelne Elemente eines Arrays indizieren?
In PostgreSQL — ja, über GIN/GIST-Indizes:
CREATE INDEX idx_tags ON products USING GIN (tags);
Wie kann man schneller prüfen, ob ein Wert in einem Array in einer String-Spalte über einen Separator enthalten ist?
SQL kann das standardmäßig nicht, man verwendet die Suche nach Mustern:
SELECT * FROM users WHERE ',admin,' like concat('%,',role,',%');
Aber dieser Ansatz ist unzuverlässig und langsam.
Wie viele Werte kann man in einem Array speichern, und was schränkt ein?
Die Einschränkung hängt vom DBMS ab — zum Beispiel liegt in PostgreSQL die Einschränkung nur auf der Größe der Zeile (1–2 MB).
In einem Ecommerce-Projekt wurden die Tags von Produkten als durch Kommas getrennte Strings in einer Spalte gespeichert. Die schnelle Suche nach Produkten nach Tags wurde stark erschwert, Fehler in der Filterung traten auf, und wiederholte Tags passierten aufgrund von Parsing-Fehlern.
Vorteile:
Nachteile:
In PostgreSQL wurden für kleine, unveränderliche Sätze (Benutzerrollen) ARRAY und GIN-Index verwendet. Für größere — eine separate Rollentabelle.
Vorteile:
Nachteile: