Archivia gli array in MySQL

Rayven Esplanada 11 dicembre 2023
  1. Mock Arrays come relazioni con gli Store Arrays in MySQL
  2. Archivia array in un diverso tipo di dati SQL
Archivia gli array in MySQL

Questo tutorial mostra come memorizzare o simulare array come un campo in MySQL.

SQL non supporta esplicitamente gli array come tipo di dati all’interno del proprio linguaggio, ma ci sono molte soluzioni alternative per renderlo possibile perché è un database relazionale.

I database relazionali come SQL funzionano utilizzando relazioni e chiavi. La maggior parte delle volte, utilizziamo queste relazioni per collegare più valori a una singola riga a cui è correlata.

Le relazioni sono una versione disaccoppiata degli array e funziona bene con la natura e la progettazione di SQL (vedere normalizzazione). Ecco perché non esiste un tipo di dati array in SQL perché il più delle volte gli array non sono necessari perché esistono relazioni.

Gli array in un database possono essere pericolosi se utilizzati o manipolati in modo inadeguato. Puoi implementare il tuo database senza di loro e avere un database molto ottimizzato.

Se vuoi davvero o hai bisogno di memorizzare gli array, ecco alcuni modi in cui puoi farlo.

Mock Arrays come relazioni con gli Store Arrays in MySQL

Se vogliamo seguire la natura e la convenzione di SQL, gli array dovrebbero essere trattati come relazioni.

Supponiamo di avere un customer che ha più order in un ristorante.

In primo luogo creiamo tabelle 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
);

Il cliente e i suoi ordini mostrano una relazione uno-a-molti; perché ciò sia implementato, avremmo bisogno di un’entità associativa per collegare le due tabelle per metterle in relazione tra loro.

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

Immaginiamo che le tabelle siano popolate come tali:

  • 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

Da queste tabelle possiamo capire che John Doe ordina Capesante, Aragoste e Cheesecake. Nel frattempo, Jane Doe ha ordinato Steak and Cheesecake.

Se vogliamo eseguire una query per tutto ciò che John Doe ha ordinato, dovremmo semplicemente utilizzare una query SELECT JOIN in quanto tale:

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 query genererà questo risultato:

name order
John Doe Scallops
John Doe Lobster
John Doe Cheesecake

Essenzialmente, le relazioni sono versioni SQL degli array. Quindi, se vuoi mantenere un buon design, comprendi il concetto di relazioni e usale il più possibile.

Archivia array in un diverso tipo di dati SQL

Durante l’aggiornamento di MySQL 5.7 e versioni successive, la lingua ora supporta JSON come tipo di dati. JSON fornisce a SQL un metodo conveniente per memorizzare tipi di dati complessi come array, set, mappe, dizionari e molti altri.

Il modo più veloce per deridere un array all’interno di SQL è memorizzarlo come stringa.

Crea tabelle 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
);

Ogni volta che un cliente effettua un ordine, usa GROUP_CONCAT() per memorizzare una nuova voce nel campo order del cliente.

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

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

Se interroghi il cliente con gli ordini, il risultato mostrerà:

name order
John Doe ,Cheesecake, Ravioli

Questo metodo è essenzialmente un tipo di matrice archiviato in una singola colonna. Tuttavia, ciò significherebbe che non stai seguendo la convenzione di un database relazionale, che è SQL.

Questo è un modo efficace per memorizzare un array in SQL. Tuttavia, è considerato una cattiva progettazione forzare un array in un database relazionale quando è possibile archiviarlo facilmente in una nuova tabella e configurare le relazioni e i vincoli.

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