pixel24
Goto Top

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
normalform1

Content-Key: 7190296695

Url: https://administrator.de/contentid/7190296695

Printed on: May 2, 2024 at 05:05 o'clock

Member: ukulele-7
ukulele-7 May 17, 2023 updated at 10:29:49 (UTC)
Goto Top
Mein theoretischer Unterricht liegt jetzt 15 Jahre zurück und ganz ehrlich habe ich danach nie wieder Normalformen aufgeschrieben, das überspringe ich face-smile

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?
Member: erikro
erikro May 17, 2023 at 10:33:55 (UTC)
Goto Top
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
Member: ukulele-7
ukulele-7 May 17, 2023 at 10:48:25 (UTC)
Goto Top
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 face-smile
Member: em-pie
em-pie May 17, 2023 updated at 11:01:14 (UTC)
Goto Top
Moin,


Zitat von @erikro:

Moin,
...
Erik

+1 face-smile


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 face-smile

Da kommt man weiterhin mit einer MappingTable aus
StudentID | KursID | SemesterID | TeacherID (sollte es den auch mal später geben)
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 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 face-smile
Member: pixel24
pixel24 May 17, 2023 at 11:17:31 (UTC)
Goto Top
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.
normalform2
Member: erikro
erikro May 17, 2023 at 11:20:24 (UTC)
Goto Top
Moin,

Zitat von @ukulele-7:
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. face-wink

Liebe Grüße

Erik
Member: erikro
erikro May 17, 2023 at 11:25:37 (UTC)
Goto Top
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.
Member: pixel24
pixel24 May 17, 2023 at 11:31:52 (UTC)
Goto Top
Habe die beiden anderen Antworten vorhin nicht gesehen. Ich versuche gerade mal diese zu verstehen.
Member: pixel24
pixel24 May 17, 2023 at 12:26:11 (UTC)
Goto Top
Ich habe nur noch Fragezeichen im Kopf face-sad

Wir sehen aber sofort, dass diese Tabelle jeden Kurs öfter enthält entsprechend der Anzahl der Studenten, die ihn besuchen.

Soweit verstehe ich es noch. Also, ja ich sehe das mach ein Kurs mehrfach in der Tabelle steht wie ja oben im Bild zu sehen ist. Das Bild zeigt also einen Zwischenschritt innerhalb "ich bring es in die 2. Normalform". Dieser , auch wenn die 2 NF noch nicht erreicht ist, stimmt aber soweit?

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 .

Das wäre also:
normalform2-2
Member: ukulele-7
ukulele-7 May 17, 2023 at 12:43:43 (UTC)
Goto Top
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.
Member: ukulele-7
ukulele-7 May 17, 2023 at 12:54:35 (UTC)
Goto Top
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
Member: pixel24
pixel24 May 17, 2023 updated at 13:38:02 (UTC)
Goto Top
Ich sitze seit heute Morgen 8:30 an dieser Aufgabe. Unser Dozent bei Comcave hat uns Null erklärt bzw. kann es einfach nicht weshalb wir auch Comcave kontaktiert haben weshalb er uns nun auch den Unterricht verweigert. Ab Montag haben wir einen neuen - und hoffentlich kompetenteren - Dozenten Aber das ist ein anderes Thema.

Gerade hat er seine Lösung zu dieser Aufgabe KOMMENTARLOS in den Chat gestellt. Er hat die 2. Normalform genauso falsch wie ich sie oben habe ... eigentlich zum weinen.

Ich lese jetzt mal im SQL-Buch und hoffe dass es sich mir dann erschließt und werde Morgen nochmal mit freiem Kopf dran gehen. Ich werde dann höchstwahrscheinlich nochmal nachfragen wollen.

Ich bedanke mich an dieser Stelle schon mal für Eure Hilfe und der damit verbunden Geduld !
Member: pixel24
pixel24 May 17, 2023 at 14:07:39 (UTC)
Goto Top
Der Vollständigkeit halber will ich Euch seine Lösung nicht vorenthalten:
screenshot_20230517_160649
Member: godlie
godlie May 18, 2023 at 07:20:58 (UTC)
Goto Top
Eine Lösung in Excel ist keine Lösung, außer du bist im BWL Bereich, da reichen auch zwei bunte Kreise...
Member: ukulele-7
ukulele-7 May 19, 2023 at 06:39:25 (UTC)
Goto Top
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.
Member: erikro
erikro May 19, 2023 at 07:15:56 (UTC)
Goto Top
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
Member: pixel24
pixel24 Jul 01, 2023 at 10:42:37 (UTC)
Goto Top
Ganz vergessen eine "Danke an Alle" zu hinterlassen und den Beitrag als gelöst zu markieren. Mittlerweile klappt es ganz gut. Ist einfach nur Übungssache.