Datenbanken

Defintion Datenbank:
Eine Datenbank kann als organisierte Datensammlung verstanden werden. Die Organisation der Daten umfasst deren Speicherung, Formatierung, Verwaltung, Zugriff, Manipulation und Darstellung.
Neben den textbasierten Datenbanken gibt es solche, die neben Text, auch Grafiken, Bilder, Audio, Video und zusammengesetzte Dokumente verwalten können.

1. Normalform

2. Normalform

3. Normalform

Grundbedingungen für den Aufbau von Datenbanken:
Die Daten müssen in kleinste Einheiten (atomore Wertebereiche) gebracht werden, dies geschieht dadurch, dass Daten in sogenannte Normalformen gebracht werden.
1. Normalform (1NF)
2. Normalform (2NF)
3. Normalform (3NF)
4. Normalform (4NF)
5. Normalform (5NF)

1. Normalform (1NF):
Jedes Attribut der Relation muss einen atomaren Wertebereich haben.
Das heisst, zusammengesetzte, Wertebereiche (Z.B. Vorname und Name) sind nicht erlaubt.

Negativbeispiel; 1NF verletzt
Automobile_GER
Manufacturer_ID Name Werk Jahr der Gründung Baureihe
0001 Audi Ingolstadt 1909 {A1, A3, A4}
0002 BMW München 1916 {1er, 3er}
0003 Mercedes-Benz Stuttgart 1926 {A-Klasse}

Das Feld Baureihe enthält eine Menge von Baureihen.

Dadurch hat man ohne Aufspaltung folgende Probleme bei Abfragen:
Die Baureihen können (mit einfachen Mitteln) nur alle gleichzeitig als Baureihenliste oder gar nicht dargestellt werden.

Lösung
Automobile_GER
Manufacturer_ID Name Werk Jahr der Gründung Baureihen_ID Baureihe
0001 Audi Ingoldstadt 1909 1 A1
0001 Audi Ingoldstadt 1909 2 A3
0001 Audi Ingoldstadt 1909 3 A4
0002 BMW München 1916 1 1er
0002 BMW München 1916 2 3er
0003 Mercedes-Benz Stuttgart 1926 1 A-Klasse

Zweite Normalform (2NF)
Eine Relation ist in der Zweiten Normalform, wenn sie in der Ersten Normalform ist und jedes Nicht-Schlüsselattribut von jedem Schlüsselkandidaten vollständig funktional abhängig ist.
4.4.2 Erklärung
Ein Attribut Y ist von einem Attribut X funktional abhängig, wenn es zu jedem X genau ein Y gibt.
Vollständig funktional abhängig bedeutet, daß das Nicht-Schlüsselattribut nicht nur von einem Teil der Attribute eines zusammengesetzten Schlüsselkandidaten funktional abhängig ist, sondern von allen Teilen.

Beispiel:
In der Reisekostentabelle sind die Attribute “Datum”, “Name”, “Vorname”, “Straße”, “PLZ” und “Ort” nur funktional abhängig vom Attribut “Rechnungsnummer” und völlig unabhängig vom Attribut “Kostenart”.
Das Attribut “Einzelvergütung” ist dagegen nur funktional abhängig von der “Kostenart” und hat nichts mit der “Rechnungsnummer” zu tun. Lediglich das Attribut “Anzahl” ist vom zusammengesetzten Primärschlüssel voll funktional abhängig.

Abhilfe:
Datenfelder, die von einem Schlüsselkandidaten (hier nur der Primärschlüssel) nicht vollständig funktional abhängig sind, werden in weiteren Tabellen untergebracht. Der Teil des Schlüsselkandidaten, von dem ein ausgelagertes Datenfeld funktional abhängig ist, wird Primärschlüssel der neuen Tabelle. Als Ergebnis erhalten wird die drei folgenden Tabellen.

Reise Rechnungsnummer Datum Name Vorname Straße PLZ Ort

Positionen Rechnungsnummer Kostenart Anzahl

Kostenarten Kostenart Einzelvergütung

Negativbeispiel; 2NF verletzt
Automobile_GER
Manufacturer_ID Name Werk Jahr der Gründung Baureihen_ID Baureihe
0001 Audi Ingolstadt 1909 1 A1
0001 Audi Ingolstadt 1909 2 A3
0001 Audi Ingolstadt 1909 3 A4
0002 BMW München 1916 1 1er
0002 BMW München 1916 2 3er
0003 Mercedes-Benz Stuttgart 1926 1 A-Klasse

Der Primärschl?üssel der Relation ist aus den Feldern Manufacturer_ID und Baureihen_ID zusammengesetzt. (Grundsätzlich? darf ein Primärschl?üssel aus mehreren Attributen bestehen, jedoch entsteht daraus im genannten Beispiel ein Konflikt.)
Die Felder Name und Jahr der Gründung sind vom Feld Manufacturer_ID abhängig, aber nicht vom Feld Baureihen_ID. Dies (Punkt 2) verletzt die 2. Normalform, da die drei nicht-primären Attribute nicht nur von einem Teil des Schlüssels (hier Manufacturer_ID) abhängen dürfen. Wäre Punkt 1 nicht erfüllt, so könnte dies nicht passieren.

Probleme, die sich daraus ergeben:
Die Informationen aus diesen beiden Feldern sind, wie am Beispiel des Herstellers Audi und BMW, mehrfach vorhanden, d. h. redundant. Dadurch besteht die Gefahr, dass die Integrität? der Daten verletzt wird. So könnte man den Herstellernamen für Audi bei dem Modell A1 in Audi AG ändern, ohne jedoch die entsprechenden Einträge? für die Modelle A3 und A4 zu ändern (Update-Anomalie).
Automobile_GER
Manufacturer_ID Name Werk Jahr der Gründung Baureihen_ID Baureihe
0001 Audi AG Ingolstadt 1909 1 A1
0001 Audi Ingolstadt 1909 2 A3
0001 Audi Ingolstadt 1909 3 A4
0002 BMW München 1916 1 1er
0002 BMW München 1916 2 3er
0003 Mercedes-Benz Stuttgart 1926 1 A-Klasse

In diesem Fall ist ein Zustand erreicht, den man als Dateninkonsistenz bezeichnet. Über die komplette Tabelle betrachtet, „passen“ die Daten nicht mehr zusammen.

Lösung: Die Daten in der Tabelle werden in zwei Tabellen aufgeteilt: Hersteller und Modell. Die Tabelle Hersteller enthält nur noch Felder, die voll funktional von Manufacturer_ID abhängen, hat also Manufacturer_ID als Primärschl?üssel. Da keine weiteren (zusammengesetzten) Schlüsselkandidaten existieren, liegt die Tabelle damit automatisch in der 2. Normalform vor. Die Tabelle Modelle enthält schließlich nur noch Felder, die voll funktional von Manufacturer_ID und Baureihen_ID abhängen, liegt also auch in der 2. Normalform vor. Mit Hilfe dieser verlustfreien Zerlegung sind auch die genannten Redundanzen der Daten beseitigt.
Hersteller
Manufacturer_ID Name Werk Jahr der Gründung
0001 Audi Ingolstadt 1909
0002 BMW München 1916
0003 Mercedes-Benz Stuttgart 1926
Modelle
Manufacturer_ID Baureihen_ID Baureihe
0001 1 A1
0001 2 A3
0001 3 A4
0002 1 1er
0002 2 3er
0003 1 A-Klasse

Das Attribut Manufacturer_ID aus der Tabelle Modelle bezeichnet man als Fremdschlüssel, der auf den Primärschl?üssel der Tabelle Hersteller verweist. Zugleich stellen die Attribute Manufacturer_ID und Baureihen_ID den zusammengesetzten Primärschl?üssel der Tabelle Modelle dar.
Dritte Normalform (3NF)

Die dritte Normalform ist erreicht, wenn sich das Relationenschema in 2NF befindet, und kein Nichtschlüsselattribut (weiße Zellen in der Tabelle) von einem Schlüsselkandidaten transitiv abhängt.

Ein Attribut A ist vom Schlüsselkandidaten P transitiv abhängig, wenn es ein Attribut B gibt, sodass (P → B) und (B → A).

Einfach gesagt: Ein Nichtschlüsselattribut darf nicht von einer Menge aus Nichtschlüsselattributen abhängig sein. Ein Nichtschlüsselattribut darf also nur direkt von einem Primärschl?üssel (bzw. einem Schlüsselkandidaten) abhängig sein.

Praktischer Nutzen
Transitive Abhängigkeiten? sind sofort ersichtlich, ohne dass man die Zusammenhänge? der Daten kennen muss. Sie sind durch die Struktur der Relationen wiedergegeben.

Außerdem werden verbliebene thematische Durchmischungen in der Relation behoben: nach der 3NF sind die Relationen des Schemas zuverlässig monothematisch.

Alternative Formulierung
Die dritte Normalform ist erreicht, wenn sich das Relationenschema in 2NF befindet, und kein Nichtschlüsselattribut (weiße Zellen in der Tabelle) Determinante ist.

Oder:Die dritte Normalform ist erreicht, wenn sich das Relationenschema in 2NF befindet, und kein Nichtschlüsselattribut (weiße Zellen in der Tabelle) von einem anderen Nichtschlüsselattribut funktional abhängig ist.

Negativbeispiel; 3NF verletzt
Hersteller
Manufacturer_ID Name Werk Jahr der Gründung
0001 Audi Ingolstadt 1909
0002 BMW München 1916
0003 Mercedes-Benz Stuttgart 1926
0004 BMW Unterschleißheim 1916

Offensichtlich lässt sich der Hersteller eines Autos aus der Manufacturer_ID bestimmen, das Gründungsjahr der Firma hängt wiederum vom Hersteller und damit transitiv von der Manufacturer_ID ab.

Das Problem ist hierbei wieder Datenredundanz. Wird zum Beispiel ein neues Werk einer existiereneden Firma eröffnet (hier in Unterschleißheim) so wird das Gründungsjahr redundant gespeichert.

Lösung
Standorte
Manufacturer_ID Name Werk
0001 Audi Ingolstadt
0002 BMW München
0003 Mercedes-Benz Stuttgart
0004 BMW Unterschleißheim
Hersteller
Name Jahr der Gründung
Audi 1909
BMW 1916
Mercedes-Benz 1926
Modelle
Manufacturer_ID Baureihen_ID Baureihe
0001 1 A1
0001 2 A3
0001 3 A4
0002 1 1er
0002 2 3er
0003 1 A-Klasse

An der Tabelle “Modelle” wurden keine Änderungen bei der Übertragung in die 3. Normalform vorgenommen. Sie ist hier nur der Vollständigkeit? halber gelistet.

Die Relation wird aufgeteilt, wobei die beiden voneinander abhängigen Daten in eine eigene Tabelle ausgelagert werden. Der Schlüssel der neuen Tabelle muss als Fremdschlüssel in der alten Tabelle erhalten bleiben (gelbe Spalte in der Tabelle Standorte).

Erstellen einer Datenbank (mySQL) mit Hilfe von phpMyAdmin

Anlegen einer Datenbank (PC) mit Hilfe von XAMPP

MySQL ist eine Datenbank die wie z.B. Access auf SQL aufgebaut ist. Bei den meisten Webspace-Angeboten mit Datenbank handelt es sich um eine MySQL-Datenbank, denn die benötigte Software dafür ist Freeware und sie ist leicht zu bedienen.

Auch wenn es am Anfang etwas schwerer ist mit einer Datenbank zu arbeiten, lohnt sich der Umstieg von Textdateien auf MySQL.

Denn mit einer Datenbank kann man bestimmte Scripts viel leichter realisieren als mit Textdateien. Denn mit MySQL hat man viel besser Möglichkeiten gezielte Werte auszugeben, zu überprüfen, zu bearbeiten und zu löschen. Wir können auch die Werte in einer Tabelle viel besser sortieren lassen.

Rundrum hat die Datenbank gegenüber Dateien ein riesen Vorteil, und eine MySQL Datenbank mit PHP zu “bedienen” ist sehr viel leichter, als mit Textdateien zu arbeiten. Desweiteren sind MySQL Datenbanken schneller als Textdateien und man verliert nicht so schnell die Übersicht, wenn die Tabelle etwas länger wird.

Wenn wir Xampp installiert haben, wurde eine MySQL-Datenbank-Server automatisch mit installiert und auch gleich gestartet.

Um dies zu Überprüfen, rufen wir folgende Datei auf:
c:\xampp\xampp\xampp-control.exe

Wenn wir das Programm gestartet haben, erscheint zuerst ein Fenster, auf dem wir den Status der wichtigsten Module erkennen.
Hinter Apache: und MySQL: sollte Running stehen, wenn dies nicht der Fall ist, drückt man einfach auf den Start-Button.

So als nächstes müssen wir für uns einen Benutzer anlegen, dies geht am besten per phpMyAdmin. Normalerweise ist dies gleich mit installiert worden, und wir können es per http://localhost/phpmyadmin aufrufen.
Arbeiten mit phpMyAdmin

Öffnet in eurem Browser PHPMyAdmin? und Ihr seht ein 2 geteilten Screen:
Auf der linken Seite seht Ihr ein Drop Down Menü, wo Ihr die euch zur Verfügung stehenden Datenbanken auswählen könnt. Innerhalb dieser Datenbanken könnt Ihr Tabellen erstellen.
Wir wählen unsere Datebank mit dem Namen “bsz_senefelder” aus.
Tabellen mit PHPMyAdmin? erstellen

Rechts daneben seht Ihr zwei leere Felder, wo man etwas eintragen kann. Darüber steht auch “Neue Tabelle in Datenbank erstellen”. Solltet Ihr diese Seite nicht sehen, kann es sein dass Ihr links erstmal eure Datenbank auswählen müsst bevor Ihr dieses Bild erhaltet.

Als Namen tragen wir den Namen ein, so wie unsere Tabelle heissen soll. Diese Tabelle nennen wir adressen . Bitte beachtet, dass hier php auch auf Groß- und Kleinschreibung achtet ! Als Anzahl der Felder wählen wir erstmal 10. Wir müssen nicht alle 10 Felder benutzen, es verschafft uns aber erstmal kreativen Freiraum.

Merke: Wählt keine Tabellen- oder Feldnamen, die auch als Befehlsnamen existieren ! Dies führt nur zu Verwirrungen und zu ungewollten Fehlern. (z.B. connect, phpinfo, echo etc.)

Diese Daten habe ich in unsere Tabelle eingegeben. Die Typen und Felder erkläre ich gleich: bei dem Feld id habe ich unter Attribute noch UNSIGNED, bei EXTRA habe ich auto_increment ausgewählt und den Primärschl?üssel den Ihr direkt rechts daneben seht (Radiobutton).

Verschiedene Typen:

Jenachdem wie groß die Zahl ist die wir speichern wollen, oder wie groß der jeweilige Text ist, können wir unterschiedliche Typen wählen. Dies entscheidet nachher wie aufgebläht die Datenbank ist, wenn sich tausende von Datensätzen? dadrin befinden.

Gebe ich VARCHAR an, kann sich darin Text befinden. Hierbei muss aber angeben wieviele Zeichen Text darin reinpassen sollen. Gebe ich 10 Zeichen an und speichere dann 11 Zeichen , dann werden die Zeichen nach dem 10. Zeichen einfach abgeschnitten.

Ich habe bei unserer Tabelle fast überall VARCHAR ausgewählt und auf 100 Zeichen begrenzt. Die Postleitzahl ist eine fünfstellige Zahl, so dass ich dort INT angegeben habe. Die Telefonnummer kann man auch mit / oder – angeben (0123 – 45678), so dass ich mich hier für ein Textfeld entschieden habe.

Eine Übersicht: MySQL Referenz für die verschiedenen Typen
Welche man immer benötigt sind folgende:
VARCHAR : speichert kürzere Texte
TEXT : speichert beliebig lange Texte
INT : speichert Zahlen wie z.B. Postleitzahlen

Warum habe ich ein Feld mit id ?
Wer diese Frage nicht beantworten kann springt bitte wieder zum Anfang lächelnd
Die SQL-Befehle hinter phpMyAdmin
Anlegen einer Datenbank
CREATE DATABASE database_name

z.B:
CREATE DATABASE bsz_senefelder

Hier legen wir eine Datenbank mit dem Namen “bsz_senefelder” an

Anlegen einer Tabelle
CREATE TABLE table_name
(
column_name1 data_type,
column_name2 data_type,
column_name3 data_type,
….
)

z.B:
CREATE TABLE adressen
(
id int,
name varchar(100),
adresse varchar(100),
plz int,
ort varchar(100),
telefon varchar(50)
)

Hier legen wir eine Tabelle mit dem Namen “adressen” an, wenn Ihr euch an phpMyAdmin erinnert, haben wir das selbe gemacht lächelnd

Tipp:
CREATE TABLE Persons
(
id int NOT NULL AUTO_INCREMENT,
name varchar(100),
adresse varchar(100),
plz int,
ort varchar(100),
telefon varchar(50),
PRIMARY KEY (id)
)

Hier sind zusätzliche Befehle verankert (siehe Fettungen), wir legen id als Primärschl?üssel fest “PRIMARY KEY (id)” und definieren zuvor noch spezielle Anforderungen an “id” mit:
NOT NULL
AUTO_INCREMENT

Befüllen der Tabelle
Langform:
INSERT INTO table_name (column1, column2, column3,…)
VALUES (value1, value2, value3,…)

z.B.:
INSERT INTO adressen (id, name, adresse, plz, ort, telefon) VALUES (01, Max Mustermann, Musterstrasse, 010101, Musterstadt, 089-123456-78)

Kurzform:
INSERT INTO table_name
VALUES (value1, value2, value3,…)

z.B.
INSERT INTO adressen
VALUES (01, Max Mustermann, Musterstrasse, 010101, Musterstadt, 089-123456-78)

Vorsicht:
Hier werden die Werte der Reihe nach in die Tabelle geschrieben, weiß man nicht wie die Tabelle aufgebaut ist, kann es schnell zu Fehlern führen!

Abfragen von Inhalten

Spezielle Inhalte:
SELECT column_name(s)
FROM table_name

z.B.
SELECT name,adresse FROM adressen

Der Output als Tabelle wäre wie folgt:

name adresse
Max Mustermann Musterstrasse

Alle Inhalte einer Tabelle:

hier muss man nicht alle Spalten auflisten können sondern nimmt das Sternchen (*) als Platzhalter für alle vorhandenen Spalte
SELECT * FROM adressen

Der Output als Tabelle wäre wie folgt:

id name adresse plz ort telefon
01 Max Mustermann Musterstrasse 010101 Musterstadt 089-123456-78

PHP und mySQL

Den meisten Nutzen hat eine Datenbank natürlich in Verbindung mit einer Anwendung, sei es eine einfache Bannerrotation oder komplexe dynamische Inhalte auf Benutzer zugeschnitten, meist handelt es sich um PHP in Verbindung mit einer Datenbank.

Basics

Wie verbinde ich meine Anwendung mit einer Datenbank?

Der oben stehende PHP-Code verbindet sich mit Eurem SQL-Server, der Rückgabewert ist TRUE, wenn die Verbindung erfolgreich war, oder FALSE wenn es nicht geklappt hat.

Was fange ich nun mit einer Verbindung an?

Hier haben wir nochmals die Verbindung aufgegriffen und verfeinert mit “or die”, dieser Befehl wird nur dann ausgeführt wenn die Verbindung nicht erfolgreich war und das Skript abgebrochen mit der Meldung “keine Verbindung möglich. Benutzername oder Passwort sind falsch”.

Wenn die Verbindung erfolgreich war wählen wir eine Datenbank aus, auch hier wird eine Fehlermeldung mit Skriptabbruch ausgeführt, falls der Befehl fehlschlägt.

Verwendung

Und nun?

Mit einer bestehenden Verbindung zu einer existierenden Datenbank, kann ich die vorhin erklärten SQL-Befehle via PHP ausführen, so z.B. unsere Tabelle “adressen” erzeugen:

In der Variable “abfrage” speichern wir unsere SQL-Abfrage.
Mit dem Befehl “mysql_query()” starten wir eine Anfrage an unsere Datenbank und übergeben den SQL-Befehl durch die Variable.
mysql_query($abfrage)

Tipp:
Das befüllen einer Tabelle funktioniert ähnlich, probiert es doch mal selbst, unterhalb die Lösung (Markieren und in einen Textedior kopieren lächelnd)
$abfrage = “INSERT INTO adressen (id, name, adresse, plz, ort, telefon) VALUES (01, Max Mustermann, Musterstrasse, 010101, Musterstadt, 089-123456-78)”;
mysql_query($abfrage);

Tabelleninhalte abfragen und das Ergebnis bearbeiten

Ein allgemeines Beispiel ist es Inhalte einer Tabelle abzufragen und neu zu ordnen:
Hier eine Beispiel-Tabelle: (Ihr erinnert euch lächelnd)
standorte
Manufacturer_ID Name Werk
0001 Audi Ingolstadt
0002 BMW München
0003 Mercedes-Benz Stuttgart
0004 BMW Unterschleißheim

Wir wollen nun alles aus der Tabelle auswählen, aber neu Ordnen:

Der wichtige Teil ist hier “ORDER BY” als Ordnungsbefehl und “DESC” als Richtung (Aufsteigend = ASC , Absteigend = DESC)

Das Ergebnis als Tabelle wäre:

standorte
Manufacturer_ID Name Werk
0004 BMW Unterschleißheim
0003 Mercedes-Benz Stuttgart
0002 BMW München
0001 Audi Ingolstadt

Tipp:
geht auf W3C-Schools und macht das kurze mySQL – Tutorial, das sind alle wichtigen Befehle!

Bitte noch das Thema “Beziehungen” aufnehmen.
Stellen sie auch eine Prüfungsfrage:
1a…..
1b….
1c….
Ansonsten super dargestellt hu

Wir wollen nur bis einschließlich der 3. Normalform Datenbankstrukturen erörtern.