SQL, Tabellen normalisieren
Hallo zusammen,
ich sitze hier zwei Stunden an einer vermeintlich einfachen Aufgabe und bekomme sie nicht gelöst. Vielleicht habe ich es ja auch einfach nicht verstanden. Ich habe mir jetzt zick YT-Videos angeschaut und in dessen Beispielen verste ich es, jedoch nicht in der Aufgabe.
Beim überführen der Tabelle in die 1. Normalform heißt es ja. Zellen atomar machen und die Primärschlüssel identifizieren. Dabei kommt es ja vor dass es einen zusammengesetzten Primärschlüssel aus mehreren Spalten gibt. In der Aufgabe kommen bei mir nach meinem Verständnis jedoch insg. drei zum Tragen. Siehe Bild. Das wären doch Kurs und Semester.
Kann mir jemand erklären wie ich vorgehen muss?
Mit den besten Grüßen
pixel24
ich sitze hier zwei Stunden an einer vermeintlich einfachen Aufgabe und bekomme sie nicht gelöst. Vielleicht habe ich es ja auch einfach nicht verstanden. Ich habe mir jetzt zick YT-Videos angeschaut und in dessen Beispielen verste ich es, jedoch nicht in der Aufgabe.
Beim überführen der Tabelle in die 1. Normalform heißt es ja. Zellen atomar machen und die Primärschlüssel identifizieren. Dabei kommt es ja vor dass es einen zusammengesetzten Primärschlüssel aus mehreren Spalten gibt. In der Aufgabe kommen bei mir nach meinem Verständnis jedoch insg. drei zum Tragen. Siehe Bild. Das wären doch Kurs und Semester.
Kann mir jemand erklären wie ich vorgehen muss?
Mit den besten Grüßen
pixel24
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7190296695
Url: https://administrator.de/contentid/7190296695
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
17 Kommentare
Neuester Kommentar
Mein theoretischer Unterricht liegt jetzt 15 Jahre zurück und ganz ehrlich habe ich danach nie wieder Normalformen aufgeschrieben, das überspringe ich
Atomar:
Ich kann mir vorstellen das die Spalten ZimmerNr und Kurs nicht atomar sind. ZimmerNr besteht aus einer laufenden Nummer und zwei Buchstaben, die könnten für z.B. ein Geschoss oder ein Gebäude stehen. Damit wären die per Definition nicht atomar. Beim Kurs ähnlich: Es gibt mehrere Mathe Kurse mit verschiedenen Nummern, das kann man zerlegen.
In der Praxis macht das natürlich keinen Sinn das so klein aufzudröseln aber gehen tut das.
PK:
Für was steht SNr denn genau, StudentNr? Von den Beispieldatensätzen her sind SNr, Kurs und Semester zusammen eindeutig, also ein PK Kandidat. Es sei denn natürlich du kriegst z.B. mehr als eine Note pro Kurs pro Semester. Warum gefällt dir denn deine Antwort nicht?
Atomar:
Ich kann mir vorstellen das die Spalten ZimmerNr und Kurs nicht atomar sind. ZimmerNr besteht aus einer laufenden Nummer und zwei Buchstaben, die könnten für z.B. ein Geschoss oder ein Gebäude stehen. Damit wären die per Definition nicht atomar. Beim Kurs ähnlich: Es gibt mehrere Mathe Kurse mit verschiedenen Nummern, das kann man zerlegen.
In der Praxis macht das natürlich keinen Sinn das so klein aufzudröseln aber gehen tut das.
PK:
Für was steht SNr denn genau, StudentNr? Von den Beispieldatensätzen her sind SNr, Kurs und Semester zusammen eindeutig, also ein PK Kandidat. Es sei denn natürlich du kriegst z.B. mehr als eine Note pro Kurs pro Semester. Warum gefällt dir denn deine Antwort nicht?
Moin,
die Aufgabe ist ja auch gemein, wenn Du als Anfänger sowas lösen sollst. Die erste Normalform hast Du erreicht. Nun sieht man, wenn man sowas öfter macht, gleich, dass hier eine m:n-Beziehung vorliegt. Ein Student belegt mehrere Kurse und ein Kurs wird von mehreren Studenten besucht. Wenn wir also weiter normalisieren, dann kommt zunächst eine Tabelle "Studenten" heraus, die die direkt vom PK abhängigen Attribute Vorname, Zimmernummer und Durchwahl enthält. Dann haben wir eine Tabelle Kurse, die den PK der Studenten als FK enthält. Wir sehen aber sofort, dass diese Tabelle jeden Kurs öfter enthält entsprechend der Anzahl der Studenten, die ihn besuchen. Also müssen wir die Kurse selbst wieder in eine eigene Tabelle auslagern, um diese Dubletten auszuschließen. Die Verbindung zwischen den Studenten und den Kursen erhalten wir dann dadurch, dass wir eine dritte Tabelle einführen Student2Kurs. Diese hat zwei Spalten. Einmal den PK des Studenten und einmal den PK des Kurses jeweils als . Geschickterweise macht man diese Kombination zu einem zusammengesetzten PK und vermeidet so, dass ein Student zweimal den gleichen Kurs besuchen kann.
hth
Erik
die Aufgabe ist ja auch gemein, wenn Du als Anfänger sowas lösen sollst. Die erste Normalform hast Du erreicht. Nun sieht man, wenn man sowas öfter macht, gleich, dass hier eine m:n-Beziehung vorliegt. Ein Student belegt mehrere Kurse und ein Kurs wird von mehreren Studenten besucht. Wenn wir also weiter normalisieren, dann kommt zunächst eine Tabelle "Studenten" heraus, die die direkt vom PK abhängigen Attribute Vorname, Zimmernummer und Durchwahl enthält. Dann haben wir eine Tabelle Kurse, die den PK der Studenten als FK enthält. Wir sehen aber sofort, dass diese Tabelle jeden Kurs öfter enthält entsprechend der Anzahl der Studenten, die ihn besuchen. Also müssen wir die Kurse selbst wieder in eine eigene Tabelle auslagern, um diese Dubletten auszuschließen. Die Verbindung zwischen den Studenten und den Kursen erhalten wir dann dadurch, dass wir eine dritte Tabelle einführen Student2Kurs. Diese hat zwei Spalten. Einmal den PK des Studenten und einmal den PK des Kurses jeweils als . Geschickterweise macht man diese Kombination zu einem zusammengesetzten PK und vermeidet so, dass ein Student zweimal den gleichen Kurs besuchen kann.
hth
Erik
Moin,
+1
Da kommt man weiterhin mit einer MappingTable aus
Es könnte ja sein, dass ein Student den Kurs MAT122 im nächsten Semester noch mal belegen muss, weil er im ersten Anlauf "verk4ckt" hat...
Und
+1
Zitat von @ukulele-7:
Es gibt nicht nur Kurse sondern auch noch Semester. Du kommst dann an den Punkt wo du dich fragst ob eine Zwischentabelle ausreicht um die Beziehung zwischen Student, Kurs und Semester abzudecken oder ob es vielleicht zwei Zwischentabellen sein sollten - ist doch eigentlich schön
Es gibt nicht nur Kurse sondern auch noch Semester. Du kommst dann an den Punkt wo du dich fragst ob eine Zwischentabelle ausreicht um die Beziehung zwischen Student, Kurs und Semester abzudecken oder ob es vielleicht zwei Zwischentabellen sein sollten - ist doch eigentlich schön
Da kommt man weiterhin mit einer MappingTable aus
StudentID | KursID | SemesterID | TeacherID (sollte es den auch mal später geben)
Und
SemesterID
deswegen, weil es möglicherweise ja Parameter geben könnte (später) die am Semester anhängen. z. B. Start/ Ende des Semesters. Dann muss man die nicht in der MappingTabelle mitschlörren - aber wie immer im (Programmier-)Leben: es gibt nicht DIE Lösung, sondern nur eine mögliche
Moin,
Na bis zur dritten NF sollte man schon kommen. Wem das nicht reicht, der kann ja noch weiter normalisieren: BCNF, vierte NF und fünfte NF.
Liebe Grüße
Erik
Zitat von @ukulele-7:
In der Praxis macht das natürlich keinen Sinn das so klein aufzudröseln aber gehen tut das.
In der Praxis macht das natürlich keinen Sinn das so klein aufzudröseln aber gehen tut das.
Na bis zur dritten NF sollte man schon kommen. Wem das nicht reicht, der kann ja noch weiter normalisieren: BCNF, vierte NF und fünfte NF.
Liebe Grüße
Erik
Zitat von @pixel24:
Dann haben wir eine Tabelle Kurse, die den PK der Studenten als FK enthält.
An dieser Stelle der Normalisierung ist die "SNr" aber noch kein FK da ich in der 2. Form noch beide als zusammengesetzten PK benötige um restliche Attribute Semester und Note eindeutig zu identifizieren, richtig? Siehe Bild.Nein. Die zweite Tabelle befindet sich noch in der ersten NF. Die zweite ist erst erreicht, wenn alle Attribute vom PK abhängen. Die Note hängt aber nicht vom PK "Kurs" ab, sondern vom FK SNr. Daher ist die zweite NF bei der Tabelle verletzt. Deshalb brauchst Du auch die dritte Tabelle, um die zweite NF zu erreichen.
Das Bild ist falsch. Kurs ist erstmal nur die KursNr, nichts weiter. Einen Kurs gibt es offensichtlich in mehreren Semestern und natürlich hat nicht der Kurs eine Note sondern die Person in dem Kurs. Beides gehört in die Zwischentabelle.
So wie du es darstellst ist Kurs nicht eindeutig also kein PK, du kannst also nicht auf Kurs referenzieren.
Vielleicht hilft es dir eine Langbezeichnung für jeden Kurs zu verwenden, dann ergibt die Tabelle Kurs mehr Sinn. Bisher hat sie nur eine sinnvolle Spalte.
So wie du es darstellst ist Kurs nicht eindeutig also kein PK, du kannst also nicht auf Kurs referenzieren.
Vielleicht hilft es dir eine Langbezeichnung für jeden Kurs zu verwenden, dann ergibt die Tabelle Kurs mehr Sinn. Bisher hat sie nur eine sinnvolle Spalte.
Wenn du vorher Semester und Kurs weiter zerlegen würdest wäre es eventuell leichter zu begreifen:
Tabelle "Kurs"
Spalte "Fach", z.B. MAT für Mathe
Spalte "Grad" z.B. 122 oder 130 (ich war nicht an der Uni, keine Ahnung ob die Zahl was über den Schweregrad aussagt)
beide zusammen bilden den PK
Tabelle "Semester"
Spalte "Halbjahr" z.B. W für Winter oder S für Sommer
Spalte "Jahrgang"
beide zusammen bilden den PK
Tabelle "Studenten"
wie oben
Tabelle "Beziehungen"
Spalte "SNr" referenziert Studenten
Spalte "Kurs" referenziert Kurs
Spalte "Semester" referenziert Semester
Spalte "Note" die Note des Studenten in dem Kurs in dem Semester.
Ein Student kann nur einmal pro Semester einen Kurs belegen, muss er ihn wiederholen ändert sich also das Semester. Damit ist SNr, Kurs und Semester der zusammengesetzte PK
Tabelle "Kurs"
Spalte "Fach", z.B. MAT für Mathe
Spalte "Grad" z.B. 122 oder 130 (ich war nicht an der Uni, keine Ahnung ob die Zahl was über den Schweregrad aussagt)
beide zusammen bilden den PK
Tabelle "Semester"
Spalte "Halbjahr" z.B. W für Winter oder S für Sommer
Spalte "Jahrgang"
beide zusammen bilden den PK
Tabelle "Studenten"
wie oben
Tabelle "Beziehungen"
Spalte "SNr" referenziert Studenten
Spalte "Kurs" referenziert Kurs
Spalte "Semester" referenziert Semester
Spalte "Note" die Note des Studenten in dem Kurs in dem Semester.
Ein Student kann nur einmal pro Semester einen Kurs belegen, muss er ihn wiederholen ändert sich also das Semester. Damit ist SNr, Kurs und Semester der zusammengesetzte PK
Der Fokus scheint ja auf der Normalisierung von TNr und ZNr zu liegen aber ohne Hintergrund ist gar nicht klar in welchem Zusammenhang das steht (Räume wechseln ja auch mal ne). Wenn ich das einfach nur nach der Tabelle mit 8 Beispieldatensätze mache würde ich als erstes die Spalten A bis H benennen dann kommt man auch nicht auf die Idee ein sinnvolles System darin zu suchen, dann kann man alles stumpf normalisieren.
Moin,
das ist ja echt blöd, dass Ihr da so von Euren Ausbildern hängen gelassen werdet. Und das bei einem Thema, das eigentlich so schwer nicht ist. Normalisieren ist rein logisch. Wenn man das einmal begriffen hat, geht das flott von der Hand (meistens). Ich habe das selbst jahrelang unterrichtet und in meinem Fundus das hier gefunden. Das ist Dein Beispiel:
https://www.tinohempel.de/info/info/datenbank/normalisierung.htm
hth
Erik
das ist ja echt blöd, dass Ihr da so von Euren Ausbildern hängen gelassen werdet. Und das bei einem Thema, das eigentlich so schwer nicht ist. Normalisieren ist rein logisch. Wenn man das einmal begriffen hat, geht das flott von der Hand (meistens). Ich habe das selbst jahrelang unterrichtet und in meinem Fundus das hier gefunden. Das ist Dein Beispiel:
https://www.tinohempel.de/info/info/datenbank/normalisierung.htm
hth
Erik