Donnerstag, 4. April 2013

Neue Datenbank-API für ViUR

Für ViUR steht in Kürze eine neue Datenbank API zur Verfügung.
Nachdem wir mit ViUR Mitte 2012 von ext.db auf die ext.ndb API gewechselt hatten, um von den Geschwindigkeitsvorteilen durch das integrierte Caching zu profitieren, hatte sich in den letzten Monaten abgezeichnet, das NDB auf Dauer nicht die passende Datenbank-API für ViUR bilden kann:
  • Da ViUR auf eigenen Datenmodellen aufbaut, können die Modelle von NDB nicht verwendet werden. Daher konnte in ViUR nur ein kleiner Teil der Funktionalität von NDB verwendet werden.
  • In NDB werden Einträge über das Modul und nicht über das Modell abgerufen. Da ViUR die NDB-Modelle auf Basis der eigenen Datenmodelle zur Laufzeit erzeugen musste, führte dies zu Race-Conditions, bei denen auf neuen Instanzen der Anwendung Einträge abgerufen werden, deren Modell noch nicht erzeugt und somit der NDB-Api unbekannt waren.
  • NDB unterstützt zwar dynamische Modelle (expando), ist aber auf die Verwendung von Modellen optimiert. Die API von NDB erzeugt bei der Verwendung von dynamischen Modellen deutlich mehr Schreibaufwand (ohne weiteren Mehrwert) für den Entwickler:
    ext.db: query.filter("age >", 18)
    ext.ndb: query.filter( ndb.GenericProperty("age") > 18)
  • Inkonsistenzen zwischen ext.db und ext.ndb: Eine unerfüllbare Abfrage (z.B. age>10 and age<5) liefert in ext.db ein leeres Result-set, in ext.ndb eine Exception.

Daher haben wir für ViUR eine neue Datenbank-Schnittstelle für den Datastore entworfen. Unsere Datenbank-API setzt auf die (nicht offiziell dokumentierten) Schnittstellen des Packets google.appengine.api auf. Hierbei bietet unsere API einen low-level Zugriff auf die Datenbank, die anderen Dokument- oder Objektorientierten Datenbanken wie MongoDB ähnelt. Weiterhin bietet unsere API einen für den Entwickler transparenten (Mem-)Cache um häufig gestellte Anfragen schneller und kostengünstiger beantworten zu können.

Ein paar Beispiele:

entry = db.Entity("person")
entry["name"] = "Max Mustermann"
entry["age"] = 21
db.Put( entry )

query = db.Query("person")
query.filter( "age >", 18 )
results = query.run( limit=100 )

Tip: Unsere Datenbank-API ist nur sehr lose mit dem restlichen ViUR-System gekoppelt. Projekte, die nicht auf ViUR aufsetzen möchten, aber eine Dokument-Orientierte API für die Datenbank nutzen möchten, können diese API trotzdem verwenden.

Keine Kommentare:

Kommentar posten