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

Code:  Select all  |  Linenumbers on/off
  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

Code:  Select all  |  Linenumbers on/off
  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.     );
Code:  Select all  |  Linenumbers on/off
  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:

Code:  Select all  |  Linenumbers on/off
  1. SELECT id, column_list(dynamic_cols) FROM sales;
Code:
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:

Code:  Select all  |  Linenumbers on/off
  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;
Code:
+----+---------+
| id | product |
+----+---------+
|  1 | Shampoo |
|  2 | Parfum  |
+----+---------+

Anzeigen aller (sub)Spalten in unserer dynamischen Spalte:

Code:  Select all  |  Linenumbers on/off
  1. SELECT
  2. id,
  3. column_list(dynamic_cols)
  4. FROM
  5. sales;
Code:
+----+------------------------------+
| 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:

Code:  Select all  |  Linenumbers on/off
  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;
Code:
+----+---------+----------+-------+------------+
| id | product | waehrung | price | hersteller |
+----+---------+----------+-------+------------+
|  1 | Shampoo | NULL     |     2 | NULL       |
|  2 | Parfum  | Euros    |    25 | NULL       |
+----+---------+----------+-------+------------+

Daten im JSON-Format

Code:  Select all  |  Linenumbers on/off
  1. SELECT id, COLUMN_JSON (dynamic_cols) FROM sales;
Code:
+----+----------------------------------------------------+
| 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