Die Kombination von MySQL und der C-API ist ein sehr reizvolles, aber leider auch selten behandeltes Thema. Dieses Kapitel sorgt für Abhilfe und bietet Ihnen eine Einführung in MySQL und die C-API.
24 MySQL und C
Hinweis |
Dieses Kapitel kann ein vollwertiges MySQL-Buch nicht ersetzen. Das Thema MySQL ist zwar nicht unbedingt kompliziert, aber der Umfang ist gewaltig. Einige Funktionen der C-API oder MySQL-Sprachelemente werden deshalb hier nicht erwähnt. Hier empfehle ich Ihnen die offizielle Dokumentation von MySQL (Webseite: http://dev.mysql.com/doc/). |
24.1 Aufbau eines Datenbanksystems
Dieser Abschnitt ist sehr wichtig, sofern Sie noch keinerlei Erfahrungen mit Datenbanksystemen gemacht haben. Hier werden die grundlegenden Prinzipien von Datenbanken erklärt.
Als C-Programmierer werden Sie sich fragen, »Warum benötige ich eine Datenbank? Ich kann doch einfach ein Programm unter Verwendung von binären Bäumen entwickeln, womit die Nutzung einer Datenbank überflüssig wird.« Und Sie werden sich wundern – vereinfacht arbeitet MySQL auch so, nur mit einer anderen Beziehung: einer relationalen. Sicherlich, das könnten Sie auch programmieren, schließlich wurde MySQL in der Programmiersprache C geschrieben. Wozu sollten Sie aber das Rad neu erfinden? Außerdem erweist es sich als recht schwieriges Unterfangen, ein eigenes relationales Datenbankprogramm zu schreiben.
24.1.1 Warum wurde ein Datenbanksystem (DBS) entwickelt?
Vor der Zeit der Datenbanken wurden Daten mit selbst entwickelten Programmen in Dateien gespeichert. Diese Programme waren zumeist an die Bedürfnisse einer Firma bzw. eines Anwenders angepasst. Schlimmer noch, teilweise wurden die Programme für die einzelnen Abteilungen bis hin zum einzelnen Mitarbeiter konfiguriert. Probleme waren dabei vorprogrammiert: Herr Meier konnte nicht auf die Datei »x« zugreifen, die Herr Müller erstellt hatte, da Herr Meier im Gegensatz zu Herrn Müller ein modifiziertes Programm besaß.
In diesem Fall hatte Herr Meier zwei Möglichkeiten: Entweder er ließ das Programm vom Programmierer wieder anpassen (das war noch die Blütezeit für Programmierer, als immer Arbeit vorhanden war) oder er ging zu Herrn Müller, um sich von diesem die Daten zu besorgen. Doch als Herr Müller den Datensatz abrufen wollte, fand er ihn nicht mehr. Nach einigen Recherchen stellte sich heraus, dass Frau Schneider diesen Datensatz gelöscht hatte, da sie dachte, er würde nicht mehr benötigt.
Da beim Zugriff auf gemeinsame Daten (auch File Sharing genannt) ein enormer Wartungsaufwand entstand, was häufig zu hohen Kosten führte, wurden Datenbanksysteme entwickelt. Ein Datenbanksystem hat gegenüber dem traditionellen Dateisystem die folgenden Vorteile:
- Der Benutzer kann auf die Daten zugreifen, ohne dass er wissen muss, wie die einzelnen Daten organisiert sind.
- Der Benutzer kann (fast) ohne Kenntnisse Daten löschen, hinzufügen, ändern oder erweitern. Der Benutzer muss nicht einmal wissen, um welche Datenbank es sich handelt.
- Das Datenbanksystem sorgt dafür, dass ein unbedachter Benutzer Daten nicht einfach löschen kann oder doppelte Daten zweimal gespeichert werden.
- Ein gutes Datenbanksystem ist portabel. Das bedeutet, das System organisiert den Datenbestand so, dass andere Programme und Systeme mithilfe von Schnittstellen auf diese Daten zurückgreifen können.
- Datensätze werden so optimiert, dass sie geringeren Speicherplatz erfordern und eine schnellere Zugriffszeit haben.
24.1.2 Das Datenbank-Management-System (DBMS)
Das Datenbank-Management-System (kurz DBMS) ist die Schnittstelle, mit der der Benutzer Mittel zu Verfügung gestellt bekommt, um mit der Datenbank zu kommunizieren. Durch das DBMS wird beim Ändern, Hinzufügen, Löschen oder Erweitern immer die Korrektheit der Datenbestände überprüft. Greift der Benutzer zum Beispiel auf einen Datensatz in der Datenbank zurück, wird zuerst nach einem gewissen Schema des DBMS auf den Datenbestand zugegriffen. Anschließend werden dem Benutzer diese Daten so serviert, wie er sie sich von der Anforderung wünscht. Dadurch entsteht eine Art Datenunabhängigkeit, die in einem DBMS deshalb so wichtig ist, weil dadurch die physische Speicherung einer Datenbank beliebig geändert werden kann, ohne die logische Struktur der Daten zu verändern.
In Abbildung 24.1 können Sie das Drei-Schichten-Modell erkennen. Um es kurz zu halten: Es handelt sich dabei schlicht um die Trennung von Benutzer, DBMS und Datenspeicherung. Die externe Schicht beschreibt alle Möglichkeiten, die der Benutzer hat, um auf die Datenbank zuzugreifen (Programme, Funktionen und Schnittstellen). Die konzeptionelle Schicht beschreibt das Datenmodell (hier das relationale Modell). Mit diesem Modell wird beschrieben, wie auf die Daten zugriffen wird und in welchem Zusammenhang diese zueinander stehen. Die interne Schicht ist die tiefste Schicht und stellt die Ebene der Datenpräsentation dar – also, wie und wo die Daten gespeichert werden.
Abbildung 24.1 Die drei Ebenen eines Datenbanksystems
Noch ein paar Sätze zur logischen Struktur: Als C-Programmierer kennen Sie ja Strukturen. Folgende Struktur dient jetzt als Beispiel:
struct file{ char name[MAX]; char vame[MAX]; int old; struct file *l; struct file *r; };
Das Programm mit dieser Struktur läuft jahrelang bei Ihrem Kunden mit unzähligen Adressen. Jetzt wünscht Ihr Kunde, dass Sie den Datenbestand für int old entfernen und zwei andere Strukturvariablen dafür einsetzen. Sie müssen jetzt das Programm umschreiben, müssen den Datenbestand neu anpassen, und noch einiges mehr ist dabei zu beachten – eine Menge Arbeit also. Mit dem DBMS lässt sich dies ohne Mühe mit ein oder zwei Befehlen erledigen.
Der Benutzer kommuniziert allerdings nicht direkt mit dem DBMS, sondern mit einer Schnittstelle, die sich noch vor dem DBMS befindet, dem DBCI (Data Base Communication Interface).
Sie können hier eindeutig das Client/Server-Prinzip wiedererkennen, wobei der Server-Teil sich um die Verwaltung und Verarbeitung von Daten kümmert und der Client-Teil mit dem Benutzer zu tun hat. Er gewährleistet die komfortable Eingabe, einfaches Auslesen und mehr. Abbildung 24.2 zeigt das Beispiel grafisch.
Abbildung 24.2 MySQL-Datenbanksystem
Der Client kann jetzt ein Webbrowser sein, der ein CGI-Programm startet, mit dem auf die Datenbank zugegriffen wird, eine Java-Applikation mit der Schnittstelle JDBC (Java Database Connectivity), ein C-Programm mit der ODBC-Schnittstelle (Open DataBase Connectivity), ein Perl-Skript mit dem DBI-Modul oder auch der Datenbank-Client mysql. Wie auch immer Sie auf das DBMS zugreifen, der Server verarbeitet die Anfrage des Clients und schickt gesammelte Daten an ihn zurück. Und die Sprache, mit der hier kommuniziert wird, heißt SQL (Structured Query Language). SQL ist eine genormte Datenbanksprache, die in der Regel jede Datenbank versteht. Es gibt natürlich auch Client-Programme, die Sie verwenden können, ohne ein Wort SQL zu verstehen. Das Client-Programm sorgt in diesem Fall für die Kommunikation zwischen Server und Benutzer. Als ein C-Programmierer sollte es Ihr Ziel sein, ein solches Client-Programm zu entwickeln.
24.1.3 Relationale Datenbank
MySQL ist eine Datenbank, die auf dem relationalen Konzept aufbaut. Das bedeutet, dass zwischen den Daten, die in Tabellen gespeichert werden, bestimmte Beziehungen bestehen. Sie können die Daten mit Zusammenhängen zu anderen Daten speichern.
Hinweis |
Die Daten einer Datenbank stehen in einer Tabelle mit Zeilen und Spalten. Eine Datenzeile wird dabei als Datensatz bezeichnet. |
Folgende Beziehungen sind jetzt zwischen verschiedenen Datensätzen möglich:
Beziehung | Bedeutung |
1:1-Beziehung |
Bei der 1:1-Beziehung zwischen Datensätzen wird nur ein Datensatz mit einem anderen verbunden. |
1:n- und n:1-Beziehung |
Die 1:n-Beziehung ist die gängigste Beziehung. Ein Datensatz kann so mit vielen anderen Datensätzen zusammengehängt werden. |
n:m-Beziehung |
Hierbei stehen mehrere Datensätze mit mehreren Datensätzen in Beziehung. |
Wenn Sie das relationale Konzept hier nicht so richtig verstanden haben, macht dies für den weiteren Verlauf des Buchs nichts aus. Es sollte nur der Vollständigkeit halber erwähnt werden.
24.1.4 Eigene Clients mit C für SQL mithilfe der ODBC-API entwickeln
In diesem Buch wird nur beschrieben, wie Sie eigene Clients für die MySQL-Datenbank mit der C-API (Application Programming Interface) schreiben können. Sie können zwar für jede Datenbank mit C eigene Client-Programme erstellen, nur liefert jede Datenbank dafür spezielle und leider unterschiedliche Funktionen. Wollen Sie Client-Programme schreiben, die mit jedem Datenbanksystem zusammenarbeiten, so benötigen Sie die ODBC-API, die eine reine C-Schnittstelle ist. Der ODBC-Treiber muss zuvor besorgt und installiert werden. Er klinkt sich dann zwischen die Client-Anwendung und das DBMS ein. Sendet der Client eine Anforderung an den Server, verarbeitet der ODBC-Treiber zuerst die Anfrage und gibt sie in entsprechender Form an den Server (DBMS) weiter, damit dieser die Anfrage versteht. Der Server antwortet anschließend dem Client, wiederum durch den ODBC-Treiber. Wenn Sie so wollen, dient ODBC also als Dolmetscher für verschiedene Datenbanken mit dem Client-Programm.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.