MariaDB

MariaDB - Dynamische Spalten und Json

Vor einigen Tagen ist die neue Beta von MariaDB 10 erschienen (10.0.5 - Artikelzeitpunkt).

Eines der Features, die bereits bei MariaDB 5.3 eingeführt wurden und bei der 10.x wieder verbessert wurden, sind "dynamische Spalten" ( dynamic_columns ). Dynamische Spalten, also schema-lose-spalten sind auch eines der Hauptfeatures von NoSQL-Datenbanken.

MariaDB bietet hier einen guten Kompromiss aus SQL-Abfragesprache und der heute geforderten Flexibilität z.B. beim Speichern von JSON-Objekten in Datenbanken.

Installation

Als erstes benötigen wir natürlich eine lauffähige MariaDB Installation. Natürlich hängt die Art wie Sie die DB installieren von Ihrer Systemumgebung ab.

In meinem Fall habe ich den Upgrade auf einer Ubunut LTS 12.04 durchgeführt.

 

  • Deinstallation von mysql-server und mysql-client
  • Auswahl der Distribution auf dieser Seite: MariaDB-Downloads
  • Commands auf der oben genannten Seite ausgeführt
  • /etc/init.d/mysql start (Ja mysql!)

Das war's. Alle Datenbanken auf dem Server wurden problemlos übernommen. Dauer - ca 15min.

Wir erstellen die Tabelle

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. CREATE TABLE
  2.     sales
  3.     (
  4.         id INT PRIMARY KEY,
  5.         dynamic_cols BLOB
  6.     )
  7.     engine=innodb;

OK - COLUMN_CREATE, jetzt wird es ernst

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. ----------------------------------------------------------------
  2. -- 2 Cols (Produkt + Preis)
  3. --
  4. INSERT
  5. INTO
  6.     sales VALUES
  7.     (
  8.         1,
  9.         COLUMN_CREATE('Produkt', 'Shampoo', 'Preis',2)
  10.     );
Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. ----------------------------------------------------------------
  2. -- 3 Cols (Produkt + Preis + Waehrung)
  3. --
  4. INSERT
  5. INTO
  6.     sales VALUES
  7.     (
  8.         2,
  9.         COLUMN_CREATE('Produkt', 'Parfum', 'Preis', 25, 'Waehrung', 'Euros')
  10.     );
  11.  

Die Abfrage - SELECT

Wir sehen uns an welche Spalten zur Verfügung stehen:

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. SELECT id, column_list(dynamic_cols) FROM sales;
Quelltext:
MariaDB [mariatest]> select id, column_list(dynamic_cols) from sales;
+----+------------------------------+
| id | column_list(dynamic_cols)    |
+----+------------------------------+
|  1 | `Preis`,`Produkt`            |
|  2 | `Preis`,`Produkt`,`Waehrung` |
+----+------------------------------+

Anzeige der Produkte:

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. SELECT
  2.     id,
  3.     column_list(dynamic_cols)
  4. FROM
  5.     sales;
  6. SELECT
  7.     id,
  8.     column_get(dynamic_cols,'Produkt' AS CHAR) AS product
  9. FROM
  10.     sales;
Quelltext:
+----+---------+
| id | product |
+----+---------+
|  1 | Shampoo |
|  2 | Parfum  |
+----+---------+

Anzeigen aller (sub)Spalten in unserer dynamischen Spalte:

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. SELECT
  2. id,
  3. column_list(dynamic_cols)
  4. FROM
  5. sales;
Quelltext:
+----+------------------------------+
| id | column_list(dynamic_cols)    |
+----+------------------------------+
|  1 | `Preis`,`Produkt`            |
|  2 | `Preis`,`Produkt`,`Waehrung` |
+----+------------------------------+

Alle (sub)Spalten mit den Werten bzw. NULL wenn die Spalte in dem jeweiligen Datensatz nicht zur Verfügung steht:

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. SELECT
  2.     id,
  3.     column_get (dynamic_cols, "Produkt"    AS CHAR) AS product,
  4.     column_get (dynamic_cols, "Waehrung"   AS CHAR) AS waehrung,
  5.     column_get (dynamic_cols, 'Preis'      AS INT) AS  price,
  6.     column_get (dynamic_cols, "Hersteller" AS CHAR) AS hersteller
  7. FROM
  8.     sales;
Quelltext:
+----+---------+----------+-------+------------+
| id | product | waehrung | price | hersteller |
+----+---------+----------+-------+------------+
|  1 | Shampoo | NULL     |     2 | NULL       |
|  2 | Parfum  | Euros    |    25 | NULL       |
+----+---------+----------+-------+------------+

Daten im JSON-Format

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. SELECT id, COLUMN_JSON (dynamic_cols) FROM sales;
Quelltext:
+----+----------------------------------------------------+
| id | COLUMN_JSON (dynamic_cols)                         |
+----+----------------------------------------------------+
|  1 | {"Preis":2,"Produkt":"Shampoo"}                    |
|  2 | {"Preis":25,"Produkt":"Parfum","Waehrung":"Euros"} |
+----+----------------------------------------------------+

INSERT INTO - JSON Datentyp

Was leider noch nicht funktioniert ist das dynamischen Erstellen von Spalten mittels eines JSON-Datentyps.

Ein Sample wie so etwas aussehen könnte sieht man hier: Karlson on databases