Il SQL classico non prevede la memorizzazione di più valori in una singola cella — il modello relazionale richiede normalizzazione. Tuttavia, nelle sfide moderne si incontrano spesso campi di tipo "lista di tag", "scala di valutazione", dove è conveniente operare proprio con un insieme di valori a livello di singola riga. Alcuni DBMS (PostgreSQL, Oracle) forniscono tipi di dati ARRAY o meccanismi analoghi.
L'uso degli array viola il principio di normalizzazione, complica molte operazioni (filtraggio, aggiornamento, indicizzazione) e rende il codice meno portabile tra DBMS. Ma a volte è comodo o inevitabile — ad esempio, per caching o ricerca rapida in piccole liste di valori.
CREATE TABLE products ( id SERIAL PRIMARY KEY, tags TEXT[] ); -- Inserimento: INSERT INTO products(tags) VALUES (ARRAY['eco','sale','hot']); -- Ricerca nell'array: SELECT * FROM products WHERE 'eco' = ANY (tags);
Caratteristiche chiave:
Si può indicizzare singoli elementi dell'array?
In PostgreSQL — sì, tramite indici GIN/GIST:
CREATE INDEX idx_tags ON products USING GIN (tags);
Come controllare più velocemente se un valore è presente in un array in una colonna di stringhe attraverso un delimitatore?
SQL standard non è in grado, si utilizza la ricerca per pattern:
SELECT * FROM users WHERE ',admin,' like concat('%,',role,',%');
Ma questo approccio non è affidabile e lento.
Quanti valori si possono memorizzare in un array, e cosa lo limita?
Il limite dipende dal DBMS — ad esempio, in PostgreSQL c'è un limite solo sulla dimensione della riga (1–2 MB).
In un progetto e-commerce, i tag dei prodotti sono stati memorizzati come stringa separata da virgole in una singola colonna. È diventato molto difficile cercare rapidamente i prodotti per tag, ci sono stati errori nel filtraggio e la ripetizione dei tag è avvenuta a causa di errori di parsing.
Vantaggi:
Svantaggi:
In PostgreSQL per insiemi piccoli e immutabili (ruoli utente) sono stati usati ARRAY e indice GIN. Per quelli grandi — una tabella separata dei ruoli.
Vantaggi:
Svantaggi: