join

7. TABELLEN VERKNÜPFEN (JOIN)

 

 

DU LERNST HIER...

 

dass das Verknüpfen und Zusammenführen von Tabellen zu einem wesentlichen Informationsgewinn führt und die Datenbankmanipulationen vereinfacht und besser überschaubar macht.

Es ist davon auszugehen, dass sich jeder Bürger, so auch du, mit Namen, Vornamen und weiteren persönlichen Informationen in Hunderten von Datenbanken befindet und identifizierbar ist, beispielsweise auf Grund seiner Einkäufe mit einer Kundenkarte, der Beteiligung an Umfragen über  gekaufte Produkte oder seinen Aktivitäten in sozialen Netzwerken. Kombiniert man diese Daten, so lässt sich ein Profil einer Person erstellen, das weit über die Informationen aus einer einzigen Datenbank hinausgeht und oft den Schutz der Privatsphäre verletzt.

 

 

MUSTERBEISPIEL

 

Wir wollen eine Beliebtheitsliste bei der Wahl von Vornamen von Neugeborenen heranziehen und diese auf die Vornamen der Personentabelle persons deiner Klasse anwenden, um herauszufinden, welche Beliebtheitsreihenfolge diese Vornamen haben. Ist die Beliebtheitsliste relativ klein (hier enthält sie vorerst nur 100 Namen), so liesse sich dies zwar auch ohne Computer meistern. Wir werden aber nachfolgend die Reihenfolge aller Vornamen in der Schweiz verwenden, die über 50'000 Einträge enthält. Ein manuelles Vorgehen ist in diesem Fall undenkbar.

Zuerst stellen wir die beiden Tabellen im Ausgabefenster dar. (Die Tabelle der Vornamen beziehen wir aus der TigerJython-Distribution.)

from dbtable import *

persons = DbTable('id', 'name', 'vorname', 'wohnort', 'geschlecht', 'jahrgang') 
persons.insert(1, 'Huber', 'Lia', 'Bern', 'w', 2002)
persons.insert(2, 'Meier', 'Luca', 'Basel', 'm', 2003)
persons.insert(3, 'Frech', 'Tim', 'Bern', 'm', 2000)
persons.insert(4, 'Bauer', 'Jan', 'Luzern', 'm', 2003)
persons.insert(5, 'Zwahlen', 'Noah', 'Thun', 'm', 2002)
persons.insert(6, 'Meier', 'Nina', 'Biel', 'w', 2001) 
print(persons)

babynames = DbTable()
babynames.restoreFromTJ("tigerjython.db")
print(babynames)
► In Zwischenablage kopieren

Für die Lösung unserer Aufgabe geht es offenbar darum, die beiden Tabellen nach gleichen Vornamen zu untersuchen, also eine Beziehung (Relation) zwischen den Feldern vorname der Tabelle persons und forename der Tabelle babynames zu erstellen.

Um diese Beziehung zwischen den Feldern name und forename zu erstellen, werden die beiden Tabellen mit dem Befehl persons.join(babynames) miteinander verbunden. Dabei wird jeder Datensatz der Tabelle persons mit jedem Datensatz der Tabelle babynames kombiniert. Wir sind aber nicht an dieser grossen Tabelle (mit 6 x 100 = 600) Datensätzen interessiert, sondern nur an denjenigen, bei denen die Vornamen übereinstimmen. Wir setzen dazu die Feldnamen persons.vorname und babynames.forename für die Übereinstimmung in den join-Befehl.

from dbtable import *

persons = DbTable('id', 'name', 'vorname', 'wohnort', 'geschlecht', 'jahrgang')
persons.insert(1, 'Huber', 'Lia', 'Bern', 'w', 2002)
persons.insert(2, 'Meier', 'Luca', 'Basel', 'm', 2003)
persons.insert(3, 'Frech', 'Tim', 'Bern', 'm', 2000)
persons.insert(4, 'Bauer', 'Mia', 'Luzern', 'm', 2003)
persons.insert(5, 'Zwahlen', 'Olivia', 'Thun', 'm', 2002)
persons.insert(6, 'Meier', 'Nina', 'Biel', 'w', 2001)

babynames = DbTable()
babynames.restoreFromTJ("tigerjython.db")

table = persons.join(babynames, persons.vorname, babynames.forename, True)
table.sort("rank")
print(table)
► In Zwischenablage kopieren

Schon ist das Problem gelöst, denn im Ausgabefenster siehst du:

 id  name  vorname  wohnort  geschlecht  jahrgang  forename  rank
 1  Huber  Lia  Bern  w  2002  Lia  37
 2  Meier  Luca  Basel  m  2003  Luca  4
 3  Frech  Tim  Bern  m  2000  Tim  22
 4  Bauer  Jan  Luzern  m  2003  Jan  21
 5  Zwahlen  Noah  Thun  m  2002  Noah  3
 6  Meier  Nina  Biel  w  2001  Nina  26

 

 

MERKE DIR...

 

Durch die Verbindung von Tabellen lassen sich viele neue Informationen gewinnen, die in den Einzeltabellen nicht vorhanden sind. Lässt man im join-Befehl den letzten Parameterwert True weg, wo werden die Vergleichsfelder nicht in die verbundene Tabelle aufgenommen.

 

 

ZUM SELBST LÖSEN

 
1.

Anlässlich eines Sporttags deiner Schule erreichen die Personen aus der Tabelle persons folgende Leistungen in den Sportarten Lauf, Hochsprung und Weitsprung, die in der Tabelle sport abgelegt sind:

sport = DbTable('sid', 'lauf', 'hochsprung', 'weitsprung')
sport.insert(1, 11.2, 1.23, 4.15)
sport.insert(3, 14.1, 1.41, 3.92)
sport.insert(6, 12.6, 1.22, 3.88)
sport.insert(4, 11.5, 4.2, 1.20)

a.

Verbinde die Tabellen persons und sport über persons.id und sport.sid und zeige die Tabelle an.


b.

Sortiere die Tabelle, damit eine Rangliste auf Grund des Weitsprungs angezeigt wird.

2.

Ergänze die Tabelle persons mit deinem Namen und verwende die Information aller rund  50'000 Vornamen in der Schweiz für die Untersuchung der Häufigkeit. Anleitung: Die Tabelle firstnames hat die Feldnamen: fname für den Vornamen und  fwoman, fman für die Häufigkeiten für Männer bzw. Frauen. Es ist auf Grund der Grösse keine gute Idee, die Tabelle firstnames auszuschreiben, sondern nur die verbundene Tabelle.

   
7-1
Fachliche Hinweise:

Die meisten heute verwendeten Datenbanksysteme sind Relationale Datenbanken, die geradezu mit der Zielsetzung entwickelt wurden, um mehrere Tabellen in eine gegenseitige Abhängigkeit zu stellen (daher das Wort "relational"). Als Datenbank-Programmiersprache wird SQL (Structured Query Language)  verwendet.

7-2
Fachliche Hinweise:

Das Beispiel zeigt eine klassische Anwendung der Verwendung eines Schüssels zur Verknüfung der beiden Tabellen.