Almacenar arrays en MySQL

Rayven Esplanada 11 diciembre 2023
  1. Simular arrays como relaciones para almacenar arrays en MySQL
  2. Almacenar matrices dentro de un tipo de datos SQL diferente
Almacenar arrays en MySQL

Este tutorial muestra cómo almacenar o simular arrays como un campo en MySQL.

SQL no soporta explícitamente los arrays como un tipo de datos dentro de su propio lenguaje, pero hay muchas soluciones para hacerlo posible porque es una base de datos relacional.

Las bases de datos relacionales como SQL funcionan usando relaciones y claves. La mayoría de las veces, utilizamos esas relaciones para conectar múltiples valores a una sola fila con la que está relacionada.

Las relaciones son una versión desacoplada de los Arrays, y funciona bien con la naturaleza y el diseño de SQL (véase normalización). Por eso no hay un tipo de datos de array en SQL, porque la mayoría de las veces los Arrays no son necesarias porque existen relaciones.

Las matrices en una base de datos pueden ser peligrosas si se utilizan o manipulan mal. Se puede implementar la base de datos sin ellas y tener una base de datos muy optimizada.

Si realmente quieres o necesitas almacenar matrices, aquí tienes algunas formas de hacerlo.

Simular arrays como relaciones para almacenar arrays en MySQL

Si vamos a seguir la naturaleza y la convención de SQL, entonces los Arrays deben ser tratadas como relaciones.

Digamos que tenemos un customer que tiene múltiples order en un restaurante.

Primero creamos mesas de customer y de order.

CREATE TABLE customer (
`id` INT NOT NULL PRIMARY KEY,
`name` VARCHAR(50)
);

CREATE TABLE order (
`order_id` INT NOT NULL PRIMARY KEY,
`order` VARCHAR(40),
`price` DOUBLE
);

El cliente y sus pedidos exhiben una relación uno a muchos; para que esto se implemente, necesitaríamos una entidad asociativa para conectar las dos tablas para relacionarlas entre sí.

CREATE TABLE customer_order (
`customer_id` INT NOT NULL,
`order_id` INT NOT NULL,
PRIMARY KEY(`customer_id`, `order_id`)
);

Imaginemos que las tablas están pobladas como tales:

  • customer
id name
1 John Doe
2 Jane Doe
  • order
order_id order price
1 Scallops 35.00
2 Lobster 120.00
3 Steak 80.00
4 Cheesecake 25.00
  • customer_order
customer_id order_id
1 1
1 2
1 4
2 3
2 4

A partir de estas tablas, podemos relacionar a John Doe ordenando vieiras, langosta y tarta de queso. Mientras tanto, John Doe ordenó bistec y pastel de queso.

Si queremos preguntar por todo lo que John Doe ha pedido, simplemente usaremos una pregunta de SELECT JOIN como tal:

SELECT c.name, o.order
FROM customer c
INNER JOIN customer_order co
ON co.customer_id = c.customer_id
INNER JOIN order o
ON o.order_id = co.order_id
WHERE name = 'John Doe'

La consulta generará este resultado:

name order
John Doe Scallops
John Doe Lobster
John Doe Cheesecake

Esencialmente, las relaciones son versiones SQL de los Arrays. Así que si alguna vez quieres mantener un buen diseño, entiende el concepto de relaciones, y úsalas tanto como sea posible.

Almacenar matrices dentro de un tipo de datos SQL diferente

Durante la actualización de MySQL 5.7 en adelante, el lenguaje ahora soporta JSON como tipo de datos. JSON proporciona a SQL un método conveniente para almacenar tipos de datos complejos como matrices, conjuntos, mapas, diccionarios y muchos más.

La forma más rápida de burlar un array dentro de SQL es almacenarla como una cadena.

Crea tablas customer y order.

CREATE TABLE customer (
`id` INT NOT NULL PRIMARY KEY,
`name` VARCHAR(50),
`order` VARCHAR(999)
);

CREATE TABLE order (
`id` INT NOT NULL PRIMARY KEY,
`order` VARCHAR(50),
`price` DOUBLE
);

Cada vez que un cliente hace un pedido, use GROUP_CONCAT() para almacenar una nueva entrada en el campo order del cliente.

UPDATE customer
SET order = CONCAT(order, ', Cheesecake');

UPDATE customer
SET order = CONCAT(order, ', Ravioli');

Si consulta al cliente con los pedidos, el resultado se mostrará:

name order
John Doe ,Cheesecake, Ravioli

Este método es esencialmente un tipo de array que se almacena en una sola columna. Sin embargo, esto significaría que no está siguiendo la convención de una base de datos relacional, que es SQL.

Esta es una forma efectiva de almacenar un array dentro de SQL. Aún así, se considera un mal diseño forzar un array en una base de datos relacional cuando se puede almacenar fácilmente en una nueva tabla y configurar las relaciones y restricciones.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn