Arrays de Armazenamento no MySQL
- Mock Arrays como Relações para Armazenar Arrays no MySQL
- 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 array em SQL, porque na maioria das vezes, as arrays 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 arrays, 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 array 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.
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