Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
faecher:informatik:oberstufe:datenbanken:normalisierung:1_normalform:start [25.11.2020 18:32] – sbel | faecher:informatik:oberstufe:datenbanken:normalisierung:1_normalform:start [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== | ||
- | <WRAP center important 90%> | ||
- | **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 {{ ..: | ||
- | |||
- | **(i)** Erstelle die Tabellenfelder '' | ||
- | |||
- | Probiere die folgenden SQL-Statements aus und mache dir klar, was dabei passiert, du kannst dir auch mal die Dokumentation zu '' | ||
- | |||
- | <code sql> | ||
- | SELECT SUBSTRING_INDEX(doktor, | ||
- | SELECT SUBSTRING_INDEX(doktor, | ||
- | </ | ||
- | |||
- | Mit Hilfe von Subquerys kann man nun die am Komma aufgesplitteten Werte in die neuen Felder übertragen: | ||
- | |||
- | <code sql> | ||
- | UPDATE zahnarztbedarf t1 SET | ||
- | t1.vorname = (SELECT SUBSTRING_INDEX(doktor, | ||
- | t1.name = (SELECT SUBSTRING_INDEX(doktor, | ||
- | WHERE t1.name='' | ||
- | </ | ||
- | |||
- | Subquerys sind die in Klammern gesetzten SQL Abfragen, mit denen die Werte ermittelt werden, die für '' | ||
- | |||
- | Deine Tabelle sollte jetzt so aussehen: | ||
- | |||
- | {{ : | ||
- | |||
- | Nun kannst du die Spalte '' | ||
- | |||
- | ---- | ||
- | |||
- | **(ii)** Zerlege das Feld '' | ||
- | |||
- | ++++ Lösung | | ||
- | <code sql> | ||
- | UPDATE zahnarztbedarf t1 SET | ||
- | t1.fax = (SELECT SUBSTRING_INDEX(telefon_fax, | ||
- | t1.telefon = (SELECT SUBSTRING_INDEX(telefon_fax, | ||
- | WHERE t1.fax='' | ||
- | </ | ||
- | ++++ | ||
- | ---- | ||
- | |||
- | **(iii)** Zerlege das Feld '' | ||
- | |||
- | Überführe dann den Inhalt des temporären Felds nach '' | ||
- | |||
- | <wrap hi> | ||
- | |||
- | |||
- | ++++ Lösung Schritt 1 | | ||
- | <code sql> | ||
- | UPDATE zahnarztbedarf t1 SET | ||
- | t1.plzwo = (SELECT SUBSTRING_INDEX(adresse, | ||
- | t1.strasse = (SELECT SUBSTRING_INDEX(adresse, | ||
- | WHERE t1.plzwo = '' | ||
- | </ | ||
- | ++++ | ||
- | |||
- | ++++ Lösung Schritt 2 | | ||
- | <code sql> | ||
- | UPDATE zahnarztbedarf t1 SET | ||
- | t1.wohnort = (SELECT SUBSTRING_INDEX(TRIM(plzwo), | ||
- | t1.plz = (SELECT SUBSTRING_INDEX(TRIM(plzwo), | ||
- | WHERE t1.plz = '' | ||
- | </ | ||
- | |||
- | ++++ | ||
- | |||
- | ---- | ||
- | |||
- | **(iv)** Jetzt wirds langweilig... Nun muss man das ganze nochmal für das wilde Durcheinander im Feld Hersteller wiederholen - das ist freiwillig und birgt keine neuen Erkenntnisse mehr, du kannst also auch gleich die Lösung bemühen oder das Ergebnis herunterladen. | ||
- | |||
- | ++++ Lösung | | ||
- | |||
- | 4 neue Tabellenfelder + temporäres Feld: | ||
- | |||
- | <code sql> | ||
- | SELECT SUBSTRING_INDEX(hersteller, | ||
- | SELECT SUBSTRING_INDEX(hersteller, | ||
- | </ | ||
- | |||
- | ++++ |