Hauptinhalt
Programmierung
Kurs: Programmierung > Lerneinheit 3
Lektion 3: Relationale Abfragen mit SQL- Daten in relationale Tabellen aufteilen
- Challenge: Bobbys Hobbys
- Challenge: Kundenbestellungen
- Challenge: Fortsetzungen in SQL
- Challenge: Meine Freunde
- Projekt: Berühmte Personen
- Effizientere SQL Abfragen durch Planung und Optimierung
© 2023 Khan AcademyNutzungsbedingungenDatenschutzerklärungCookie-Meldung
Daten in relationale Tabellen aufteilen
Bisher haben wir nur mit einer Tabelle gearbeitet und gelernt, wie man interessante Daten aus dieser Tabelle abfragt. Aber meistens sind unsere Daten auf mehrere Tabellen verteilt. Diese Tabellen haben bestimmte Beziehungen zueinender, was man auch Relationen nennt.
Hier haben wir z. B. eine Tabelle mit den Prüfungsresultaten von Schülern inkl. der E-Mail ihrere Eltern (zur Information über schlechte Noten):
student_name | Schüler_E-Mail | test | grade |
---|---|---|---|
Peter Rabbit | peter@rabbit.com | Ernährung | 95 |
Alice Wonderland | alice@wonderland.com | Ernährung | 92 |
Peter Rabbit | peter@rabbit.com | Chemie | 85 |
Alice Wonderland | alice@wonderland.com | Chemie | 95 |
Wir haben ebenfalls eine Tabelle mit den Büchern, welche die Schüler gelesen haben:
student_name | book_title | book_author |
---|---|---|
Peter Rabbit | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
Peter Rabbit | Jabberwocky | Lewis Carroll |
Alice Wonderland | The Hunting of the Snark | Lewis Carroll |
Alice Wonderland | Jabberwocky | Lewis Carroll |
Wir haben ebenfalls eine Tabelle mit detaillierten Informationen zu den Schülern:
id | student_first | student_last | Schüler_E-Mail | Telefon | birthday |
---|---|---|---|---|---|
1 | Peter | Rabbit | peter@rabbit.com | 555-6666 | 2001-05-10 |
2 | Alice | Wonderland | alice@wonderland.com | 555-4444 | 2001-04-02 |
Was denkst du über diese Tabellen? Würdest du an ihnen irgendwas ändern?
Es gibt einen wichtigen Punkt, den du bei diesen Tabellen erkennen musst: Sie beschreiben relationale Daten. Daten, welche in Beziehungen zueinander stehen. Jede dieser Tabellen beschreibt Daten, welche zu einem bestimmten Schüler gehören. Und viele der Daten in den Tabellen werden mehrmals wiederholt. Wenn die gleichen Daten in mehreren Tabellen wiederholt werden, kann dies interessante Konsequenzen haben.
Was passiert z. B., wenn sich die E-Mail eines Schülers ändert? Welche Tabellen müssen wir aktualisieren?
Wir müssen die Tabelle mit den Informationen zu den Schülern aktualisieren, aber da die E-Mail auch in der Tabelle mit den Noten steht, müssen wir dort ebenfalls jede Zeile zu diesem Schüler finden und die E-Mail aktualisieren.
Es ist viel besser, wenn die Daten einer bestimmte Spalte nur einmal in einer einzigen Tabelle gespeichert werden. So braucht man weniger Speicherplatz, muss nur an einem Ort Daten aktualisieren und verhindert, dass man an verschiedenen Orten unterschiedliche Werte speichert und die Daten damit inkonsistent werden. Wenn wir dies tun, müssen wir aber einen Weg finden, wie wir die Daten von mehreren Tabellen verknüpfen können. Das schauen wir uns später an.
Wir wollen z. B. die E-Mail aus der Noten-Tabelle entfernen, da wir bemerkt haben, dass diese redundant mit der E-Mail in der Tabelle mit den Schülerinformationen ist. Dann sieht die Tabelle so aus:
student_name | test | grade |
---|---|---|
Peter Rabbit | Ernährung | 95 |
Alice Wonderland | Ernährung | 92 |
Peter Rabbit | Chemie | 85 |
Alice Wonderland | Chemie | 95 |
Wie können wir nun die E-Mail für jeden Schüler ermitteln? Wir können in der Schülertabelle die Zeile mit dem gleichen Namen suchen. Und was passiert, wenn 2 Schüler den gleichen Namen haben? (Wusstest du, dass in Bali jede Person nur 1 von 4 möglichen Vornamen hat?) Den Namen können wir nicht verwenden, um die Informationen zu einem Schüler nachzuschlagen. Wir sollten niemals etwas wie Namen verwenden, um eindeutige Daten in einer Tabelle zu identifizieren.
Daher wäre es das Beste, die Spalte
student_name
zu entfernen und mit student_id
zu ersetzen, da diese eindeutig ist.student_id | test | grade |
---|---|---|
1 | Ernährung | 95 |
2 | Ernährung | 92 |
1 | Chemie | 85 |
2 | Chemie | 95 |
Die gleiche Änderung,
student_id
anstatt student_name
zu verwenden, können wir auch in der Tabelle "Books" machen:student_id | book_title | book_author |
---|---|---|
1 | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
1 | Jabberwocky | Lewis Carroll |
2 | The Hunting of the Snark | Lewis Carroll |
2 | Jabberwocky | Lewis Carroll |
Hast du bemerkt, dass wir den Titel und Author für Jabberwocky zwei Mal verwenden? Dies ist ein weiteres Anzeichen dafür, dass wir wohl die Tabelle in mehrere relationale Tabellen aufteilen sollten, damit wir später, wenn wir ein Buch ändern, dies nur an einer Stelle aktualisieren müssen.
Wir können eine Tabelle nur über die Bücher erstellen:
id | book_title | book_author |
---|---|---|
1 | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
2 | Jabberwocky | Lewis Carroll |
3 | The Hunting of the Snark | Lewis Carroll |
Und dann wird unsere Tabelle
student_books
:student_id | book_id |
---|---|
1 | 1 |
1 | 2 |
2 | 3 |
2 | 2 |
Klar, diese Tabelle ist leider nicht mehr so gut lesbar wie die alte Tabelle, welche alle Informationen in jeweils einer Zeile enthielt. Aber diese Tabellen sind nicht dazu gemacht, für Menschen gut lesbar zu sein. Sie werden erstellt, um die beste Form zur Speicherung von Daten mit guter Wartbarkeit und geringer Fehleranfälligkeit zu haben. Oft macht es Sinn, die Daten in mehrere relationale Tabellen aufzuteilen, damit diese weniger redundant sind und nur an einer Stelle aktualisiert werden müssen.
Es ist wichtig, zu verstehen, wie man SQL mit Daten, welche auf mehrere relationale Tabellen aufgeteilt wurden, verwendet. Und vor allem, wie man diese Daten aus mehreren Tabellen wieder zusammenbringen und verknüpfen kann. Dies machen wir mit dem Befehl "join". Diesen Befehl wirst du als Nächstes kennenlernen.
Willst du an der Diskussion teilnehmen?
Noch keine Beiträge.