Dokumentation über die DB-Tabellenverknüpfungen


Wie allgemein bekannt, ist der große Vorteil einer Datenbank, dass man Tabellen verknüpfen kann. Dies ist der große Unterschied zu einfachen Tabellenprogrammen wie z.B. Excel. Grundsätzlich ist aber eine DB-Tabelle ähnlich aufgebaut wie eine Excel-Tabelle. Was nun den großen Unterschied ausmacht, sind die möglichen Verknüpfungen. Verknüpfungen macht man immer dann, wenn im Ergebnisfeld einer Auswertungen alle Sätze gleiche Felder haben, wie z.B. alle Häuser haben eine Adresse (Straßenname und Hausnummer). Jedoch gibt es in jeder Straße meist viele Häuser. Damit man nun nicht bei jedem Haussatz den langen Straßennamen eingeben muss, löst man dies dadurch, dass man eine weitere Tabelle anlegt, die nur den Straßenschlüssel und den Straßennamen enthält. In die Tabelle für die Häuser speichert man nur den Straßenschlüssel, der im allgemeinen wesentlich kürzer ist. Damit ist aber auch verbunden, dass alle Häuser in einer Straßen eindeutig denselben Straßennamen haben. Entweder ist der Staßenname bei allen relevanten Sätzen richtig oder bei allen falsch. Wenn man dies mit einer Excel-Tabelle lösen wollte, muss man für jedes Haus den langen Straßennamen eingeben.

Ein anderes, komplexeres Beispiel.
Man will z.B. die Archivordner katalogisieren. Ich nehme gleich das konkrete Beispiel: die Katasterbände im Staatsarchiv Augsburg. Es ist klar, dass es zu einem Ort viele verschiedene Katastertypen gibt, z.B. einen Kataster vom Jahre 1867 und einen vom Jahre 1892. Was die beiden Kataster unterscheidet ist zumindest der Name, einmal Kataster 1867 und dann Kataster 1892. Gleich ist bei beiden Typen der Ort, in unserem Beispiel Kriegshaber (Rentamt Augsburg-Land). Nun gibt es aber mehrere Bände dieser Katataster, in dem einem Band sind z.B. alle Häuser von 1 bis 50 in dem anderen von 51 bis Ende verzeichnet. Also hat man zwei Bändes eines Katastertypen. Nun kommt noch hinzu, dass der Katastertyp einen relativ langen Namen hat, eine Abkürzung hierfür würde die Datenerfassung leichter machen, also wir erfassen bei den Bänden nur k1867 bzw. k1892. Den ausführlichen Namen legen wir in eine neue Tabelle ab, die wir z.B. abk (abkürzung) nennen.

Man hat nun mehrere Abhängigkeiten (Verknüpfungen). Die Bände gehören verschiedenen Katastertypen an, haben aber dieselben Kopfdaten (Ort und Rentamt). Ebenso die Katastertypen, es gibt mehrere Typen, die aber auch dieselben Kopfdaten haben. Schliesslich verwendet man bei den Katastertypen und auch bei den Katasterbänden die Abkürzungen für die Katastertypen.

Wenn man nur alle Kataster für einen Ort darstellen will, ist folgende Verknüpfung möglich: Die Verknüpfung, die ich in diesem Fall mit LEFT JOIN gemacht habe, sieht so aus:
LEFT JOIN katkopf ON katkopf.raort = katband.raort
LEFT JOIN katabk ON katband.abk = katabk.abk
LEFT JOIN kattyp ON katband.abk = kattyp.abk

Schwieriger ist die Sytematik, wenn man unterschiedliche Orte erfassen will. Hier ist der Typ nicht nur vom Feld abk abhängig, sondern auch vom Ort (Feld raort). Erstens hat nicht jeder Ort die gleiche Anzahl von verschiedenen Katastertypen, sondern auch die Jahrbereiche, die in dem speziellen Kataster erfasst sind, sind unterschiedlich. Deshalb ist das Verknüpfungsfeld typ von katband zu kattyp eine Kombination von der Felder raort und abk. Der Left Join sieht dann so aus:
LEFT JOIN katkopf ON katkopf.raort = katbandn.raort
LEFT JOIN kattypn ON katbandn.typ = kattypn.typ
LEFT JOIN katabk ON kattypn.abk = katabk.abk

Bei der Datenerfassung für die Katasterbände sollte man top down vorgehen:
erst erfasst man alle Orte (also Rentamt und Ort)
dann alle möglichen Abkürzungen: also in unserm Beispiel gr1, gr2 und gr3
nun kann man alle Katastertypen erfassen, also z.B. gr1, gr2 und gr3, (bzw. für das allgemeine zweite Beispiel askrigr1, askrigr2, askrigr3) die natürlich noch weitere Felder beinhalten (Gruppe, Jahrbereiche),
schließlich nun die Erfassung der Bände, hier werden die Verknüpfungsschlüssel raort und abk (bzw. typ für das zweite Beispiel) verwendet, die man bereits früher erfasst hat.

Nun kommt es darauf an, mit welchem Programm man die Tabellen füllt, nimmt man ein spezielles Programm für jede Tabelle, dann kann man gleich die Verknüpfungen prüfen, ich kann also keinen Band für einen Ort eingeben, der vorher nicht erfasst wurde. Ich habe mir diese Erfassungsprogramme samt und sonders gespart und erfasse mit dem Administratorprogramm (adminmysql). Hier ist es im Gegensatz zu anderen Datenbanken (z.B. Oracle) nicht möglich, bei der Struktur auch gleich die Verknüpfungsregeln zu prüfen. Wenn ich also einen Ort vergessen habe, kommt bei der verknüpften Liste nun kein Ortsname und Rentamtsname, analog bei den Abkürzungen. Dies ist aber augenscheinlich, man sieht sofort auf Grund des Verknüpfungsbegriffes was noch in anderen Tabellen zu ergänzen ist.



Nun ein Beispiel, wo es nicht so einfach ist, fehlende Verknüpfungen sofort zu erkennen. Hier also die Verknüpfung der Häusersätze mit den Straßennamen. Hier ist es so (bei dem hier verwendeten JOIN), dass nun nur diejenigen Häuser angezeigt werden, für die ein Satz mit dem Straßennamen vorhanden ist. Wenn nun das eine oder andere Haus in meiner Liste fehlt, fällt das natürlich nicht auf, man hakt ja nicht die ganze Liste ab. Daher habe ich für diesen Zweck ein separates Prüfprogramm geschrieben.

Das Programm habe ich haeusereval1913.php genannt, die Source-Daten dieses Programms sind folgendermaßen:
$abfrage1 = "SELECT haeuser.ID, haeuser.hausnr1913, haeuser.schluessel1913, haeuser.besitzer1913
FROM haeuser
LEFT JOIN statamtstrassen ON haeuser.schluessel1913 = statamtstrassen.schluessel
WHERE statamtstrassen.schluessel is NULL";
$ergebnis1 = mysql_query($abfrage1);
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis)) {
echo " \nID= $row->ID";
echo " hausnralt= $row->hausnralt";
echo " schluessel1913= $row->schluessel1913";
echo " besitzer1913= $row->besitzer1913"; }
?>

Das Ergebnis dieser Prüfung ist folgende: ID= 620; hausnr1913= Z9999; schluessel1913= 999999; besitzer1913 = ZZ-Änderungsstand (haeuser): 17-Jul-2012 06:00

Analoge Prüfungen für folgende Verknüpfungen:
ON haeuser.schluessel1918 = statamtstrassen.schluessel und
ON haeuser.strassennr = statamtstrassen.schluessel
Ich werde darauf hingewiesen, dass entweder die Straße 999999 in der Tabelle strassen1 fehlt oder ich habe mich beim Eingeben des Satzes mit der ID=620 in der Tabelle haeuser vertippt. Wenn ich die Programme Hausnummer alt zu Hausnummer neu, oder Hausnummer neu zu Hausnummer alt aufrufe, bemerkt man diesen Fehler überhaupt nicht, weil ja nur diejenigen Sätze angezeigt werden, bei denen die strassennr in beiden Tabellen vorhanden ist.

Siehe hierzu im Manual MySQL Cookbook das Kapitel 12 Using Multiple Tables.


Änderungsstand dokutabellenverkn: 22-Okt-2014 Upd 19-Dez-2018
Heinz Wember

Änderungsstand Programm: 27-Feb-2019
Heinz Wember