Lerne Coding
SQL-Datenbanken - Ein Einstieg für Anfänger
25.05.2020

Was ist eine Datenbank und wozu brauche ich diese?

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. Minuten

So ziemlich jeder professionelle Backend-Entwickler wird im Laufe seines Arbeitsalltags einmal das Vergnügen haben, Daten aus einer Datenbank abfragen zu dürfen. Es ist nicht nur leichter mit der einfachen Structured Query Language (SQL) gewisse Datensätze von einer dafür optimierten Serversoftware abfragen oder abändern zu können, es ist Dank optimierter Prozesse auch performanter als eigenständig eine Text- oder JSON-Datei einzulesen und zu parsen*, besonders wenn die Datenmengen immer größer werden und die Performance, z.B. bei Webseiten, entscheidend ist.

* parsen = per PHP auf die einzelnen Elemente zugreifen zu können

Zum Beispiel lohnt es sich für folgende Systeme eine Datenbank zu verwenden:

  • Webseiten mit Nutzerprofilen
  • Webseiten, welche Statistiken verwenden, die sich ändern können (bspw. Fußball Bundesliga)
  • Administrative Systeme (z.B. Content-Managment-Systeme oder auch Verwaltungsportale wie z.B. ein Krankmeldungssystem)

Praktisches Beispiel

Stell dir vor, du hast rund 1.000 Nutzer in deinem System, es werden täglich mehr und bisher haben rund 15% davon noch nicht ihre Email verifiziert. Du bist aber an einer verifizierten Email-Adresse interessiert, damit du den Nutzer über aktuelle Geschehnisse informieren und ihm Emails mit personenbezogenen Daten zukommen lassen kannst. Deshalb entscheidest du dich dazu, am Ersten jedes Monats allen Nutzern, welche ihre Email noch nicht bestätigt haben, eine Email zu schreiben und sie zur Verifizierung aufzufordern. Nachdem die Email bestätigt wurde, soll das im Profil gespeichert werden, um diesem künftig auch vertrauliche Daten zukommen zu lassen. Darüber hinaus aber auch, um dem Nutzer weitere Vorteile auf deiner Webseite ermöglichen zu können (mehr Funktionen).

Aus dieser Aufgabenstellung erhalten wir nun folgende technische Informationen:

  1. Wir müssen alle Namen, Geschlechter (für die Anrede) und Email-Adressen unbestätigter Nutzer herausfinden, um ihnen automatisiert eine Email schreiben zu können.
  2. In der Email soll ein Link enthalten sein. Wenn der Nutzer auf diesen klickt, soll der Account sofort ohne Login bestätigt sein. Dazu müssen wir den Account z.B. durch eine ID oder eine UUID eindeutig identifizierbar machen, sowie einen Token übergeben, damit der Nutzer die Seite nicht bruteforced (also solange zufällige Anfragen schicken kann, bis er zufällig den Account verifiziert, obwohl ihm die Email gar nicht gehört) und seinen Account verifizieren kann.
  3. Nachdem wir den Datensatz gefunden haben, soll im Profil ein Boolean von false auf true gesetzt werden, damit wir dem Nutzer zukünftig auch Emails mit vertraulichen Daten schicken können.

Nehmen wir mal an, du hast dich aktuell nun für JSON als Datenspeicherungsmethode entschieden, da du so direkt als Array auf die Daten zugreifen kannst. Das würde für dich nun Folgendes bedeuten: Du musst einmal im Monat (bestenfalls nachts, weil eine Anfrage abraucht, wenn du gleichzeitig auf die JSON-Datei zugreifst) alle Datensätze aus deiner JSON-Datei einlesen und auf unbestätigte Email-Adressen prüfen. Außerdem den Namen, die Anrede und die Emailadresse entweder in ein weiteres Array speichern oder die Mailfunktion in die JSON-Array-Schleife implementieren (einbauen). Das hört sich im ersten Moment für Anfänger machbar an, ein Profi würde dir jedoch diese Lösung um die Ohren hauen.

Warum?

Du hast zum einen den zeitlichen Aufwand, den du brauchst, um diese Abfrage selbst zu implementieren (mehr unnötige Kosten für den Kunden); du hast mehr Zeilen Code, weil du diese Anfrage nicht wegzentralisieren kannst (das wird mit zunehmender Professionalität auch immer wichtiger wegen des Wartungsaufwands) und es besteht die Chance, dass du eine Sicherheitslücke oder einen möglichen Fall nicht abgefangen hast und damit dein System crasht (Extremfall). Sollte das passieren, müsstest du dich erst wieder in deinen Code einlesen, um zu überprüfen, was du da gemacht hast - und das dauert dann auch wieder effektiv Zeit und somit unnötiges Geld für den Kunden.

Doch das ist noch nicht einmal das Schlimmste!

Mit zunehmenden Nutzerzahlen wird deine Datei immer größer und es müssen für die gleiche Aktion immer mehr unnötige Datensätze geladen und verarbeitet werden. Wenn du 10, 20 Nutzer hast, solltest du dabei nichts bemerken. Sollte aber deine Seite über 3 Sekunden jedes Mal an Ladezeit brauchen, verliert der Nutzer schnell das Interesse und möchte deine Plattform nicht mehr nutzen. "Game Over". Den Kunden siehst du nicht mehr wieder!

In den folgenden Abschnitten werden wir uns deshalb damit auseinandersetzen, wie man eine Datenbank anhand vom Beispiel PHP anlegen und mithilfe der PHP Library PDO eine Verbindung zu dieser aufbaut. In einem weiteren Artikel, welcher dann am Ende verlinkt ist, erkläre ich dir, wie die SQL-Query-Sprache funktioniert und wie du damit mit der Datenbank über Befehle interagieren kannst.

Welche Datenbanken gibt es und wie installiere ich diese?

Die bekannteste Datenbank ist die Open-Source-Datenbank MySQL, welche aktuell der Firma Sun Microsystems (aka Oracle; die Jungs und Mädels die Java entwickeln) gehört. Sie ist einfach zu installieren, ist im vollen Umfang für dich kostenlos und Dank der Oberfläche PHPMyAdmin auch für Anfänger ohne Kommandozeile leicht zu administrieren. Solltet ihr bereits PHP programmiert haben und dafür Xampp (Mamp oder Lamp) verwendet haben, dann ist die MySQL-Datenbank bei euch bereits installiert und ihr müsst diese Software nur noch ausführen. Solltet ihr einen eigenen Linux Server oder PC besitzen, könnt ihr euch die Software auch bequem von einem Paketmanager eurer Wahl oder über einen Installer auf der Herstellerseite installieren.

Die zweite Datenbank, auf die ich auch noch kurz eingehen möchte, ist SQLite. SQLite ist eine Datenbank, welche komplett ohne Installation verwendet werden kann und die Daten in eine Datei in eurem Projektpfad speichert. Dadurch könnt ihr Datenbanken einfach anpassen, weitersenden oder bspw durch Git versionieren. Im Gegensatz zu einer Text- oder JSON-Datei müsst ihr euch um diese ebenfalls nicht kümmern, da es für so ziemlich jede Sprache eine eigene Bibliothek gibt, welche diese Aufgabe für euch übernimmt. Wann macht SQLite Sinn? Wenn ihr eine Datenbank für eine Desktop-Anwendung benötigt bspw. wenn ihr eine Anwendung mit Electron, Python, Java, C#, C++ oder C für den Anwender erstellt oder - falls ihr unbedingt wollt - im Web, wenn ihr dort keine wichtigen Kunden oder Userdaten speichert sondern statische Werte. Generell würde ich euch im Web jedoch eine MySQL-Datenbank empfehlen, da diese sicherer ist und euch mehr Möglichkeiten bei der Datenspeicherung zur Verfügung stellt.

Eine neue Datenbank in MySQL erstellen

Bevor du mit einer Datenbank kommunizieren kannst, musst du logischerweise erst eine neue Datenbank anlegen. Bei MySQL kannst du diese bei PHPMyAdmin über den Knopf "Neu" links oben erstellen und ihr einen Namen geben. Ich benenne meine "my_onlineshop". Generell könnt ihr eure Datenbank nennen wie ihr wollt, es dürfen nur keine Großbuchstaben, Leerzeichen, Punkte, Kommata oder Semikola enthalten sein und deutsche Sonderzeichen wie "äöüß" bestenfalls vermieden oder durch "ae", "oe", "ue" oder "ss" ersetzt werden. Eine gute Möglichkeit mehrere Wörter in den Datenbanknamen zu bekommen, ist die Verwendung von Unterstrichen.

Eine neue Tabelle erstellen

Ähnlich wie es einigen evtl. schon durch MS-Excel oder MS-Access vertraut sein dürfte, haben wir mit der Datenbank eine Tabellensammlung erstellt (= neue .xlsx Datei). Sollte dein Server die Daten mehrerer Programme enthalten, kannst du diese durch die verschiedenen Datenbanken logisch unterteilen und anhand der Tabellen unterschiedliche Daten für ein Projekt separat erfassen und speichern. Ich erstelle nun eine neue Tabelle namens "artikel" und bestätige mit dem okay-Button im blauen Kasten darunter rechts. Nun sehe ich folgende Ansicht:

Neue Tabelle Erstellen
Neue Tabelle Erstellen

Nun kannst du hier deine Spaltennamen und -typen für deine Tabelle definieren. Deine Datensätze werden anschließend als Zeilen untereinander gespeichert. Solltest du eine neue Spalte brauchen, kannst du oben neben dem Tabellennamen die Anzahl deiner zusätzlichen Spalten angeben und okay klicken um diese hinzuzufügen. Solltest du zu viele erstellt haben, lasse den Namen frei und sie werden nicht übernommen.

Typisierung der Datentypen

Je nach Programmiersprache(n), welche du bereits erlernt hast, hast du dich mit Typisierung bereits auseinandergesetzt - oder eben auch nicht. Kurzer Exkurs: Unterschiedliche Daten können mit unterschiedlich viel Speicherplatz gespeichert werden, um so Speicherplatz (und damit Performance) einzusparen, indem unrealistische Werte nicht darstellbar gemacht werden. Beispielweise musst du einen Boolean (ein Boolean kann nur 1 für true oder 0 für false sein) nicht als Integer speichern, da sonst die restlichen rund 4,3 Millionen Zahlen niemals verwendet werden können (oder zumindest sollten). Ich habe dir einmal die wichtigsten Datentypen zusammengefasst:

Thema der Tabelle "Die wichtigsten SQL-Datentypen"
Datentyp Größe Anwendungsbeispiel
Boolean (Wahrheitswert) (Alias für Tinyint. Alles, was nicht null ist, ist true) Hat der Kunde bereits bezahlt? → (true / false)
Tinyint (kleine Ganzzahlen) 1 Byte (255 Ganzzahlen -128 bis 127) Jeder 10. Einkauf wird kostenlos versendet
Integer (Ganzzahl) 4 Byte (~4,3 Millionen Ganzzahlen -2.147.483.648 bis 2.147.483.647) Anzahl aller Bestellungen insgesamt
Double (Fließkommazahl) 8 Bytes (egal, was du machst, es wird ausreichen) Erzielter Gewinn durch den Kunden
Varchar (Textwerte oder kürzere Texte) variable Größe (maximal 255 Zeichen lang) Name und Anschrift des Kunden
Text (für längere Texte) variable Größe (egal, was du machst, es wird ausreichen) Die Lebensgeschichte des Kunden
Date (Datum) 3 Bytes ("YYYY-MM-DD") Datum, wann der Kunde das letzte Mal bei uns gekauft hat
Datetime (Datum + Uhrzeit) 8 Bytes ("YYYY-MM-DD hh:mm:ss") Datum, wann der Kunde seinen Account erstellt hat

Weitere Datentypen findest du hier (https://www.schmager.de/mysql.php).

Datensatz eindeutig identifizierbar machen mit Auto Inkrement

Tipp vom Profi: Erstelle in jeder Datenbank eine eindeutige ID, die es nur einmalig gibt, sodass man den Datensatz anhand dieser eindeutig identifizieren kann. Die eindeutige ID könnte man dann zum Beispiel auf der Seite via GET-Variable übergeben, damit die genaue Produktbeschreibung für dieses Element geladen und nicht gesucht werden muss. Das Hochzählen übernimmt sogar freundlicherweise die Datenbank! Erstelle dazu als erste Spalte "id" und weise dieser die Checkbox "A_I" zu. AI steht für Auto Inkrement, also zu Deutsch: Automatisches Hochzählen. Zudem schützt die Datenbank dann diesen Wert durch den Primary Key (das Popup einfach mit Ja beantworten), welcher dann nicht doppelt vergeben werden kann.

Die Spalten Übersicht der Werte
Die Spalten Übersicht der Werte

Wenn du deine Spalten alle erstellt hast, klicke auf "okay" und deine Datenbank wurde angelegt. Wenn dein Fenster so aussieht, hast du alles richtig gemacht.

PHPMyAdmin Spalten Übersicht
PHPMyAdmin Spalten Übersicht

Um nun neue Datensätze in deine Datenbank einzufügen, klicke links bei deiner Auswahl der Datenbank auf deine eben erstellte Datenbank und anschließend auf "einfügen".

Wenn du nun links auf das Plus neben deiner Datenbank klickst, kannst du deine Tabelle sehen und bei einem Klick darauf dann auch den Inhalt deiner Datenbank.

SQL Spalten Übersicht
SQL Spalten Übersicht

In meinem Onlineshop könnte man nun den besagten Artikel XY und Klopapier kaufen. Den Eintrag mit dem Klopapier habe ich heimlich davor erstellt. 😉

Eine neue Datenbank in SQLite erstellen

Es ist nicht möglich, SQLite über PHPMyAdmin zu verwalten. Deswegen würde ich dir empfehlen, dafür das Programm "Sqlite Browser" zu installieren. Den Sqlite-Browser kannst du standardmäßig installieren. Falls du möchtest, kannst du aber auch die verschlüsselte Version nehmen. Hast du das gemacht und das Programm auch gleich mit gestartet, sollte dein Programm ungefähr so aussehen:

SQLLite Browser
SQLLite Browser

Nun legen wir eine neue Datenbank an. Links oben unter dem Menü siehst du den Button "Neue Datenbank". Nun erstellst du eine neue Datenbankdatei, welche du bestenfalls in deinem Projektordner speicherst. Anschließend erscheint ein Fenster, in dem wir unsere Spalten anlegen können. Worauf du achten musst und welche Datentypen es gibt, habe ich dir eben am Beispiel von MySQL erklärt. Jedoch wirst du nicht alle Datentypen wie bei MySQL verwenden können, da es sich auf eine geringere Auswahl beschränkt. Unter dem Kasten, in dem du deine Spalten anlegen kannst, findest du eine Anzeige mit dem SQL-Statement, den die SQLite-Bibliothek braucht, um die Datenbank korrekt anzulegen.

SQL Lite Tabelle Erstellen
SQL Lite Tabelle Erstellen

Ist deine Tabelle dann angelegt, können wir über "Daten durchsuchen" eine neue Zeile erstellen und rechts den Inhalt der Zelle bearbeiten. Bist du fertig, klicke auf "übernehmen" und deine Änderung wird übernommen.

SQL Lite Werte Anlegen
SQL Lite Werte Anlegen

Ist deine Datenbank fertig befüllt und du möchtest sie mit einer Programmiersprache verwalten, klicke auf "Speichern", speichere die .db-Datei und schließe anschließend das Programm, damit die Datei vom Dateistream des Programms zu lesen und schreiben freigegeben wird.

Eine Verbindung zur Datenbank mit PHP herstellen

Jetzt sind Grundkenntnis in PHP und der Objektorientierung gefragt! Solltest du diese noch nicht verstanden haben, würde ich dich darum bitten, sie nochmals zu verinnerlichen, BEVOR du dieses Tutorial weiter verfolgst. PDO ist eine von PHP vordefinierte Klasse, welche von uns nun instanziiert wird und als Übergabeparameter die Logindaten unserer Datenbank bekommt. Bei SQLite geben wir stattdessen den Dateipfad an.

Mit MySQL Datenbank verbinden

<?php
    $mysql_addr = "127.0.0.1";
    $mysql_user = "root";
    $mysql_pass = "";
    $mysql_database = "testdatabase";
    $pdo_mysql = new PDO('mysql:host='.$mysql_addr.';dbname='.$mysql_database, $mysql_user, $mysql_pass);
?>

Mit SQLite Datenbank verbinden

<?php
    $sqlite_filepath = "/link/zur/Datei.db";
    $pdo_sqlite = new PDO('sqlite:'.$sqlite_filepath);
?>

Prüfen, ob die Verbindung erfolgreich erstellt werden konnte

Zur Überprüfung, ob eine Verbindung hergestellt werden konnte oder nicht, verwenden wir ein Try Catch Block. Solange keine Fehlermeldung vom System ausgegeben wird, wird der Try-Block ausgeführt, aber falls die Verbindung verunglücken sollte, wird der Try Block sofort beendet und der Catch Block wird weiter ausgeführt. In diesem Fall habe ich mich dazu entschieden, bei einer fehlerhaften Datenbankverbindung mein Programm mit dem jeweiligen Fehlercode zu beenden. Sollte die Verbindung erfolgreich erstellt werden, wirft das System keinen Fehler und der Catch Block wird nicht ausgeführt. In meinem Fall könnte ich nun unter dem Catch Block meine SQL-Abfragen problemlos durchführen.

<?php
try {
    // versuche die Verbindung aufzubauen
    $pdo_mysql = new PDO('mysql:host='.$mysql_addr.';dbname='.$mysql_database, $mysql_user, $mysql_pass);
} catch(Exception e) {
    // huch da ist er auf einen Fehler gestoßen

    // Programm beenden oder alternativ anderweitig abfangen
    die("Es konnte keine Verbindung zur Datenbank erstellt werden ->>> ".$e->getTraceAsString());;
}
// Verbindung zur Datenbank ist hergestellt 
// -> jetzt kann man mit der Datenbank kommunizieren
?>

Welche Befehle können wir an die Datenbank schicken?

Ich möchte nun nochmal die Grundfunktionalitäten einer Datenbank erklären. Ich werde in einem späteren Blogartikel aber darauf nochmal genauer eingehen und aufzeigen, welche Möglichkeiten es genau gibt.

Abfrage mit SELECT

Dank des SELECT-Befehls und der darauf folgenden optionalen WHERE-Bedingung können alle oder bestimmte Datensätze abgefragt und als Tabelle oder Array zurückgegeben werden. Bspw. gib mir alle Datensätze, wo der Nutzer in Deutschland wohnt. Diese kann man dann in der Programmiersprache seiner Wahl als Array durch eine for- oder foreach-Schleife durchjagen und dann durch den jeweiligen Array-Index (= Spaltenname) auf den Wert zugreifen.

SELECT * FROM tableneme WHERE spaltenname='Deutschland';

Daten aktualisieren mit UPDATE

Sollte ein Nutzer einen Wert ändern müssen, da er z.B. umgezogen ist, dann hilft die UPDATE-Funktion, mit der man einen speziellen oder mehrere Datensätze auf einmal updaten kann. Dabei muss nicht jeder Wert neu überschrieben werden, sondern man teilt der Datenbank lediglich mit, was sich verändert hat.

UPDATE länder SET is_eu=0 WHERE country_name="England";

Neue Datensätze hinzufügen mit INSERT

Sollte sich nun ein neuer Nutzer bei uns registrieren, müssen wir einen neuen Datensatz anlegen. Dazu verwenden wir INSERT: Um einen neuen Datensatz hinzufügen zu können, benötigen wir entweder einen Wert für alle Spalten oder wir müssen beim Anlegen der Datenbank Standardwerte angeben; bspw. setze das Datum last_update auf die aktuelle Zeit. Dann muss die Spalte last_update nicht übergeben werden (kann man aber trotzdem machen, das ist kein Fehler).

INSERT INTO tabelle ('name','klasse','datum') VALUES ("Max Mustermann", "1A", '2020-03-20');

Alte Datensätze löschen mit DELETE

Könnte gerade jetzt, nachdem vor 4 Jahren die DSGVO (DatenSchutzGrundVerOrdnung) in Kraft gesetzt wurde, interessant werden, da so bspw. Nutzer sagen können: Ich möchte, dass mein Account mit allen persönlichen Daten von mir gelöscht wird. Diese Funktion ist aber mit Vorsicht zu genießen, weil man sich auch durchaus versehentlich sehr leicht die ganze Datenbank ohne WHERE-Bedingung zerschießen kann.

DELETE FROM tabelle WHERE name="Max Mustermann";

Fazit

Eine Datenbank ist eigentlich immer dann sinnvoll, wenn einfach und performant Daten verwaltet werden müssen, um einen Service zur Verfügung stellen zu können. Das heißt jedoch nicht, dass JSON, XML und Co. allgemein schlecht sind. Diese Formate können verwendet werden, um Daten zwischen zwei Datenbanken oder als Ausgabe für den Nutzer (also als Datei zum Download) zu dienen. Ich hoffe, dir hat diese kleine Einleitung gefallen und du beschäftigst dich auch weiterhin mit dem Thema. Solltest du Fragen oder Anregungen zum Thema haben, besuche gerne unser Discordforum oder hinterlasse uns einen Kommentar. Ansonsten wünsche ich dir viel Spaß beim Tüfteln!

Bildquelle - Vielen Dank an die Ersteller:innen für dieses Bild
Kommentare zum Artikel

Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "SQL-Datenbanken - Ein Einstieg für Anfänger"!

Kommentar schreiben

Vom Autor Empfohlen
close