Utilizzare le colonne dinamiche in MariaDB

Mattepuffo's logo
Utilizzare le colonne dinamiche in MariaDB

Utilizzare le colonne dinamiche in MariaDB

Le colonne dinamiche ci permettono di estendere il contenuto di alcune, e rendere più flessibile una tabella.

In questo modo si potrebbe evitare di dover passare ad un db NoSQL per qualcosa per cui in effetti non serve.

Vediamo come usarle in MariaDB (dalla vesione 5.3 se non erro); partiamo da una tabella di esempio del genere:

> DESC persone;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | int(11)     | NO   | PRI | NULL    | auto_increment |
| nome      | varchar(50) | NO   |     | NULL    |                |
| attributi | mediumblob  | NO   |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+

Le colonne dinamiche sono contenute in campi BLOB.

Inseriamo due records di esempio:

INSERT INTO persone (nome, attributi) VAUES
("totti", COLUMN_CREATE(1, "dirigente", 2, "roma", 3, "capitano")),
("messi", COLUMN_CREATE(1, "calciatore", 2, "barcellona", 3, "capitano", 4, "pallone d'oro"));

Ogni records può avere un determinato numero di attributi; la funzione che crea questo tipo di colonne è COLUMN_CREATE.

Per listare tutte le colonne di ogni records:

> SELECT nome, LENGTH(attributi), COLUMN_LIST(attributi) FROM persone;
+-------+-------------------+------------------------+
| nome  | LENGTH(attributi) | COLUMN_LIST(attributi) |
+-------+-------------------+------------------------+
| totti |                39 | `1`,`2`,`3`            |
| messi |                68 | `1`,`2`,`3`,`4`        |
+-------+-------------------+------------------------+

Per recuperare il valore della colonna:

> SELECT nome, COLUMN_GET(attributi, 1 AS CHAR(50)) FROM persone;
+-------+--------------------------------------+
| nome  | COLUMN_GET(attributi, 1 AS CHAR(50)) |
+-------+--------------------------------------+
| totti | dirigente                            |
| messi | calciatore                           |
+-------+--------------------------------------+

Possiamo anche filtrare per colonna:

> SELECT nome, COLUMN_GET(attributi, 1 AS CHAR(50)) FROM persone WHERE COLUMN_EXISTS(attributi, 4);
+-------+--------------------------------------+
| nome  | COLUMN_GET(attributi, 1 AS CHAR(50)) |
+-------+--------------------------------------+
| messi | calciatore                           |
+-------+--------------------------------------+

Oppure:

> SELECT nome, COLUMN_GET(attributi, 1 AS CHAR(50)) FROM persone WHERE COLUMN_GET(attributi, 4 AS CHAR(50)) LIKE "%pallone%";
+-------+--------------------------------------+
| nome  | COLUMN_GET(attributi, 1 AS CHAR(50)) |
+-------+--------------------------------------+
| messi | calciatore                           |
+-------+--------------------------------------+

Vi rimando alla documentazione per altri esempi!

Enjoy!


Condividi

Commentami!