Archivia gli array in MySQL
- Mock Arrays come relazioni con gli Store Arrays in MySQL
- Archivia array in un diverso tipo di dati SQL
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.
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