Index und Zugriff
Datenzugriff - warum?
Daten, die nicht ausgewertet werden können, haben wenig Wert in der Datenverarbeitung. Xbase++ bietet zwei grundsätzliche Zugriffsmethoden an:
in der Reihenfolge der Satzerstellung
Grob vereinfacht kann man eine dBase-Datei als einen Karteikasten betrachten, dessen Karten man in der Reihenfolge, in der sie in den Kasten gelegt wurden, auch lesen kann.
Der entsprechende Wert, nach dem die Datensätze gelesen werden, ist die sogenannte Satznummer. Der erste Satz hat die Satznummer 1, der zweite Satz die Satznummer 2, und so weiter.
Mit diesem Zugriffsmechanismus kann auch auf einen beliebigen Satz zugegriffen werden, wenn seine Satznummer bekannt ist.
in beliebiger (wahlfreier) Folge
Sortieren
Der klassische Weg wäre es, die Datensätze nach bestimmten Kriterien zu sortieren. Bei einer Einzelplatz-Anwendung mag ein solches Verfahren noch akzeptabel sein, wenn die Datenmenge nicht zu gross ist, aber ab einem bestimmten Datenvolumen, oder spätestens wenn wir mit Multithreading oder von mehreren Arbeitsplätzen in einem Netzwerk auf die Daten zugreifen, entfällt der Sort.
Nichtsdestotrotz gibt es heute immer noch einen Sort-Befehl im Sprachumfang von Xbase++.
Über einen Index
Ein Index ist - vereinfacht gesprochen - eine Liste, die einem bestimmten Such- oder Sortierkriterium die Nummer des Datensatzes zuweist, in dem eine Übereinstimmung mit dem Suchkriterium vorhanden ist.
Beispiel:
Müller | Peter | (1) Baumann | Klaus | (2) Bender | Erika | (3) Adeno | Rita | (4)
Ein Index über den Nachnamen könnte (grob vereinfacht) so aussehen:
Adeno | (4) Baumann | (2) Bender | (3) Müller | (1)
Ein Programm, dass die Datei nach Kundenname lesen soll, liest den Index und greift dann über die Satznummer auf die eigentliche Datei zu. Wie gesagt, diese Darstellung ist grob vereinfacht.
Während SQL von Hause aus auf solche Zugriffe spezialisiert ist, müssen wir in Xbase++ einen solchen Index immer selbst erzeugen.
Für den Aufbau des Index und die interne Wartung des Index ist die Xbase++-Laufzeitumgebung verantwortlich, so dass wir uns darum nicht kümmern müssen.
Index-Arten
NDX
Die ursprünglichen Clipper-Indexdateien hatten die Erweiterung NDX und waren quasi der erste Wurf.
NTX
Spätere Clipper-Versionen brachten mit den NTX-Dateien eine verbesserte und robustere Variante auf den Markt, die auch heute noch von Xbase++ unterstützt wird.
Ursprünglich konnte eine NTX-Datei nur einen Index-Begriff unterstützen, dies ist jedoch inzwischen überholt, so dass mit einer NTX-Datei mehrere Index-Begriffe verwaltet werden können.
CDX
FoxPro brachte eine Erweitung der Index-Dateien, in dem CDX-Dateien als erste mehr als einen Index-Begriff verwalten konnten, und auch das "starre" Verhältnis von einem Datensatz zu einem Index-Satz aufgebrochen wurde durch die sogenannten "roll-your-own" Index-Dateien.
Struktur einer Index-Datei
Index-Datei
Darunter verstehen wir hier die physische, auf einem beliebigen Medium gespeicherte Datei. Der Name der Datei kann, muss aber nicht dem Namen der zugrundeliegenden dBase-Datei entsprechen. Viele Programmierer benennen die Index-Datei jedoch so, wie auch die dBase-Datei heisst.
TAG
Unter Tag (englisch, nicht der deutsche Tag) versteht man eine Kombination aus Index-Begriff und Zugriffsweg.
Eine NTX-Datei kann genau ein Tag enthalten, während eine CDX-Datei eine theoretisch unbeschränkte Anzahl Tags enthalten kann (wobei das Speichermedium auf der einen Seite und die Perfomance auf der anderen Seite deutliche Grenzen setzen können).
Index-Begriff
Der Index-Begriff beschreibt, aus welchen Feldern und/oder Funktionen sich der Such- bzw. Sortier-Begriff zusammensetzen soll.
Dieser Begriff muss in der Xbase++-Sprache sinnvoll auszuwerten sein.
Beispiel:
Dateiaufbau: NACHNAME | CHAR | 30 VORNAME | CHAR | 30 STRASSE | CHAR | 30 PLZ | CHAR | 10 ORT | CHAR | 40 KUNDNUMMER | NUM | 10,0
Gültige Indexbegriffe wären:
NACHNAME+VORNAME VORNAME+NACHNAME PLZ+NACHNAME KUNDNUMMER Str(KUNDNUMMER) Left(NACHNAME, 10) NACHNAME+"PETER"
Ungültige Indexbegriffe wären:
NACHNAME+LAND (Land ist in der Datei nicht definiert) ORT+KUNDNUMMER (alle Elemente im Index-Begriff müssen den gleichen Typ haben)
Zugriffsweg
Diesen Begriff habe ich aus einem Host-System übernommen. Es beschreibt die Reihenfolge der Schlüssel und die zugeordneten Satznummern, um auf die korrespondieren Datensätze zugreifen zu können.
Die Xbase++-Laufzeitumgebung übernimmt die Verwaltung und Aktualisierung des Zugriffsweges, sofern es nicht ein "roll-your-own" Index ist.