faecher:informatik:oberstufe:datenbanken:normalisierung:2_normalform:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:datenbanken:normalisierung:2_normalform:start [25.11.2020 17:59] – [Grundsatz: Eine Entität - eine Tabelle] sbelfaecher:informatik:oberstufe:datenbanken:normalisierung:2_normalform:start [04.12.2024 11:39] (aktuell) Marco Kuemmel
Zeile 4: Zeile 4:
 </WRAP> </WRAP>
  
 +Die 2. Normalform entfernt Redundanzen:
  
 +{{ :faecher:informatik:oberstufe:datenbanken:normalisierung:1_normalform:1nf.png |}}
 +
 +In der Tabelle in der 1NF tauchen zahlreiche Attributwerte mehrfach auf, z.B. Die Namen der Doktoren oder Hersteller.
 ==== Grundsatz: Eine Entität - eine Tabelle ==== ==== Grundsatz: Eine Entität - eine Tabelle ====
  
Zeile 16: Zeile 20:
  
   * Überführe die Inhalte der "Universaltabelle" in der 1NF in drei Tabellen: ''doktoren'', ''hersteller'', ''produkte''. Verteile die Attribute auf die Tabellen der Entitäten. Gehe wie folgt vor:   * Überführe die Inhalte der "Universaltabelle" in der 1NF in drei Tabellen: ''doktoren'', ''hersteller'', ''produkte''. Verteile die Attribute auf die Tabellen der Entitäten. Gehe wie folgt vor:
-     - Lege die drei Tabellen mit den entsprechenden Attributen an, lege jeweils auch einen Surrogatschlüssel ''id'' als Primary Key mit Autoinkrement-Eigenschaft an. +     - Lege die drei Tabellen mit den entsprechenden Attributen an, jedoch zunächst ohne Surrogatschlüssel (keine ''id'' Spalte! 
-     - Überführe die Inhalte aus der Universaltabelle in die jeweilige Tabelle, indem du das Ergebnis einer Abfrage direkt an eine INSERT INTO Statement weitergibst: ''INSERT INTO doktoren SELECT  name, vorname, telefon, fax, strasse, plz, wohnort adresse FROM `zahnarztbedarf` ''. Du musst auf die Reihenfolge der Attribute bei der Abfrage achten, an Stelle der id kannst du einen leeren Wert übergeben (zwei Hochkommata ohne zeichen dazwischen).+     - Überführe die Inhalte aus der Universaltabelle in die jeweilige Tabelle, indem du das Ergebnis einer Abfrage direkt an eine INSERT INTO Statement weitergibst: ''INSERT INTO doktoren SELECT DISTINCT name, vorname, strasse, plz, wohnort, telefon, fax FROM `zahnarztbedarf`''. Du musst auf die Reihenfolge der Attribute bei der Abfrage achten, damit die Werte in die richtigen Felder eingefügt werden. Warum benötigt man das Schlüsselwort ''DISTINCT'' bei der Abfrage? 
 +     - Wenn alle Werte überführt sind, fügst du jeder Tabelle noch eine Feld ''id'' als Surrogatschlüssel hinzu (Primary-Key, Auto-Increment).
   * Zwei Tabellenspalten der Universaltabelle können den Entitätstabellen nicht sinnvoll zugeordet werden - bei einer geht keine wesentliche Information verloren, wenn man sie weglässt, bei der anderen schon. Welche Attribute sind das? Lasse beide Attribute vorerst einfach aus - wir kommen später darauf zurück.   * Zwei Tabellenspalten der Universaltabelle können den Entitätstabellen nicht sinnvoll zugeordet werden - bei einer geht keine wesentliche Information verloren, wenn man sie weglässt, bei der anderen schon. Welche Attribute sind das? Lasse beide Attribute vorerst einfach aus - wir kommen später darauf zurück.
-  * Fügen nun den Datensatz für Frau Bohrgut ein aus den [[ faecher:informatik:oberstufe:datenbanken:normalisierung:vorueberlegungen:start |Vorüberlegungen]] ein - du siehst, nun ist ganz klar, welche Informationen in welche Tabelle eingefügt werden müssen.+  * Fügen nun den Datensatz für Frau Bohrgut aus den [[ faecher:informatik:oberstufe:datenbanken:normalisierung:vorueberlegungen:start |Vorüberlegungen]] ein - du siehst, nun ist ganz klar, welche Informationen in welche Tabelle eingefügt werden müssen. 
 + 
 + 
 +++++ Lösungshinweise Tabellenstrukturen:
 + 
 +{{ :faecher:informatik:oberstufe:datenbanken:normalisierung:2_normalform:struktur.png |}} 
 + 
 +++++ 
 + 
 +++++ SQL Befehle: | 
 + 
 +<code sql> 
 +INSERT INTO doktoren  
 +SELECT DISTINCT name, vorname, strasse, plz, wohnort, telefon, fax  
 +FROM `zahnarztbedarf` 
 + 
 +INSERT INTO hersteller  
 +SELECT DISTINCT firma, f_strasse, f_ort, f_plz  
 +FROM `zahnarztbedarf` 
 + 
 +INSERT INTO produkte  
 +SELECT DISTINCT produkt, preis, nummer  
 +FROM `zahnarztbedarf` 
 +</code> 
 + 
 +++++ 
 + 
 +++++ Ergebnis: | 
 + 
 +{{ :faecher:informatik:oberstufe:datenbanken:normalisierung:2_normalform:2nf.png |}} 
 + 
 +++++ 
 + 
 +---- 
 +{{:aufgabe.png?nolink  |}} 
 +=== (A2) === 
 + 
 +Was bei der Normalisierung nun dummerweise verloren gegangen ist, ist die Zuordnung der Bestellungen zu unseren Kunden, den Doktoren - deswegen hatte der Sekretär die Tabelle ja mal angelegt. Auch die Verbindung zwischen Herstellern und Prodkukten sucht man in den einzelnen Tabellen vergeblich?
 + 
 +Um die Verknüpfung zwischen den Entitäten nun wieder herzustellen, wird eine weitere Tabelle angelegt, die lediglich die Verknüpfung zwischen den anderen Entitäten herstellt. 
 + 
 +Erstelle eine Tabelle ''bestellungen'' mit den Feldern ''id'' (Primary-Key, Auto-Increment), ''produkt_id'', ''doktor_id'', ''hersteller_id'' und ''anzahl''
 + 
 +Nun schauen wir in unserer Universaltabelle nach den Bestellungen: 
 + 
 +{{ :faecher:informatik:oberstufe:datenbanken:normalisierung:vorueberlegungen:ausgangslage_normalisierung.png? }} 
 + 
 +Die dritte Zeile sagt uns, dass Viktoria Einsenfaust drei Kneifzangen  bestellt hat. 
 + 
 +Um das in unserer bestellungen-Tabelle abzubilden, müssen wir folgendes eintragen: 
 + 
 +   | id | anzahl | produkt_id | doktor_id | hersteller_id | 
 +   | 1  | 3      | 3          | 3         | 3             | 
 + 
 +**(i)** Was muss man für die Bestellung in der letzten Zeile der Universaltabelle eintragen? 
 + 
 +++++ Lösung | 
 +<code> 
 +| id | anzahl | produkt_id | doktor_id | hersteller_id | 
 +| 2  | 2      | 4          | 1         | 3             | 
 +</code> 
 +++++ 
 + 
 +**(ii)** Komplettiere die Bestellungstabelle in deiner Übungsdatenbank und führe dann die folgende Abfrage aus: 
 + 
 +<code sql> 
 +SELECT * FROM hersteller,doktoren, produkte, bestellungen  
 +WHERE bestellungen.produkt_id = produkte.id 
 +AND bestellungen.doktor_id = doktoren.id 
 +AND bestellungen.hersteller_id = hersteller.id 
 +</code> 
 + 
 +Erläutere, was bei dieser Abfrage passiert und interpretiere das Ergebnis. 
 + 
 + 
 +----  
 +<WRAP center  info 90%> 
 +Nun befinden sich alle Relationen unserer Datenbank in der 2. Normalform((In unserem speziellen Fall sogar zufällig bereits in der 3.)).  
 +</WRAP> 
 + 
 +Die normalisierte Datenbank: {{ :faecher:informatik:oberstufe:datenbanken:nm_beziehungen:zahnarztbedarf_2nf.zip |}} 
  
  • faecher/informatik/oberstufe/datenbanken/normalisierung/2_normalform/start.1606327151.txt.gz
  • Zuletzt geändert: 25.11.2020 17:59
  • von sbel