26.112014

NoSQL mit PostgreSQL

Wer mit Datenbanken arbeitet, der wird oft auf die SQL basierten relationalen Datenbanken zurückgegriffen haben. Das Ganze hat bisher auch sehr gut funktioniert. In Zeiten, wo die aufkommenden Daten aber immer mehrund vor allem auch umfangreicher werden und zudem meinst ungeordnet vorliegen (auch als BigData bekannt), reichen die starren Vorgaben der relationalen Datenbanken nicht mehr aus. Man gelangt recht schnell an die Grenzen. Oft sind hier dann die NoSQL basierten nicht-relationalen Datenbanken eine Lösung, die keine festgelegten Tabellenschemata haben.

Die Trennung zwischen SQL und NoSQL funktioniert auch solange gut, bis die Anforderung existiert, dass zwischen geordneten und größtenteils ungeordnete Daten eine Beziehung und dies am Besten auch noch innerhalb einer Abfrage hergestellt werden soll. Hierzu hat PostgreSQL mit seiner Version 9.2 ein sehr gutes neues Feature eingeführt. Daten können nun im JSON-Format gespeichert werden. Als Beispiel nehmen wir jetzt einfach mal eine Tabelle zum Speichern von Informationen über User, die man bei so gut wie jedem Webprojekt irgendwie benötigt.

CREATE TABLE users (id serial NOT NULL, data json);

Damit haben wir nun also schon einmal die Tabelle für die User. Diese muss nun noch mit Daten gefüllt werden

INSERT INTO users (id, data) VALUES (1, '{"firstname": "Max", "lastname": "Mustermann", "birthdate": "2000-01-01", "city": "Musterhausen"}');
INSERT INTO users (id, data) VALUES (2, '{"firstname": "Marie", "lastname": "Musterfrau", "birthdate": "2001-01-01"}');

Version 9.2 bietet einem nun leider noch nicht so viele weitere Funktionalitäten und Operationsmöglichkeiten, um mit den Daten arbeiten zu können. Diese wurden erst mit der Version 9.3 von PostgreSQL eingeführt. Es stehen nun Operatoren bereit, um auf einzelne Elemente der JSON-Daten zuzugreifen.

Mit dieser einfachen Abfrage kann man sich eine Liste der User ausgeben lassen

SELECT id, (data->>'fistname' || ' ' || data->>'lastname') AS name FROM users;

Ferner ist es möglich, auch geschachtelte JSON-Objekte zu verwenden und in Abfragen auf die Unterelemente zuzugreifen. Des Weiteren können auch Indexes sowie Unique Constraints mit einzelne Elemente erstellt werden:

CREATE UNIQUE INDEX users_name_unique ON users ((data->>'firstname', data->>'lastname'));

Es ist also nicht immer zwingend notwendig, nur weil die Datenmenge undefiniert ist, eine schemalose Datenbank zu verwenden, wenn die vorhandene schemabasierte Datenbank entsprechende Funktionalitäten mitliefert. Einfach mal einen Blick in die Dokumentation werfen und selber experimentieren...