Kurz & Gut Datenbanken von Mustafa Zengin Neben der Anfrage an die Datenbank mit GET, können Datensätze durch PUT, POST und DELETE hinzugefügt, verändert oder entfernt werden. Aufgrund von möglichen Einschränkungen in der Länge der URI’s bei der GET-Methode, die je nach eingesetztem Server begrenzt ist, werden üblicherweise Anfragen die länger als 255 Bytes sind mit der POST-Methode durchgeführt. 1 Einführung Datenbanken sind in der Lage große Mengen an Informationen zu halten. Diese im Internet zugänglich zu machen ist eines der wesentlichen Herausforderungen. Das Ziel ist, die Datenbank so unkompliziert und in wenigen Schritten wie möglich erreichbar zu machen. Durch die Einheitliche Schnittstelle von REST ist dem Entwickler überlassen wie eine Datenbank im Backend realisiert wird. Es existieren grundsätzlich zwei voneinander unterschiedliche Ansätze der Umsetzung von Datenbanken: die SQL Basierte Relationale Datenbank und die NoSQL Variante. Datenbank Relationale DB NoSQL Dokumenten Basiert Key-­‐Value Basiert 2 Hauptteil Server Client HTTP WS Spaltenorientiert Abbildung 2 Datenbank Klassifizierung Relationale Datenbank HTTP / Connector Der erste Schritt für jedes RESTful System ist es zu entscheiden, welche Ressourcen zu Verfügung stehen sollen. Das ermöglicht URI’s als Query Anfragen zu benutzen, wie es im Web üblich ist. Für die Relationalen Modelle sind es die Tabellen (Relationen) und die Datensätze (Tupels), die eine URI Anfrage ausmachen. Diese können als Ressourcen dargestellt werden, wobei die TabellenRessourcen die Links zu den Tupels bereitstellen. Die Anfragen können Filter, Sortierung, Anzahl an Ergebnissen und Joins beinhalten. DB Abbildung 1 Eine Datenbank ist nicht immer von vorn herein RESTful, kann aber für diesen Zweck durch ein Webservice modelliert werden (Abbildung 1). Die gängigsten Datenbanken haben wohl definierte Connectoren um für Programmiersprachen zugänglich zu sein. Daran kann RESTful ansetzen. Durch die für RESTful definierten Schnittstellen sind die Möglichkeiten begrenzt, im Vergleich mit Query Kombinationen wie in einer Relationalen DB, miteinander kombinierte Daten für das Web zu Verfügung zu stellen. Software wie phpMyAdmin sind für Benutzer ausgerichtet, die aber nicht die Einschränkungen für die Architektur von REST einhalten. Einige Datenbanken wie SQLREST und REST-SQL bieten die Fähigkeit direkt im Web verfügbar zu sein. Das Problem liegt in der Unterstützung der Anfrage Möglichkeiten die durch eine Auflistung in einer Tabelle beschränkt wird. Beispiel URI Syntax für eine Query: http://example.com/musikdb/songs/12 http://{Anbieter}/{Datenbank}/{Tabelle}({id}) Ein etwas komplexere URI mit ein Join: .../{Datenbank}/{Tabelle1}/{Tabelle2} Vorausgesetzt, es ist eine Fremdschlüssel- Beziehung zwischen den Tabellen in der Datenbank Schema deklariert. Beispiel Ausgabe für http://example.com/musikdb/: <Musikdb> <Saenger href=“http://example.com/musik/seanger“>Saenger</Saenger> <Album href=“http://example.com/musik/Album“> Album </Album> <Songs href=“http://example.com/musik/songs“>Songs</Songs> </Musikdb> 1 http://www.se.uni-hannover.de Stand: 04.01.2012 2 Kurz & Gut: Datenbanken von Mustafa Zengin NoSQL (Not only SQL) Ausführen: EntityManagerFactory emf = Persistence.createEntityManagerFactory(„dbEinstel lung“); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); Die NoSQL Datenbanken verfolgen einen nichtrelationalen Ansatz. Dieser wiederum klassifiziert sich nach weiteren Eigenschaften (Abbildung 2). Bei einigen NoSQL Datenbanken wie CouchDB, HBase und Riak ist in der Data Management Layer bereits REST integriert und der Zugriffe auf die Daten werden über REST-Methoden geregelt (Abbildung3). Jede NoSQL Datenbank hat in seinem Gebiet gewisse Eigenschaften, mitunter das sie schemafrei sein kann. Saenger saenger = new Saenger(); saenger.setName(„Max Muster“); em.persist(saenger); em.getTransaction().commit(); em.close(); @Entity Spezifiziert eine Klasse als Entity @Table Definiert den Tabellennamen für die Entity @Id Spezifiziert den Primärschlüssel @GeneratedValue Generiert automatisch ein Wert, z.B. für Primärschlüssel @Column Spezifiziert Daten zu einem Feld wie maximale länge, nullable, unique etc. @ManyToMany Definiert N:N Relationen @ManyToOne Definiert N:1 Relationen @OneToMany Definiert 1:N Relationen JPA Standard @OneToOne Definiert 1:1 Relationen Java Persistent API ist eine Java-Schnittstelle mit deren Hilfe Objekte vereinfacht in Datenbanken übertragen werden. So können auch Datenbanken genutzt werden die ursprünglich nicht für Objektorientierte Datenstruktur vorgesehen war. Die Zuweisung und Abhängigkeit an die Datenbank geschieht über Annotationen (Tabelle 1). @Embedded Auf Klassendeklaration welche eine Entität als Attribut implementiert @Embeddable Referenzierte Attribut Server Client HTTP Data Management Layer DB Abbildung 3 Tabelle 1 JPQL Java Persistence Query Language ist eine mächtige Abfragesprache mit der Joins, Aggregationsfunktion, Gruppierung, Sortierung und Subqueries möglich sind. Standardabfragesprache für JPA. @Entity public class Saenger { private int id; private String name; public Saenger() { } // Vorgabe public Saenger(int id, String name) { this.id = id; this.name= name; } @Id @GeneratedValue public int getId(){ return this.id; } Literatur: [1] „Kris Zyp, NoSQL Architecture“, 2010, Online; 14.12.2011 http://www.sitepen.com/blog/2010/05/11/nosql-architecture/ [2] „CouchDB“, 1. Auflage, Galileo Press 2011. [3] „HTTP Database Connector (HDBC): RESTful Acces to Relational Databasses“, 2010, Online; 15.12.2011 http://dret.net/netdret/docs/wildewww2010-restful-sql.pdf [4] „Die Java Persistence API „ 2007, Online; 19.12.2011 http://www.sigs.de/publications/js/2007/02/ghadir_pagop_JS_02_07.pdf public String getName() { return this.name; } public void setName(String name) { this.name = name } } 2 http://www.se.uni-hannover.de Stand: 04.01.2012