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) 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) Schon ist das Problem gelöst, denn im Ausgabefenster siehst du:
|
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 |
|
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.
Das Beispiel zeigt eine klassische Anwendung der Verwendung eines Schüssels zur Verknüfung der beiden Tabellen.