Arrays en Postgres

Aunque las reglas de normalización nos dicen que debe haber un solo dato por celda, existen muchos tipos de datos secuenciales que pueden ser almacenados en arreglos ya sea por comodidad o por los requerimientos lógicos. Valores como la ubicación, coordenadas de moléculas, arreglos de colores de de imágenes, tags de posts de blog. Los arreglos en postgres permiten guardar estos datos secuenciales.

Es interesante que postgres permite crear arrays de todos los tipos básicos, e incluso de los tipos de datos definidos por el usuario.

para definir un array, se utiliza la sintaxis en el caso de los enteros integer[].

Para crear una columna array se declara de la siguiente manera:

CREATE TABLE tags (
id serial PRIMARY KEY,
tags_list text[]
);

para insertar valores en un arreglo, se puede usar la palabra clave ARRAY

INSERT INTO tags (tags_list) VALUES (ARRAY ['python', 'databases', 'postgres']);

tambien se puede usar la sintaxis de llaves de la siguiente manera:

INSERT INTO tags (tags_list) VALUES '{"python", "databases", "postgres"}');

Para acceder a los elementos de un array podemos llamar a los elementos por su valor, es importante notar que los arreglos en Postgres comienzan en 1.

SELECT id, tags_list[2] FROM tags;

Tambien se puede usar un elemento del array por posición en una condición WHERE dentro de una consulta.

SELECT id, tags_list FROM tags WHERE tags_list[2] = 'databases';

Para modificar un array lo podemos hacer modificando un sólo elemento, o actualizando todo el array simultáneamente.

UPDATE tags SET tags_list[2] = 'database' WHERE id = 3;

para cambiar todo el array:

UPDATE tags SET tags_list = '{"database", "python", "Postgres", "SQL"}' WHERE id = 3;

para añadir elementos al arreglo podemos utilizar la función array_cat

UPDATE tags SET tags_list = array_cat(tags_list, '{"tutorial", "programming"}') WHERE id = 3;
UPDATE tags SET tags_list = tags_list || '{"tutorial", "programming"}' WHERE id = 3;

Existen otras funciones para eliminar todas las ocurrencias de un elemento dentro de un arreglo, y reemplazar todas las ocurrencias de un elemento de un arreglo. estas funciones son: array_remove y array_replace.

Conclusiones

El uso de arrays en Postgres permite tener flexibilidad en la representación de datos complejos, en la denormalización de tablas para generar vistas y en la formulación de esquemas utilizando las tablas como representaciones de objetos (ORM).