El SQL clásico no contempla el almacenamiento de múltiples valores en una sola celda; el modelo relacional exige normalización. Sin embargo, en las tareas modernas, a menudo encontramos campos de tipo "lista de etiquetas", "escala de calificaciones", donde es conveniente operar con un conjunto de valores a nivel de una fila individual. Algunas bases de datos (PostgreSQL, Oracle) ofrecen tipos de datos ARRAY o mecanismos similares.
El uso de arreglos viola el principio de normalización, dificulta muchas operaciones (filtrado, actualización, indexación) y hace que el código sea menos portátil entre bases de datos. Pero puede ser conveniente o inevitable, por ejemplo, para la caché o la búsqueda rápida en listas de valores pequeños.
CREATE TABLE products ( id SERIAL PRIMARY KEY, tags TEXT[] ); -- Inserción: INSERT INTO products(tags) VALUES (ARRAY['eco','sale','hot']); -- Búsqueda en el arreglo: SELECT * FROM products WHERE 'eco' = ANY (tags);
Características clave:
¿Se pueden indexar elementos individuales de un arreglo?
En PostgreSQL — sí, a través de índices GIN/GIST:
CREATE INDEX idx_tags ON products USING GIN (tags);
¿Cómo verificar más rápido la inclusión de un valor en un arreglo en una columna de cadena a través de un delimitador?
SQL estándar no puede hacerlo, se utiliza búsqueda por patrón:
SELECT * FROM users WHERE ',admin,' like concat('%,',role,',%');
Pero este enfoque es poco confiable y lento.
¿Cuántos valores se pueden almacenar en un arreglo, y qué lo limita?
La limitación depende de la base de datos; por ejemplo, en PostgreSQL, la limitación es solo el tamaño de la cadena (1–2 MB).
En un proyecto de ecommerce, decidieron almacenar las etiquetas de los productos como una cadena separada por comas en una columna. Esto dificultó mucho la búsqueda rápida de productos por etiqueta, errores en el filtrado, y la repetición de etiquetas ocurrió debido a errores de análisis.
Ventajas:
Desventajas:
En PostgreSQL para conjuntos pequeños e inmutables (roles de usuario) se utilizaron ARRAY e índice GIN. Para grandes — una tabla separada de roles.
Ventajas:
Desventajas: