Arrays de Armazenamento no MySQL

  1. Mock Arrays como Relações para Armazenar Arrays no MySQL
  2. Armazenar arrays dentro de um tipo de dados SQL diferente

Este tutorial mostra-lhe como armazenar ou simular arrays como um campo no MySQL.

SQL não suporta explicitamente arrays como um tipo de dados dentro da sua própria linguagem, mas há muitas soluções para o tornar possível porque é uma base de dados relacional.

As bases de dados relacionais como a SQL funcionam usando relações e chaves. Na maioria das vezes, utilizamos essas relações para ligar vários valores a uma única linha com a qual está relacionada.

As relações são uma versão desacoplada de arrays, e funciona bem com a natureza e desenho de SQL (ver normalização. É por isso que não existe um tipo de dados de matriz em SQL, porque na maioria das vezes, as matrizes não são necessárias porque as relações existem.

Os arrays numa base de dados podem ser perigosos se utilizados ou manipulados de forma deficiente. Pode implementar a sua base de dados sem elas e ter uma base de dados muito optimizada.

Se realmente quiser ou precisar de armazenar arrays, aqui estão algumas formas de o fazer.

Mock Arrays como Relações para Armazenar Arrays no MySQL

Se quisermos seguir a natureza e a convenção da SQL, então as arrays devem ser tratadas como relações.

Digamos que temos um customer que tem múltiplas order num restaurante.

Primeiro criamos tabelas de customer e 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
);

O cliente e as suas encomendas exibem uma relação um para muitos; para que isto seja implementado, precisaríamos de uma entidade associativa que ligasse as duas tabelas para as relacionar uma com a outra.

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

Imaginemos que as tabelas são povoadas como tal:

  • 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 destas tabelas, podemos relacionar John Doe a encomendar Vieiras, Lagosta, e Cheesecake. Entretanto, John Doe encomendou Bife e Cheesecake.

Se quisermos fazer perguntas sobre tudo o que John Doe encomendou, utilizaríamos simplesmente uma pergunta 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'

A consulta irá gerar este resultado:

name order
John Doe Scallops
John Doe Lobster
John Doe Cheesecake

Essencialmente, as relações são versões SQL de arrays. Assim, se alguma vez desejar manter um bom design, compreender o conceito de relações, e utilizá-las tanto quanto possível.

Armazenar arrays dentro de um tipo de dados SQL diferente

Durante a actualização MySQL 5.7 e para cima, a língua suporta agora JSON como um tipo de dados. O JSON fornece SQL um método conveniente para armazenar tipos de dados complexos como matrizes, conjuntos, mapas, dicionários, e muitos mais.

A forma mais rápida de escarnecer de um array dentro de SQL é armazená-la como uma string.

Criar tabelas customer e 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 um cliente faz uma encomenda, utilize GROUP_CONCAT() para armazenar uma nova entrada no campo order do cliente.

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

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

Se consultar o cliente com as encomendas, o resultado será apresentado:

name order
John Doe ,Cheesecake, Ravioli

Este método é essencialmente um tipo de matriz a ser armazenado numa única coluna. Contudo, isto significaria que não está a seguir a convenção de uma base de dados relacional, que é SQL.

Esta é uma forma eficaz de armazenar um array dentro de SQL. Ainda assim, é considerado um mau desenho forçar um array numa base de dados relacional quando se pode facilmente armazená-lo numa nova tabela e configurar as relações e restrições.