Relationale Datenbanken im Vergleich zu objektorientierten Datenbanken
Wir schauen uns den Vergleich zwischen relationalen und objekt-orientierten Datenbanken genauer an und ziehen ein Fazit.
Top!
Hello
Wir schauen uns den Vergleich zwischen relationalen und objekt-orientierten Datenbanken genauer an und ziehen ein Fazit.
Als traditionelle Datenbanken werden relationale Datenbanken (RDB) bezeichnet. Die einfache Strukturierung in Tabellen, auch Relationen genannt, hat diesen Datenbanktyp vor allem in Administrativen Bereich beliebt gemacht. Dies wurde mit einer eingeschränkten Strukturierung der Daten, sowie einer begrenzten Anzahl an Operationen erzielt. Diese Limitierungen sind Voraussetzungen, um die Daten mit Structured Query Language (SQL) zu bearbeiten. In SQL gibt es als Datentyp Zeichenketten, Numerische Werte, Datum und Uhrzeit. Heutzutage werden auch große binäre Datenobjekte (BLOB) wie in MySQL unterstützt.
Anfang der 80er kamen jedoch Unzugänglichkeiten für komplexe Anwendungen, wie Multimedia Anwendungen, auf [1]. Die Probleme bestanden darin komplexe Objektstrukturen abzubilden oder wie das Speichern von Multimedia Daten und nicht-anwendungsspezifische Operationen zu definieren. Objektorientierte Datenbanken (OODB) sollten diese Probleme lösen. Die zunehmende Verwendung von Objektorientierten Programmiersprachen und die Möglichkeit diese, um eine DB zu erweitern, haben die Entwicklung von OODB unterstützt.
In OODB können Attribute und Operationen in der Objektklassendefinition gekapselt werden. Das heißt, oft werden Operationen, die ein Objekt verändern, gekapselt. Zudem werden auch Vererbung und Operatorüberladung unterstützt.
In Gegensatz zu Tabellen in einer RDB werden Objekte persistiert. Um ein Objekt abzuspeichern sollte es eine eindeutige Objektidentifikation besitzen und alle referenzierten Objekte eines persistenten Objektes müssen ebenfalls persistent sein. Der Objektidentifikator ist vergleichbar mit dem Primärschlüssel in relationalen Datenbanken. Auch wenn eine Objekt-ID, wie in der OODB Realm nicht vorgeschrieben ist, vereinfacht diese die Suche und wird beim Aufrufen der Upsert Methode benötigt. Die Methode Upsert überprüft, ob ein Objekt existiert und führt entweder ein Update oder Insert aus.
Eine weitere beliebte OODB ist ObjectBox, diese bezeichnet sich zudem als NoSQL Datenbank. Also eine Datenbank die keinen relationalen Ansatz verfolgt. In einem einfachen Beispiel soll hier die mögliche Vererbung mit Hilfe von einer OODB gezeigt werden.
Code-Snippet 1.1: Basisklasse in Objectbox:
@BaseEntity
abstract class Dinosaur {
@Id
var id: Long = 0
var name: String? = null
var length: Int? = null
var weight: Int? = null
constructor()
constructor(name: String?, length: Int?, weight: Int?) {
this.name = name
this.length = length
this.weight = weight
}
abstract fun getNutrition(): List<*>
}
In dem obigen Code Snippet 1.1, in der Programmiersprache Kotlin, wird eine Abstrakte Klasse „Dinosaurier“ definiert. Von dieser Basisklasse können dann z.B. „Pflanzenfresser“ siehe Snippet 1.2 oder „Fleischfresser“ erben. Die Klasse „Pflanzenfresser“ hat dann noch zusätzlich ein Attribut „Ernährung“ mit „Pflanzen“.
Code-Snippet 1.2: Objekt Pflanzenfresser das von der Basisklasse Dinosaurier erbt mit einer Referenz auf eine Liste von Pflanzen als Nahrung:
@Entity
class Herbivore: Dinosaur {
lateinit var nutritionList: ToMany<Plant>
constructor()
constructor(name: String, laenge: Int, gewicht: Int)
: super(name, laenge, gewicht)
override fun getNutrition(): List<Plant> {
return nutritionList
}
}
@Entity
data class Plant(
@Id
var id: Long = 0,
var name: String? = null
)
Ein Objekt kann dann mit einer Box persistiert werden, siehe Code-Snippet 1.3. Eine Box wird in ObjectBox Kontext benötigt, um Objekte von einem Typ zu holen oder zu persistieren. Aktuell gibt es keine Unterstützung für Abfragen mit einer Basisklasse, um erbende Klassen zu erhalten. Relationen in der Basisklasse werden zudem auch nicht unterstützt. In dem Beispielen, könnte die Klasse „Dinosaurier“ also keine Liste für die Ernährung haben.
Code-Snippet 1.3: Beispiel Persistierung von einem Objekt in ObjectBox:
val dinosaursBox = ObjectBox.store.boxFor(Herbivore::class.java)
val brachiosaurus = Herbivore("Brachiosaurus", 23, 28)
brachiosaurus.nutritionList.addAll(listOf(Plant(name = "Farn"), Plant(name = "Moos")))
dinosaursBox.put(brachiosaurus)
In Room, einer modernen RDB, wird eine Abbildung von einer Tabelle auf ein Objekt mit einer Entity Annotation genutzt. Room unterstützt SQL-Abfragen, während ObjectBox eine eigene Query API nutzt. Auch Vererbung ist in Room möglich. Es bietet sich auch an, ein Interface zu definieren, um später ein anderes Datenbanksystem zu unterstützen.
Die Entscheidung welche Datenbank für eine Anwendung gewählt werden soll, hängt unter anderem ab von: