Warning: include_once(/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php): failed to open stream: No such file or directory in /var/www/html/fields/dbp15/local/config.php on line 4

Warning: include_once(): Failed opening '/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php' for inclusion (include_path='.:/opt/php/lib/php') in /var/www/html/fields/dbp15/local/config.php on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/fields/dbp15/local/config.php:4) in /var/www/html/pmwiki-2.2.86/pmwiki.php on line 1250
Datenbankpraktikum SS 2015 - D - Crud

CRUD Datenbankoperationen

Die CRUD Datenbankoperationen sind in Tabelle 1 aufgeführt.

OperationFunktionsaufrufBescheibung
Createinsert(Binärdaten)Erstellt einen neuen Datensatz
Readlookup(Bedingung): RowsLiest Datensätze
Updatemodify(Bedingung, neue Werte)Aktualisiert einen Datensatz
Deletedelete(Bedingung)Löscht einen Datensatz

Tabelle 1 CRUD Datenbankoperationen

Sie bilden die Grundoperationen der database engine. Über sie wird die Datenbasis gelesen, geschrieben und editiert. Drei der vier Operationen erwarten eine Bedingung. Dadurch können alle Datensätze beeinflusst werden, die die Bedingung erfüllen. Die Operationen agieren nur auf den Binärdaten. Um zu überprüfen, ob eine Bedingung erfüllt ist, muss bekannt sein, wie die binären Daten für einen Vergleich zu dekodieren sind. Die notwendige Information steckt im SQL-Typ der zu dem Datensatz gehörenden Tabelle. Im folgenden Abschnitt wird zuerst erklärt, wie eine Bedingung aufgebaut ist und was für SQL-Typen unterstützt werden. Im Anschluss folgen die Implementierungsdetails der CRUD Datenbankoperationen insert, lookup, modify und delete.

Bedingungen

Einer SQL Abfrage können Bedingungen mitgegeben werden, um nur bestimmte Datensätze zu selektieren bzw. zu modifizieren oder zu löschen. Auf der Ebene der FlatFile engine ist eine Bedingung ein Tripel, bestehend aus einem Spaltenindex, einem erwarteten Wert in Binärdaten und einem Vergleichsoperator. Der Spaltenindex adressiert das Feld in dem Datensatz, das mit dem erwarteten Wert übereinstimmend verglichen werden soll. Ob eine Bedingung für den Datensatz erfüllt ist, ist abhängig vom Vergleichsoperator. Es werden die Vergleichsoperatoren ==, !=, >, >=, <, <= unterstützt. Da die Daten nur in binärer Form vorliegen, müssen sie vor dem Vergleich in ihren nativen Datentyp umgewandelt werden. Diese Umwandlung erfolgt über den SQL-Typ der durch den Spaltenindex angegebenen Spalte.

SQL-Typen

Zu jeder Spalte einer Tabelle ist ein SQL-Typ hinterlegt. Dieser gibt an, wie die Daten der Spalte interpretiert werden sollen. Die FlatFile engine unterstützt aktuell die folgenden 3 Datentypen:

DatentypGröße [Bytes]
Int4
Bool1
1 * n1 * n, NUL terminiert

Lookup

lookup(Bedingung) -> Rows<Vec<u8>>

Signaturzeile der Lookup-Funktion

Über die Funktion lookup werden Datensätze aus der Datenquelle gelesen. lookup wird zusammen mit einer Bedingung aufgerufen und prüft jede Zeile in der Datenquelle, ob die Bedingung erfüllt ist. Das Ergebnis von lookup ist ein neues Rows-Objekt, dessen Daten im Arbeitsspeicher liegen. Durch Anwendung von lookup auf das neue Rows-Objekt können weitere Zeilen selektiert werden. Die sukzessive Anwendung von lookup auf die zurückgegebenen Rows-Objekte erlaubt somit die Selektion von Zeilen, die mehrere Bedingungen erfüllen. Wenn keine Bedingung angegeben wurde, wird anstelle von lookup full_scan ausgeführt. full_scan gibt ein Rows-Objekt mit allen Zeilen zurück.

Funktionsweise

PAP für Lookup
get_next_row(Bedingung) -> <Vec<u8>>

Signaturzeile der get_next_row-Funktion

Die Funktion get_next_row geht die Datenquelle Zeile für Zeile durch und gibt den ersten Datensatz zurück, der die Bedingung erfüllt. Mit der übergebenen Bedingung und dem Spaltenindex kann die Funktion get_value aufgerufen werden. Die Funktion liefert den entsprechenden Wert der zu lesenden Zeilen zurück. Jetzt kann die compare-Funktion des SQL-Typens zur Überprüfung der Bedingung benutzt werden. Jede zurückgegebene Zeile wird in lookup einem Vektor hinzugefügt, welcher, wenn das Ende der Datenquelle erreicht wird, als Datenquelle für ein neues Rows-Objekt dient.

Laufzeit

Da die gesamte Datenquelle durchlaufen wird, ergibt sich eine Laufzeit von O(n) (n: Größe der Datei).

Insert

insert_row(Datensatz) -> Anzahl geschriebener Bytes;

Signaturzeile der Insert-Funktion

Über die Funktion insert werden neue Datensätze zu der Datenquelle hinzugefügt. Ein Datensatz ist ein Vektor aus Binärdaten. Der Primärschlüssel des Datensatzes muss in der Datenquelle eindeutig sein. Vor dem Einfügen muss also geprüft werden, ob der Primärschlüssel bereits in der Datenquelle vorhanden ist. Neue Datensätze werden zusammen mit dem Zeilenkopf am Ende der Datenquelle eingefügt.

Zurückgegeben wird die Anzahl der geschriebenen Bytes.

Prüfung des Primärschlüssels

Für die Prüfung eines Primärschlüssels muss die gesamte Datenquelle durchlaufen werden. Für jede Zeile wird geprüft, ob der übergebene Primärschlüssel dem der Zeile gleicht. Im Konfliktfall wird ein Fehler zurückgegeben, sonst kann die Zeile eingefügt werden.

Laufzeit

Da jede Zeile der Datenquelle geprüft werden muss, ergibt diese Operation eine Laufzeit von O(n) (n: Größe der Datei).

PAP für das Insert im FlatFile

Delete

delete(Bedingung) -> Anzahl gelöschter Zeilen

Die Funktion delete wird zusammen mit einer Bedingung aufgerufen. Wieder muss für jeden Datensatz in der Datenquelle geprüft werden, ob die Bedingung erfüllt ist. Eine Zeile wird gelöscht, indem das Delete-Bit gesetzt wird.

Als Ergebnis wird die Anzahl der gelöschten Zeilen zurückgegeben.

Das physikalische Löschen von Datensätzen erfolgt über die Funktion Reorganize.

Funktionsweise

PAP für Delete

Dem lookup ähnlich durchläuft delete die Datenquelle mithilfe der Funktion get_next_row. Erfüllt ein Datensatz die Bedingung, wird das Delete-Bit im Zeilenkopf des Datensatzes gesetzt.

Laufzeit

Da die gesamte Datenquelle durchlaufen wird, ergibt sich eine Laufzeit von O(n) (n: Größe der Datei).

Reorganize

Durch die Verwendung eines Delete-Bits muss die Zeile nicht tatsächlich gelöscht werden. Die Zeit für einen Löschvorgang wird durch diese Implementation reduziert, da keine zusätzlichen Operationen notwendig sind um die Lücke des gelöschten Datensatzes in der Datei aufzufüllen. Um den Datensatz physikalisch zu entfernen, bietet die FlatFile engine die Funktion Reorganize. Reorganize geht die gesamte Datei durch und tauscht gelöschte Zeilen am Anfang der Datei mit nicht gelöschten Zeilen am Ende der Datei. Im Anschluss wird die Datei nach der letzten nicht gelöschten Zeile abgeschnitten.

Modify

modify(Bedingung, neue Werte) -> Anzahl modifizierter Zeilen

Signaturzeile der Modify-Funktion

Durch die Funktion modify können Datensätze, die eine bestimmte Bedingung erfüllen, verändert werden. Dazu durchläuft modify die Datenquelle und aktualisiert alle Datensätze, die die übergebene Bedingung erfüllen. Zurückgegeben wird die Anzahl modifizierter Zeilen. Eine Aktualisierung des Primärschlüssels wird nicht unterstützt.

Funktionsweise

PAP für Modify

lookup und delete ähnlich wird durch den Aufruf von modify die Datenquelle von vorne mit der Funktion get_next_row durchlaufen. Jede Zeile die von dieser Funktion zurückgegeben wird, wird im Arbeitsspeicher mit den neuen Werten modifiziert. Nun wird der entsprechende Datensatz in der Datenquelle mit der veränderten Kopie aus dem Arbeitsspeicher überschrieben.

Update des Primärschlüssels

Es wird kein update des Primärschlüssels unterstützt. Dazu müsste nämlich sichergestellt werden, dass es auch nach der Aktualisierung keine zwei Datensätze mit gleichem Primärschlüssel gibt. Da es kein Transaktionsprotokoll gibt, könnte die Aktualisierung im Konfliktfall nicht rückgängig gemacht werden. Dann lägen mindestens zwei Datensätze mit dem gleichen Primärschlüssel in der Datenbank vor.

Laufzeit

Da die gesamte Datenquelle durchlaufen wird, ergibt sich eine Laufzeit von O(n) (n: Größe der Datei).


Autor: Mathias Flüggen, Heiner Rieping
Gruppe: Mathias Flüggen, Dennis Lindner, Heiner Rieping


Page last modified on September 24, 2015, at 02:24 PM