Dies ist eine alte Version des Dokuments!
1. Normalform (1NF)
Atomare Attribute. Die Erste Normalform (1NF) ist dann gegeben, wenn alle Informationen in einer Tabelle atomar vorliegen.
Eine Relation befindet sich also dann in der ersten Normalform (1NF), wenn in keinem Feld in der Tabellen mehrere Werte eingetragen sind. Wann genau ein Attribut atomar ist, hängt manchmal auch noch von den Randbedingungen der Miniwelt ab, die man modellieren möchte - für viele Miniwelten reicht ein ISO-Datumsfeld der Form YYYY-MM-DD aus, manche Modelle erfordern aber eventuell die weitere Aufteilung in die Attribute Tag, Monat und Jahr.
(A1)
Wir gehen von unserer Universaltabelle aus:
- Welche Attribute sind nicht atomar?
- Welche Schwierigkeiten ergeben sich daraus, wenn du mit SQL Informationen aus der Datenbank abfragen möchtest? Nenne drei Beispiele, wo Probleme entstehen, weil die Attribute nicht atomar sind.
Importiere die Universaltabelle in deine Übungsdatenbank.
(i) Erstelle die Tabellenfelder name
und vorname
und überführe die Inhalte des Attributs doktor
in diese Felder. Dabei kann du die mysql-Funktion SUBSTRING_INDEX
verwenden1). Mit dieser kann man den Inhalt eines Tabellenfelds an einem Trennzeichen in Teile zerlegen, die man über Ihren Index ansprechen kann:
Probiere die folgenden SQL-Statements aus und mache dir klar, was dabei passiert, du kannst dir auch mal die Dokumentation zu SUBSTRING_INDEX
durchlesen: https://mariadb.com/kb/en/substring_index/
SELECT SUBSTRING_INDEX(doktor, ',', 1) FROM `zahnarztbedarf` SELECT SUBSTRING_INDEX(doktor, ',', -1) FROM `zahnarztbedarf`
Mit Hilfe von Subquerys kann man nun die am Komma aufgesplitteten Werte in die neuen Felder übertragen:
UPDATE zahnarztbedarf t1 SET t1.vorname = (SELECT SUBSTRING_INDEX(doktor, ',', -1) FROM `zahnarztbedarf` t2 WHERE t2.id = t1.id ), t1.name = (SELECT SUBSTRING_INDEX(doktor, ',', 1) FROM `zahnarztbedarf` t2 WHERE t2.id = t1.id ) WHERE t1.name=''
Subquerys sind die in Klammern gesetzten SQL Abfragen, mit denen die Werte ermittelt werden, die für t1.vorname
und t1.name
gesetzt werden.
Deine Tabelle sollte jetzt so aussehen:
Nun kannst du die Spalte doktor
löschen, da die Informationen jetzt atomar in den Attributen name
und vorname
vorliegen.
(ii) Zerlege das Feld telefon_fax
auf dieselbe Weise in die atomaren Attribute telefon
und fax
. Erstelle zunächst die neuen Felder, kopiere dann das SQL Statement von oben und passe es entsprechend an. Kontrolliere den Erfolg und lösche dann die Spalte telefon_fax
.
(iii) Zerlege das Feld adresse
in die Felder strasse
, wohnort
und plz
. Dabei musst du zweischrittig vorgehen, da du den Feldinhalt an verschiedenen Trennzeichen splitten musst: Überführe mit dem Statement von oben zunächst die Strassen in das Feld strasse
und die Kombination aus PLZ und Wohnort in ein temporäres Feld plzwo
. Überführe dann den Inhalt des temporären Felds nach plz und wohnort indem du am Leerzeichen splittest. Lösche dann das Feld adresse
und das Zwischenfeld plzwo
. Wichtig: Um das plzwo Feld sauber am Leerzeichen trennen zu können, muss man sicherstellen, dass kein führendes Leerzeichen mehr vorhanden ist, wo zuvor die Zeichenkombination ,<LEER>
war, das kann man mit dem mysql Befehl TRIM
erreichen: SELECT SUBSTRING_INDEX(TRIM(plzwo), ' ', 1) FROM `zahnarztbedarf`
.