Regelmäßig werden Fragen
gestellt wie "Was für ein Standard-Datenbanksystem
steckt in allegro?"
oder "Kann man eine allegro-Datenbank mit SQL abfragen?"
Man erlebt in solchen Unterhaltungen leicht, wie der
eine sehr viel von relationalen Datenbanken versteht, von allegro aber ganz wenig, bzw. umgekehrt. Dann wird es mühsam und
Fehleinschätzungen
sind auf beiden Seiten vorprogrammiert. Um diesem Übelstand
abzuhelfen
und das gegenseitige Verstehen zu fördern, wird hier der Versuch
gemacht,
vergleichende Aussagen zu den Konzepten und Eigenschaften der beiden
Datenbankwelten
zu machen, und zwar mit möglichst wenig Fachjargon und mit Blick
mehr
auf die Praxis als auf die Theorie. Diese "Welten" sind von höchst
unterschiedlicher Größe und Bedeutung, das ist klar, doch
darum
geht es hier nicht, schon gar nicht um die immer nur für konkrete
Anwendungen, aber nicht allgemein entscheidbare Frage "Was ist besser?"
Wer aber wegen eines konkreten Projekts vor eben dieser Frage steht,
soll
hier Hilfen zur Einschätzung erhalten. Zudem werden de facto immer
wieder
relationale Daten nach allegro überführt bzw. soll Datenaustausch
in umgekehrter Richtung stattfinden, und auch dabei können ein
paar übergreifende Kenntnisse nützen.
Ab Version 25 gibt es
vom System her eine Unterstützung für den Austausch zwischen
den Welten: aresqa.
Sicher kann man noch viel
mehr sagen, vermutlich müssen einige der Aussagen weiter
präzisiert
oder modifiziert werden. Jeder Leser ist eingeladen, konstruktive
Kritik
zu üben, damit wir diese Übersicht weiter verbessern
können.
Für den vorliegenden Text ist
Dank zu sagen an Thomas Berger
(Bonn), Mathias Manecke (DB Leipzig) und Dr. Annemarie Tews
(UB Leipzig) für Beiträge und Diskussionen.
Relationale Datenbank-Management-Systeme (RDBMS) und allegro,
das sind recht unterschiedliche Gebilde, die man im Grunde nicht leicht
vergleichen kann. Vor allem waren die Entwicklungsziele nicht
dieselben.
RDBMS wurden primär (doch nicht ausschließlich) entwickelt
mit
Blick auf solche Anwendungen, die Berechnungen und Auswertungen
erfordern,
also im weitesten Sinne Faktensammlungen sowie Geschäfts- und
Verwaltungsanwendungen.
allegro
dagegen zielte von vornherein (aber auch nicht ausschließlich)
auf
strukturierte Textdaten; dazu gehören als Spezialfall
bibliothekarische
Katalogdaten. (Als eine dritte Kategorie könnte man vielleicht die
Internet-Suchmaschinen betrachten wollen, die aber nur für das Retrieval
in unstrukturierten Texten geschaffen wurden, nicht für die Verwaltung
dieser Texte. Daher kann man sie kaum als Datenbanksysteme bezeichnen,
und nur um solche geht es hier.)
Die nachfolgende Übersicht versucht, für Vertreter
beider Umgebungen verständlich zu sein, stellt hauptsächlich
strukturelle Aspekte gegenüber und beschränkt sich auch in
dieser
Hinsicht auf wenige, für Bibliothekszwecke wichtige Punkte.
Für
eine Einschätzung in konkreten Zusammenhängen wird man
meistens
noch weitere Kriterien berücksichtigen müssen, bis hin zu den
Kosten, die hier außen vor bleiben. (Bibliotheken sind auf's
Ganze
gesehen, und kommerziell betrachtet, nur eine Nische, das darf man
nicht
verkennen.)
Vor Jahren
hat einmal die DFG in ihren Förderrichtlinien
empfohlen, Standard-Datenbanksysteme statt proprietärer
(firmeneigener)
Lösungen zu bevorzugen. De facto hieß das, man solle ein
RDBMS
einsetzen, denn andere umfangreichere und durchgesetzte Standards gab
es
und gibt es noch immer nicht, etwa für sog. "objektorienterte"
Datenbanken.
Die DFG-Empfehlung entsprang nicht einer Erkenntnis, solche Datenbanken
seien
die bestgeeigneten für bibliothekarische Zwecke - und bis heute
hat sich das weder theoretisch noch praktisch erwiesen.
Hinter der Empfehlung stand vielmehr die Hoffnung, dadurch zu
herstellerunabhängigen
Anwendungen kommen zu können. Idealerweise, so die Vorstellung,
sollte
man die Hardware
und das Datenbanksystem wechseln können, ohne
viel Aufwand in die Anpassung der Anwendungssoftware stecken zu
müssen.
Diese Hoffnung hat sich noch nirgends überzeugend erfüllt,
die
Abhängigkeit der Anwendungssoftware von den spezifischen
Besonderheiten
einer Datenbankgrundlage ist denn doch immer recht groß: insbes.
hat jedes SQL seine Eigenheiten. Ist der Standard also nur
vermeintlich ein
solcher, oder ein zu schwacher?
Das Entity-Relationship-Modell, die Grundlage der RDBMS-Theorie
und -Praxis, ist ein mathematisch fundiertes Konstrukt. Es sachgerecht
anzuwenden ist eine anspruchsvolle Aufgabe. Dazu gehört die
Erstellung
einer sog. "normalisierten" Tabellenstruktur. Wenn RDBMS häufig
eingesetzt werden, ohne
auf ein schlüssiges, gründlich
durchdachtes, theoretisch sauberes ER-Modell aufzusetzen, dann ist das
nicht dem
relationalen Konzept, sondern den Entwicklern anzulasten. Zu fragen
bliebe
also, ob sich bibliothekarische Sachverhalte in einem ER-Modell
wirklich
elegant und effizient abbilden lassen. Diese sehr komplexe Aufgabe ist
wohl noch immer nicht umfassend und allgemeingültig gelöst.
Noch
jeder, der es versuchte, konnte erleben, wie auf diesem Gebiet viel
mehr Teufel in viel mehr Details stecken als man gedacht hätte und
infolgedessen viel mehr Zeit zur Umsetzung gebraucht wird als man
angesetzt
hatte, unerwartet viele Tabellen nötig sind und die
Anwendungsprogramme
deshalb unerwartet groß und kompliziert werden. Es kommt
erschwerend
hinzu: ein theoretisch stimmiges Modell allein reicht nicht aus. Zwar
wird oft ein Modell mit einigen hundert oder ein paar tausend
Datensätzen gut funktionieren, dann aber bei weiterem Anwachsen
"in
die Knie gehen". Es gibt manche Dinge, über die man bei kleineren
Datenmengen
gar nicht nachzudenken braucht, die mit Millionen Daten aber auch auf
stärkster
Hardware nicht mehr zufriedenstellend schnell funktionieren (z.B.
"views"
und vor allem "joins"). Solche Effekte, die dann leicht zu Kompromissen
zwingen, sind bei allegro, so darf man aus Erfahrung sagen,
weniger
gravierend.
Relationale Datenbanken | allegro
(Unterstrichen-kursive
Wörter verweisen auf das
Glossar der allegro-Begriffe) |
Struktur der Daten |
|
Zentrales
Konzept
der relationalen Welt ist das Entity-Relationship-Modell
(ER-Modell). Dessen Grundlage ist es, die in der Datenbank
abzubildenden Sachverhalte
in Eigenschaftsgruppen (Entitäten) zu gliedern, wobei jede
Ausprägung
einer jeden Entität mit jeder anderen Ausprägung dieser oder
einer anderen Entität in Beziehung stehen kann (d.h.
jeder Datensatz mit jedem anderen verknüpft sein kann). Physisch
ist dieses Modell in RDBMS in Tabellenform realisiert. Jede Tabelle
repräsentiert eine Entität, jede Zeile (auch "Tupel" genannt)
eine Ausprägung der Entität, jede Spalte ("column") eine
Eigenschaft ("attribute").
Wichtigste Aufgabe bei der Entwicklung einer relationalen Datenbank- Applikation ist also die Umsetzung des abzubildenden Sachverhaltes in ein ER-Modell (Normalisierung nach Codd), um aus diesem die Tabellenstruktur (Codd sagte "relation" statt "table") zu entwickeln. (Ist das nicht sinnvoll möglich, so ist das RDBMS von vornherein nicht das geeignete Werkzeug!) |
Logisch
gesehen
entspricht einer Entität in allegro einem Satztyp.
Die Tabelle als Konzept gibt es nicht. In einer Datenbank-Datei
können
Sätze aller Typen zugleich ohne strukturelle Zuordnung vorkommen.
Ein Datensatz ist ein zusammenhängender, durch Steuerzeichen
strukturierter
Text. Wodurch der Satztyp bestimmt wird und welche Funktionen und
Zusammenhänge
er hat, ist Sache der Parametrierung,
nicht der Dateistruktur. Relationen können im Prinzip genau so wie bei einem RDBMS durch Bezugnahme auf den Primärschlüssel eines anderen Datensatzes gebildet werden. Eine automatische Integritätsüberwachung für die Datensätze gibt es nicht. Die Primärschlüssel werden durch geeignete Index-Parametrierung gebildet. Über programmierte Validierung lassen sich auch Elemente der Integritätsüberwachung (z.B. Verhinderung von Doppeleinträgen, Löschverweigerung für verknüpfte Sätze) in eine Anwendung einbauen. |
Eine
Tabelle
hat keine bestimmte Ordnung. Selektierte Teilmengen können aber
per
SQL
nach jedem Attribut (Tabellenspalte) sowie nach Kombinationen von
Attributen
geordnet werden.
Ein Index dient nicht der geordneten Sicht auf die Daten, sondern der beschleunigten Selektion bei größeren Tabellen. Der Index selbst wird nicht sichtbar. Will man das erreichen, ist dafür eine eigene Tabelle zu machen. Neben realen kann es auch virtuelle Tabellen geben, sog. "Views". Die Software zeigt dann genau diejenigen Dinge, die für eine Funktion oder von einem Nutzer gebraucht werden, doch es gibt dafür keine wirkliche Tabelle. |
Eine Datenbank-Datei hat keine bestimmte Ordnung. Geordneter Überblick wird durch Indexieren ermöglicht (s.u.), wobei die Register durchgeblättert und zur Bildung von Ergebnismengen benutzt werden können. Ergebnismengen können nach mehreren Kriterien auf- und abwärts sortiert angezeigt werden. Ein eigenes Sortierprogramm kann Ordnungen herstellen (offline, für Reports und Listen), die sich nicht unmittelbar aus Feldinhalten oder aus den Registern ergeben. Die Indexierung ist das zentrale Element zur Präsentation der Daten in geordneter Form. Daneben können Ergebnismengen nach Elementen der Kurzanzeige, aber auch nach jedem Feldinhalt geordnet werden ("View"-Technik). |
Jede Zeile einer Tabelle kann man als Datensatz ansehen, jeder Datensatz hat genau soviele Felder ('Attribute') wie die Tabelle Spalten hat, wobei einzelne leer sein können. Auch ein leeres Feld braucht jedoch Platz. (Wieviel, hängt von der internen Architektur ab. Manche füllen die Spalten mit Leerzeichen auf.) Durch Vermeidung von Redundanz (Normalisierung!) kann man andererseits Platz sparen. | Jeder
Datensatz
enthält nur die jeweils belegten Felder. Es gibt im Grunde keine leeren, sondern abwesende Felder. Ein leeres Feld tritt im Datensatz gar nicht in Erscheinung, belegt also Null Byte. Es gibt Kategoriesysteme mit über 1000 Feldern (z.B. Pica: über 1.400), von denen dann viele nur selten belegt sind, da macht das denn doch etwas aus. |
Die
Struktur
der Datensätze (der Tabellenzeilen) ergibt sich sozusagen aus
der Kopfzeile der Tabelle, in der steht, was die einzelnen Spalten
bedeuten
und was für Eigenschaften sie haben.
Moderne Systeme speichern die "Kopfzeilen" aber in besonderen Tabellen der Datenbank. Im Datenfeld selbst, das ist ein Unterschied zu allegro, steht kein Feldname oder Kategorienummer, sondern allein die Position bestimmt die Bedeutung des Elementes. Jede Tabellenspalte hat einen Namen (das könnte auch z.B. eine MAB-Kategorienummer sein)und wird in Abfragen und Programmen immer über diesen Namen (zusammen mit dem Namen der Tabelle) angesprochen. In SQL dient der Befehl CREATE zur Definition von Tabellen, Views und Indizes. |
Eine
Konfigurationsdatei
(CFG) legt fest, welche Felder es in einer Datenbank geben darf. Dazu
dient
die "Kategorieliste", die jedem logischen Datenfeld eine Nummer (engl.
tag)
zuordnet und seine Eigenschaften definiert. Die Reihenfolge dieser
Nummern
hat keine funktionale Bedeutung, die Nummern müssen nicht
fortlaufend
sein. Zu entscheiden ist, ob es 2-, 3- oder 4-stellige
tags
sein sollen; nur die erste Stelle soll eine Ziffer sein. In den
Parameterdateien
und in der FLEX- Makrosprache werden diese Nummern (und nicht die
Feldnamen)
benutzt, um Felder anzusprechen. Es gibt Kategoriesysteme mit über
1500 Kategorien (wobei aber viele Wiederholungsfelder mitgezählt
sind).
Die Konfiguration legt nicht fest, ob und wie die Felder indexiert oder angezeigt werden. Das ist die Aufgabe von Parameterdateien. |
Jedes Feld hat einen Typ (numerisch, Datum, Text, u.a.), Textfelder haben jeweils eine festgelegte maximale Länge. Vorteil: die typspezifischen Eigenschaften können für Selektion und Integritätsüberwachung ausgenutzt werden. (Soundex-Suche bei Text, Größer-, Kleiner-Vergleich bei Datum, not nul und unique bei Primärschlüssel ...) | Jedes Feld enthält Text (automatisch bis zu 3000 Zeichen je Feld), jedoch kann jedes Feld auch zum Rechnen verwendet werden. (Neben einer Zahl kann das Feld dann trotzdem noch beliee andere Angaben enthalten.) Bei der Eingabe können programmierbare Validierungen den Inhalt hinsichtlich gewünschter Eigenschaften abtesten und ggfls. Fehlermeldungen produzieren. |
Felder
sind
nicht
wiederholbar - das würde den Grundsätzen der Theorie
widersprechen.
Sollen z.B. 5 Schlagwörter eingebbar sein, wären dafür 5
separate
Tabellenspalten einzurichten.
Soll ein Feld frei wiederholbar sein (Paralleltitel, Mitarbeiter) so ist der "saubere" Weg, die sog. 1. Normalform, es in eine eigene Tabelle auszulagern. Dies spart Speicherplatz und das Feld ist dann auch wirklich "frei" wiederholbar, nicht nur zwei oder sieben oder fünfzigmal. Falls solche Angaben allerdings eine Reihenfolge haben (1. Verfasser vor 2.), oder qualifiziert sind (Personen als Verfasser, Herausgeber oder Mitarbeiter) oder beides (Herausgeber vor 1. Mitarbeiter vor 2. Mitarbeiter), müssen in dieser zusätzlichen Tabelle zusätzliche Spalten zum Erhalt der Reihenfolge und Funktionsbezeichnungen eingefügt werden. Für die Anzeige eines Datensatzes müssen diese über Tabellen verstreuten Angaben zusammengesetzt und dem Anwender präsentiert werden. Nach einer Veränderung müssen die Angaben wieder auf alle betroffenen Tabellen verteilt werden. Der Datensatz existiert dann nur als logische Einheit, seine Teile sind verstreut. Eine halbwegs funktionsreiche bibliothekarische Anwendung kommt schnell auf Dutzende bis Hunderte von verschiedenen Tabellen und Hilfstabellen, für die dann Suchanfragen und Views programmiert werden müssen. Auf die Leistung und die Durchführbarkeit von Änderungen wirkt sich dies nachteilig aus. |
Jedes
Feld ist
belie
wiederholbar, falls man dies nicht in der CFG ausdrücklich
verbietet.
In den meisten allegro-Anwendungen sind mehrfach auftretende Angaben in sogenannten Wiederholkategorien abgelegt: Hinter der Kategorienummer wird ein Folgezeichen "hochgezählt": 2,3,4,..., A,B,C, ..., a,b,c, ... Wenn nötig, kann man auf diese Art auf eine etwa 200fache Wiederholung kommen, die Reihenfolge bleibt dabei erhalten (sie wird durch die Ordnung der Folgezeichen bestimmt). Die Funktion z.B. von Personen kann je nach Anwendung auch an Kategorienummern gebunden sein (alle Herausgeber kommen dann vor allen Mitarbeitern), in anderen ist die Funktionsbezeichnung oder ein Kürzel dafür in den Daten selbst enthalten, angehängt oder in einem Teilfeld. Die Reihenfolge ist dann stets die der Eingabe, dafür ist man freier in der Vergabe von Funktionsbezeichnungen. Hat man hier einen undurchdachten Entwurf gemacht, kann das nachträgliche Ändern schwierig werden. Ein allegro-Datensatz kann nicht mehr als 500 Indexeinträge erzeugen und darf auch nicht größer als 20.000 Byte sein. Für einen Datensatz 200 Schlagworte und 200 beteiligte Personen (soll schon vorgekommen sein) und diverse Stichworte aus Freitextbeschreibungen und Dutzende von Parallelsignaturen, die alle recherchierbar sein sollen, bringen das System an oder über seine Grenzen. |
Soll
ein neues
Feld eingeführt oder die maximale Länge eines Textfeldes
vergrößert werden, hat man u.U. die gesamte Tabelle zu
reorganisieren
(geht nicht im laufenden Betrieb), bei neueren Systemen nicht
unbedingt.
Die eigentliche Arbeit bei der Einführung neuer Felder ist aber die Festlegung der damit verbundenen Funktionen. Das neue Attribut hat ja einen Zweck; diesen gilt es in veränderte Anzeigemasken, Suchfunktionen, Ausgaberegeln usw. umzusetzen. Der Aufwand für die Reorganisation der Tabelle ist in Bezug auf den Gesamtaufwand zu vernachlässigen. |
Das Einführen eines neuen Feldes geschieht durch eine Eintragung in der Kategorieliste der CFG-Datei. (Das geht jederzeit, auch im laufenden Betrieb.) Von da an kann jeder Datensatz, auch jeder schon vorhandenene, dieses Feld zusätzlich erhalten, ohne dafür eine Datei reorganisieren zu müssen. Um das neue Feld auch indexiert und angezeigt zu bekommen, ist es in die zuständigen Parameterdateien einzubauen. Für die Erfassung ist das neue Feld in ein Formular oder die "Abfrageliste" einzufügen, evtl. ist eine programmierte Validierung zu parametrieren (für die Eingabeüberprüfung). |
Felder ('Attribute') dürfen in sich strukturiert sein, jedoch wird so etwas von der Theorie und z.B. von SQL nicht unterstützt (denn Attribute sollen "atomar" sein, unteilbar also). Dafür hätte man eigene Anwendungsprogramme zu schreiben. Z.B. könnte man 5 Schlagwörter auch in eine Tabellenspalte hintereinander schreiben (vorausgesetzt, man hat die maximale Länge hoch genug eingestellt), aber mit SQL kann man dann nicht die Schlagwörter einzeln indexieren. Es können (redundante) zusätzliche Tabellen dafür angelegt werden, um das Suchen zu unterstützen. | Felder
können
in sich belie strukturiert sein, normalerweise werden die
Teilfelder
durch Steuerzeichen wie $a, $b usw. identifiziert (typisch für MARC-Formate),
doch es reicht auch eine konsistente Interpunktion.
Die Parametrierung bietet viele Möglichkeiten für den Umgang mit Teilfeldern und anders strukturierten Feldinhalten, ebenso die Verfahren der Eingabe und Bearbeitung. Attribute sind also keineswegs unteilbar sondern lassen sich in jeder sinnvollen Weise zerlegen. Insbesondere können Teilfelder individuell indexiert werden. |
In
moderneren
Datenbanken kann man oft "Objekte", also
Textdokumente, PDF-Dateien, Video- und Soundclips, Graphiken, komplexe Tabellenkalkulationen einbeziehen und anzeigen, abspielen oder bearbeiten. Dies ist vergleichbar mit "Plugins" in Internet- Browsern, die im Browserfenster bzw. sogar nur Ausschnitten davon agieren. |
Die Organisation solcher Objekte ist dem Anwender selbst überlassen. In geeigneten Kategorien des Datenformats können allerdings Links auf diese Objekte hinterlegt werden, über sogenannte "Flips" unterstützt allegro dann den Aufruf einer Anwendung für die Anzeige etc. der Objekte. Dies ist vergleichbar mit den Helper-Applikationen in Internet-Browsern, die installiert und bekanntgegeben werden. |
Beziehungen zwischen Tabellen werden durch IdNummern oder andere Schlüssel dargestellt. Wenn z.B. Tabelle A in Spalte 5 eine Nummer hat, die innerhalb A eindeutig ist, können sich andere Tabellen auf diese Nummer beziehen, d.h. in Tabelle B kann z.B. Spalte 7 Nummern enthalten, die in A5 vorkommen müssen. So werden auch Bestandteile zusammengehalten, die zu einem logischen Satz gehören, wenn dieser physisch auf mehrere Tabellen verteilt ist (s.o.). In einem View können genau die Elemente erscheinen, die für den Betrachter wichtig sind, d.h. keine IdNummern u.dgl., sondern Klartexte. | Beziehungen
zwischen Datensätzen werden durch
IdNummern
oder andere Schlüssel dargestellt. Das Prinzip ist logisch gesehen
dasselbe wie in relationalen Datenbanken. Für die Anzeige von Datensätzen und für die Indexierung gibt es außerdem eingebaute Mechanismen, die eine IdNummer durch einen Klartext ersetzen. Die scheinbare "Flachheit" der Dateien wird dadurch in ein potentiell komplexes Beziehungsgeflecht verwandelt, die Organisation der Dateien selbst und die Austausch- und Bearbeitungsvorgänge bleiben aber immer unkompliziert. |
Für
den
schnellen Zugriff und für geordnetes Browsing kann jede Spalte
jeder
Tabelle indexiert werden. Es wird jeweils der gesamte Feldinhalt
indexiert. Eine Zerlegung des Feldinhalts z.B. für eine
Stichwortindexierung
gibt es normalerweise nicht, dazu müssen zusätzliche
Programme
geschrieben oder Extra-Tabellen angelegt werden, in jedem Fall ein
recht
hoher Aufwand. Ein Index kann in SQL nicht direkt
angezeigt und
durchgeblättert werden, sondern nur über Views. Ein Index hat
eine andere Funktion als bei allegro! (s.o.)
|
Für
den
schnellen Zugriff und für geordnetes Browsing kann jedes Datenfeld
oder Teilfeld indexiert werden. Die Indexdatei einer Datenbank, eine
B*-Baumstruktur,
kann bis zu 11 Register umfassen. Die Parametrierung
ermöglicht jede Art der Manipulation des Feldinhaltes sowie eine
Mehrfachindexierung
eines Feldes und auch das Zerlegen in belieer Weise
(Stichwortindex!).
Bei einem String-Index (Titel) können Nichtsortierwörter wie
Artikel am Anfang von der Ordnung ausgeschlossen werden.
In Registern kann man blättern, sogar trunkieren, und direkt Ergebnismengen bilden (mit Operatoren UND, ODER, NICHT). Registerausschnitte kann man kopieren. In Registern können Verweisungen erscheinen, die bei Anwahl zu einem anderen Registerabschnitt hinführen. Mehrere oder auch alle Felder können im selben Register indexiert werden. Jedes Feld oder Teilfeld kann in unterschiedlicher Form in mehreren Registern indexiert werden. Innerhalb eines Registers können durch beliee Präfixe mehrere Abteilungen (logische Register) gebildet werden. Die Zahl 11 ist also keine Grenze. Register 11 kann aber nur mit bestimmten Privilegien benutzt werden (Datenschutz). Anzeige und Sortierung des Index sind dennoch trennbar, denn Sortierhilfen (Reduzierung auf Kleinschreibung, Einfügen von Leerschritten ...) können auch verborgen werden. In Client- Server-Anwendungen kann man noch mehr tun, um Verwirrung zu vermeiden. |
Zusammengesetzte Schlüssel (aus verschiedenen Spalten) sind meistens möglich (also nicht unbedingt plattformunabhängig). Wenn ja, ist zu fragen, was passiert, wenn z.B. das erste von zwei Feldern nicht besetzt ist. D.h. die Frage ist, ob es Möglichkeiten der Ausnahmebehandlung gibt. | Beliee zusammengesetzte Schlüssel sind möglich. Die Parametrierung kann sinnvolle Behandlungen von Fällen vorsehen, wo einzelne Teile des Schlüssels im Datensatz nicht vorkommen. Ein allegro-Register ist, im Vergleich gesehen, eher so etwas wie ein "View", eine virtuelle Tabelle also. (Der Index wird in Realzeit aktualisiert) |
Hierarchische Datensätze gibt es nicht, sie können nur als Teilmengen von Tabellen dargestellt werden. D.h. sie werden nicht durch Relationen zwischen mehreren Tabellen, sondern durch Relation einer Tabelle zu sich selbst dargestellt. Je nach Architektur sind verschiedene Strategien zur Lösung der satzübergreifenden Suche (sog. Schiller-Räuber-Problem) realisierbar. | Es gibt mehrstufige hierarchische Sätze, aber auch eine Abbildung von Hierarchien durch Satzverknüpfungen (heute die bevorzugte Methode). Dafür kann auch eine satzübergreifende Suche mittels Parametrierung eingerichtet werden (sog. "Schiller-Räuber-Problem"). |
Zugriffsfragen |
|
Auch ohne Index kann (mit Hilfe des Befehls SELECT von SQL) auf alles zugegriffen werden. Kleinere Datenbanken (unter 10.000 Sätze, nur wenige sind größer, auf's Ganze gesehen) werden oft ohne Index betrieben! Bei größeren Datenbanken dauert dies jedoch für den Normalbetrieb zu lange, besonders bei geordneter Anzeige und bei den beliebten "Joins" (Verbindung von Tabellen über gemeinsame Attribute). | Ohne Index kann mittels Volltextsuche zugegriffen werden. Die Datenbankgröße ist hier ebenfalls kritisch. Ca. 30 Minuten für 1 Mio Datensätze sind realistisch. Es wird praktisch keine Datenbank ohne Index betrieben, auch sehr kleine nicht, denn der Index ist integraler Teil des Konzepts. Die Indexzugriffe sind auch bei mehr als 1 Mio Sätzen noch sehr schnell. "Join"-Funktionen werden logisch gesehen über den Index bzw. über Satzverknüpfungen realisiert. |
Fast jede Art von Abfrage und Auswertung kann mit Hilfe des SQL-Befehls SELECT programmiert werden, bis hin zur Ordnung und Gruppierung von Ergebnismengen. | Zugegriffen wird i.d.R. über die Register, mit logischen Kombinationen und Restriktionen können Ergebnismengen eingeschränkt werden. Erstellung komplexer Listen mit spezifischer Ordnung und Gruppierung oder Auswertung erfordert Kenntnisse der Parametrierung (Exportsprache). Die Windows- Programme erleichtern die Listensretellung sehr stark durch die neue "View-Technik" (V20a). |
Typische
Anfragen an eine relationale Datenbank:
"Bitte alle Angaben zu XYZ!" (Wobei XYZ typischerweise relativ kurz ist, etwa ein Name oder eine Bezeichnung, und seine genaue Schreibweise meistens bekannt.) "Wieviel Umsatz machten die Außendienstler im letzten Quartal?" "Welche Produkte waren im Vorjahr die Renner?" "Bei welchen Lieferanten kaufen wir am meisten?" "Welche Rechnungen des Vormonats sind noch offen? Was ist deren Summe?" Der Umgang mit Zahlen, das wird daraus klar, ist äußerst wichtig. Mit der Sprache SQL kann man solche Anfragen formulieren und Antworten in der gewünschten Form erhalten (geeigneter Datenbankentwurf vorausgesetzt). In Bibliotheken sind Fragen solchen Typs z.B. in den Geschäftsgängen Ausleihe und Erwerbung interessant, kaum im Katalogwesen. |
Typische
Anfragen
an eine allegro-Datenbank:
"Bitte alle Angaben zu XYZ!" (Wobei XYZ oft ziemlich lang ist und seine genaue Schreibweise häufig nicht bekannt.) "Ist eine deutsche Ausgabe von 'The agony and the ecstasy' vorhanden?" (Wobei oft unbekannt ist, wie der deutsche Titel lautet (hier 'Michelangelo').) "Welche Werke von Tschaikowsky sind da?" (Und man erwartet eine vollständige und nach Werktiteln geordnete Liste, obwohl es über 30 Schreibweisen des Namens gibt und auch die Werktitel immer wieder anders geschrieben werden.) "Was gibt's zum Thema 'Drogensucht'?" (Egal, ob dieses Wort im Titel vorkommt oder z.B. 'Rauschgiftsucht' etc., auch englische Titel sind erwünscht, auch Arbeiten über Alkoholismus - oder solche eben gerade nicht.) Diese Fragen machen eins deutlich: Man braucht sichtbare Register zum Browsing und auch solche Dinge wie Einheitstitel und Normdaten für Namen und Schlagwörter. |
Datenaustausch |
|
Die
Ausgabe
von Daten in der jeweils benötigten Form ist Sache der Anwendungsprogrammierung.
SQL selber hat dazu nur geringe Mittel, es liefert nicht viel mehr als
Tabellenzeilen mit einem Trennzeichen (meist TAB) zwischen den Feldern,
ein sog. "CSV-File".
Sehr erleichtert wird das Erstellen von Listen aber durch Reportgeneratoren. Flexible, leicht erstellbare Reports sind der wichtigste Zweck vieler RDBMS-Lösungen. Sie bilden eine wichtige Komponente von "Management-Informationssystemen". Datensätze im MAB-Format auszugeben ist dagegen eine ganz andersartige Aufgabe. |
Es existiert eine Exportsprache (eine eigens entwickelte Programmiersprache), mit der man Daten in fast belieer Aufbereitung ausgeben kann (z.B. auch in MAB oder MARC oder in der Form einer CSV-Datei, wie ein RDBMS es einlesen kann). Aus Gründen der Effizienz (z.B. hohe Geschwindigkeit beim Indexieren) ist die Sprache sehr kompakt und daher nicht leicht zu erlernen. Zwar kann man vielseitige Module schaffen, und es gibt solche für verschiedene Typen von Listen, aber so etwas wie einen universellen Reportgenerator gibt es noch nicht. Reports sind in den meisten allegro-Anwendungen eher Nebenprodukte. Oft reichen die Register oder die Kurzlisten, wenn sie geschickt gestaltet sind. |
Die Umwandlung von Fremddaten ist gleichfalls durch Anwendungsprogramme zu lösen, SQL kann nur eine fertig vorbereitete Struktur verarbeiten (Felder mit Trennzeichen, CSV-Files also). Oft wird die Umwandlung mit eigenen Perl-Programmen o.a. erledigt. | Es
existiert
eine Datenmanipulationssprache, (sog. "Importsprache")
mit der man Fremddaten fast belieer Struktur in die eigene Struktur
umwandeln kann, bevor man sie mit dem DOS-Programm UPDATE oder dem
Windows-Programm
a99
in die Datenbank einmischt. Auch CSV-Files kann man leicht importieren,
denn sie haben eine immer gleiche Anzahl von Trennzeichen, das reicht
als
Struktur aus.
Das Vorbereiten der Daten kann aber auch mit Perl o.ä. geschehen. Ab V25 kann der Austausch in beiden Richtungen dank aresqa in vielen Fällen ganz ohne Parametrierung auskommen. |
Programmierung |
|
SQL kann in andere Programmiersprachen (z.B. auch Perl oder PHP) eingebettet werden, insbes. für Web-Anwendungen. | Neben den autonomen ("monolithischen") Zugriffsprogrammen (DOS, UNIX, Windows) gibt es für alle Plattformen den avanti-Server, dessen Abfragesprache in andere Sprachen (z.B. PHP oder Perl, für Web-Anwendungen) eingebettet werden kann. |
Ein RDBMS kann nur in einer Anwendungsumgebung (geschrieben z.B. in C, Visual Basic oder einer anderen geeigneten Sprache) arbeiten. Es hat keine für Anwendungen unmittelbar geeignete Benutzungsoberfläche. Es gibt jedoch mächtige Entwicklungssysteme, mit denen maßgeschneiderte (meistens maskenorientierte) Anwendungen ohne viel Programmierung interaktiv erstellt werden können. Die Übertragbarkeit auf ein anderes RDBMS ist dann aber wieder in Frage gestellt, auch die Optimalität für große Datenmengen ist nicht unbedingt gegeben. Wenn es aber um ad-hoc-Schnellschüsse für begrenzte Zwecke geht, hat man dafür hervorragende Werkzeuge. | allegro
enthält
alle Mittel, eine Anwendung komplett zu gestalten, bis hin zu einer
mehrsprachigen
Oberfläche. Im Prinzip braucht man also keine Programmiersprache
zu können.
Zur normalen Benutzung einer Datenbank (Katalogisieren, OPAC) braucht
man
nichts zu programmieren. Einbindung in Perl, PHP oder andere
Sprachen
(z.B. auch Delphi) ist aber gleichfalls möglich, etwa für
Web-Anwendungen.
Die wichtigsten Mittel sind die Exportsprache zur Gestaltung aller
Anzeigen
und Ausgaben sowie die FLEX-Makrosprache zur Programmierung von
Abläufen
(Windows).
Das Sortiment der allegro-eigenen Sprachen für Export, Import, Konfigurierung, Formulare und FLEXe ist allerdings auch nicht gerade sehr leicht zu erlernen. Es gibt Hilfen für den schnellen Aufbau einfacher Anwendungen, doch jenseits davon braucht man längere Einarbeitung. |
Ein RDBMS arbeitet bei Mehrplatzbetrieb in der Regel als Client/Server-System. Anwendungsprogramme "unterhalten" sich also mit dem Server und greifen nicht selber direkt auf die Datenbank zu. Besonders für Web-Anwendungen ist die Client/Server-Architektur geradezu zwingend. | Es gibt sowohl monolithische Programme (unter DOS, Windows, UNIX), die selbständig lesend und schreibend (mehrplatzfähig) auf die Datenbank zugreifen, als auch einen Datenbankserver (avanti), für den man beliee Client-Programme schreiben kann, auch für's Web. In lokalen Netzen wird fast nur mit den monolithischen Programmen gearbeitet (weil am schnellsten, und man braucht keinen Server zu betreiben). Auch das Einmischen von neuen Daten kann im laufenden Betrieb durch monolithische Programme geschehen. |
Mit
sogenannten
ODBC-Schnittstellen,
oder auch den Perl-DBM-Modulen wird versucht, Anwendungen eine
"generische"
relationale Datenbank vorzuspiegeln. Zum Beispiel sind mit und für
Microsoft Access (kein Client/Server) entwickelte Anwendungen dann ohne
Änderung auch mit dem Microsoft SQL-Server
funktionsfähig.
Auch bibliothekarische Software unterstützt stellenweise mehrere relationale Datenbanken: "Bibliotheca Win" etwa das Centura RDBMS (vormals Gupta) als Low-Cost-Variante oder Oracle als High-Cost-Alternative. In der Windows-Welt gibt es über das COM-Konzept (Component Object Model) die Möglichkeit, aus anderen Programmen heraus mit einem unsichtbaren Microsoft Access (z.B. lizenzierte Runtime-Version) oder einer anderen Datenbanksoftware über SQL-Befehle Datenbanken zu verwalten. |
Client/Server-Anwendungen können über TCP/IP den avanti-Datenbankserver in dessen Sprache ansteuern oder aber per sog. FLEX ein auf derselben Maschine laufendes Windows-allegro (a99). Dies ist eine Fernsteuerungsmethode vergleichbar mit der Fernsteuerung von Anwendungen über Visual Basic, hier aber mit einer allegro-eigenen Sprache. Diese Methodik für Windows-Anwendungen ist noch sehr neu und breitet sich zur Zeit erst unter Experten aus. Es wurden damit bereits Erwerbungs- und Ausleihfunktionen realisiert, aber auch eine neue Web-Schnittstelle ("RuckZuck"). |
Das Trigger-Konzept
ermöglicht es, Programme zu schreiben, die immer dann automatisch
ablaufen, wenn sich bestimmte Veränderungen ereignen. So kann man
komplexe Bedingungsprüfungen und nachfolgende Aktionen
programmieren. |
Mit Hilfe des PV-FLEX
(Programmierte Validierung) kann man logisch gesehen dasselbe für
eine allegro-Datenbank
realisieren. Bei jedem Speichervorgang wird dann ein Makro
ausgeführt, welches vor oder nach dem Speichern des Satzes jede
gewünschte Prüfung und/oder Aktion durchführen kann. |
Plattformen |
|
Etliche RDBMS haben Versionen für UNIX, Linux und Windows. Aktuelle Versionen für DOS gibt es wohl nicht mehr, zumindest nicht für SQL-Systeme. (dBaseIII war zwar relational, hatte aber kein echtes SQL und war nur begrenzt mehrplatzfähig.) Ob zwischen den Plattformen funktionale Unterschiede bestehen und ob Datenbanken unmittelbar kopiert werden können, ist man jeweils zu prüfen. | allegro existiert für DOS, Windows (ab '95), Linux und UNIX (Solaris). Datenbanken können ohne Änderung zwischen den Plattformen kopiert oder auch via Samba zugleich von zwei Plattformen aus benutzt werden. Auch sehr alte PCs können immer noch als DOS-OPAC-Terminals dienen, während zugleich neuere Geräte unter Win'95 usw. zugreifen. |
Sicherheitsfragen |
|
Jede
Schreib-Transaktion sollte auf ganz bestimmte Weise abgesichert sein,
und zwar müssen die
sog. ACID-Bedingungen eingehalten werden:
Atomicity: Aktion wird ganz oder gar nicht ausgeführt Consistency: Zustand nach der Trans. soll wieder "integer" sein Isolation: das Ergebnis soll so sein, als liefe zugleich kein anderer Vorgang. Dazu müssen alle Vorgänge "serialisierbar" sein (d.h. nicht echt parallel). Durability: Ergebnis soll hinterher sofort dauerhaft in der Datenbank stehen (nicht zuerst nur in einem Cache o.dgl.) |
Die
ACID-Bedingungen
werden durch geeignete Maßnahmen erreicht. Insbesondere
gehört
dazu das Sperren auf Satzebene bzw. im Index bereichsweise und wo
nötig
auch in anderen Dateien (Adressentabelle). Vor dem Speichern
können
programmierte
Validierungen die Integrität prüfen.
Die Satzsperre ist nie eine Lesesperre, d.h. Sätze, an denen gearbeitet wird, können im OPAC oder von anderen Bearbeitern jederzeit gelesen werden. Bleibt eine Satzsperre etwa durch Absturz eines PC bestehen, kann sie leicht aufgehoben werden. Eine Hilfsfunktion kann solche Sätze finden. |
Alle Transaktionen werden in einem "Logbuch" aufgezeichnet, das im Falle eines Zusammenbruchs oder Systemfehlers für "Rollback" und "Recovery" sorgen kann. | Alle
Speichervorgänge
werden in der Reihenfolge des Ablaufs (serialisiert) in einer LOG-Datei
aufgezeichnet (die auf einer anderen Platte liegen kann). Diese kann
auch
zur regelmäßigen Aktualisierung einer Schattendatenbank
dienen,
aber primär wird sie gebraucht, um aus einer Sicherungskopie der
Datenbank
wieder den Zustand unmittelbar vor einem Zusammenbruch zu
rekonstruieren.
Zu sichern braucht man im Prinzip nur die Nutzdaten, alle anderen Dateien (Index, Kurztiteldatei etc.) sind daraus rekonstruierbar. Völliger Neuaufbau kann z.B. bei 1 Mio. Datensätzen in unter 8 Stunden ablaufen. |
Leistungsbedarf |
|
Generell brauchen große, komplizierte Datenbanken große, schnelle Maschinen mit viel Arbeitsspeicher, um hohe Leistung zu erzielen. SQL-Systeme können z.B. bei Massenänderungen in einzelnen Tabellenspalten sehr schnell sein, denn oft wird dabei die gesamte Tabelle in den Arbeitsspeicher geladen. | allegro-Datenbanken mit Millionen Sätzen laufen immer noch mit guter Leistung auf normalen Novell- oder Win-Servern und fordern weder für Client noch Fileserver extrem viel Arbeitsspeicher. Auch die Anforderungen an die Rechenleistung sind eher gering. Das Updating größerer Mengen von Sätzen ist aber zeitkritisch, weil jeder Satz dabei mehrere Zugriffe erfordert. Da kommen schnell mal 1 oder 2 Sekunden pro Satz zusammen. |
Der Speicherbedarf je Datensatz ist nicht bei jedem System gleich, er hängt vor allem davon ab, ob Tabellenspalten zur maximalen Länge mit Leerzeichen aufgefüllt werden oder nicht, und vom Bedarf der Indexdateien. Selbst wenn aber bis zu 5K je Satz gebraucht werden, wird das bei heutigen Plattenpreisen nicht mehr als Problem empfunden. Und im Vergleich zu Volltexten von Büchern brauchen Katalogdaten selbstverständlich in jedem Fall sehr wenig Platz. | Typische
Katalogdatensätze
brauchen im Schnitt unter 1000 Byte, einschließlich der
Indexdatei
und der sonstigen Zusatzdateien. In den Sätzen gibt es keine
Leerräume,
und der Index wird mit einer Komprimierungstechnik klein gehalten.
Von Vorteil ist dies, wenn eine Datenbank auf CD-ROM veröffentlicht werden soll (Maximum 640 MB). Es gibt Beispiele mit über 2 Mio. Datensätzen auf einer CD. |
Wer bis hierher gelesen hat, kann die
Fragen des ersten Satzes leicht
beantworten: "Keins" bzw. "Nein". Die zugrundeliegenden Vorstellungen,
was denn eine Datenbank für Eigenschaften haben und was sie
leisten
soll, unterscheiden sich einfach zu stark. Manche Typen von
SQL-Abfragen
wird man mit Hilfe der FLEX-Technik und der Parametrierung nachbilden
können,
nicht jedoch die gesamte Bandbreite der SQL-Funktionen.
Schließlich
ist SQL ausdrücklich für RDBMS geschaffen worden, allegro
aber hat aus guten Gründen ein anderes Konzept. Die Erwartung,
beide
könnten weitgehend kompatibel gemacht werden, ist also
unrealistisch.
(Umgekehrt könnte man mit SQL auch nicht alles nachbilden, was man
mit allegro machen kann. Z.B. das Blättern in Registern
und die hierarchischen Satzstrukturen.)
Diese Übersicht macht hinreichend die Stärken und
Schwächen beider Datenbankkonzepte deutlich. Hätte eines der
beiden keine Schwächen, würde
es entweder allegro nicht geben, oder aber die UB Braunschweig
wäre
inzwischen die reichste Bibliothek der Welt.
Aber Scherz beiseite: durchaus denkbar sind hybride Anwendungen, die
sich der Vorteile beider Systeme bedienen. Warum nicht z.B.
Katalogisierung
und OPAC mit allegro, Erwerbung und Ausleihe mit einem RDBMS.
Beide
können über ihre Schnittstellen sowohl die andere Datenbank
befragen
als auch ihr Auskünfte geben! Denkanstöße in dieser
Richtung
kann der hier vorliegende Vergleich möglicherweise geben.
Vergleichweise noch weitaus seltener
anzutreffen und in der Standardisierung
noch nicht so weit fortgeschritten sind Objektorientierte
Datenbanksysteme (OODB). Zu deren Grundkonzept hat allegro
eine
viel größere Ähnlichkeit als zum RDBMS-Konzept.
Things a library system needs
by buss_error (142273)on Tuesday August 22, 2000, @04:34PM (#836100) # be able to change the default loan period.
(http://www.apnic.net/ | Last Journal: Thursday June 13, @11:02AM)
# Be able to read any of three or four dozen MARC "standards"
# Search on any word (but the stop dictionary for words such as the and to of ect.) for a word in any
one of over 1K places in the marc record.
# Be able to handle more than one library,
# be able to store books in different locations within the library,
# do user tracking by overdue, notes on the user, automatically import from other databases or text files,
have any one of several options for the user such as loan period
(but checks the holding to see if the standard period is longer or shorter,
or if the fine for overdue is less or more), be able to block a user,
# be able to block a user based on what library they are a user for, much much more,
# be able to route books between libraries,
# be able to route books to outside vendors such as binders, restorers, storage, ect.ect.ect.
# be able to find out who checked out a book last,# Maintain statistics on the book such as size, no. pages, language, print size, ISBN, LCCN,
how many times used in the library, checked out, inventoried, price, "extras" such as clear cover,
a place for notes for the whole library system and another place for each library,
ability to search on the note, title author, publisher, copyright date, date purchased,
dewey, LCN cataloging or some other system, age limits for checking out.
# Keep track of budget and invoices, orders, barcodes, much much more.
# Ability to keep track of when the next magizne is due, when the subscription runs out,
where the old copies vs. new copies are, index the mags.,
# Print reports on just about anything so throw a report generator at it.
And if you want more, there is about five hundred pages of basic requirements in any
book on library science. Add to that you have to know who a user is and if they are
authorized to do any particular function, (Some can check out, but not in, others can
add a note but not edit the book, some can edit books but not at any library except
where they are assigned) you get the picture.
Off hand, I'd say that a good library system is about four hundred times more difficult than writing Linux.
I know. I do Unix admin and Library systems for a living.
Trust me, this is not simple. I do think it very worthwhile though.