Fachgebiet Datenbanken und Informationssysteme Institut für Praktische Informatik Fakultät für Elektrotechnik und Informatik Universität Hannover Masterarbeit im Studiengang Informatik Anfragebearbeitung in föderierten räumlichen Datenbanksystemen Hendrik Warneke Matr.Nr. 2067449 26. April 2006 Erstprüfer: Prof. Dr. Udo Lipeck Zweitprüfer: Dr. Hans-Hermann Brüggemann Zusammenfassung Ein föderieres räumliches Datenbanksystem erlaubt es Anwendern, gleichzeitig mit Beständen von räumlichen Daten zu arbeiten, die in unterschiedlichen Datenbanken gehalten werden, wobei diese Datenbanken zusätzlich autonom betrieben und lokale Anwendungen nicht beeinträchtigt werden. Die in einem föderierten System mögliche Heterogenität der Datenbestände erfordert es, dass zur Bearbeitung von Anfragen, die auf Informationen aus mehreren Datenbanken gleichzeitig zugreifen, vielfältige Integrationskonflikte aufgelöst werden müssen. In dieser Arbeit wird eine Anfragesprache entworfen, die SQL um zusätzliche Sprachkonstrukte zur Auflösung von Integrationskonflikten erweitert. Der Anwendungsschwerpunkt dieser Spracherweiterung liegt auf der Föderierung geographischer Datenbestände. Dem Benutzer der föderierten räumlichen Datenbank soll es erleichtert werden, Informationen aus heterogenen Datenbeständen durch Anfragen zu verknüpfen und integrierte Sichten auf die enthaltenen Daten zu erstellen. Zur Realisierung dieser Anfragesprache wird ein System entworfen, das Anfragen mit neuen Sprachkonstrukten in gewöhnliche SQL-Anfragen übersetzt. Weiterhin wird eine prototypische Implementierung eines solchen Systems vorgestellt. Inhaltsverzeichnis 1 Einleitung 1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Zielsetzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Gliederung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Grundlagen föderierter und räumlicher Datenbanksysteme 2.1 Multidatenbanksysteme . . . . . . . . . . . . . . . . . . . . . 2.2 Föderierte Datenbanksysteme . . . . . . . . . . . . . . . . . . 2.2.1 Schemaintegration . . . . . . . . . . . . . . . . . . . . 2.2.2 Anfragebearbeitung . . . . . . . . . . . . . . . . . . . . 2.2.3 Architektur . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Räumliche Datenbanksysteme . . . . . . . . . . . . . . . . . . 2.4 Föderation räumlicher Datenbanksysteme . . . . . . . . . . . . 2.4.1 Objektidentifikation . . . . . . . . . . . . . . . . . . . 2.4.2 Rubber Sheeting . . . . . . . . . . . . . . . . . . . . . 1 1 4 4 . . . . . . . . . 6 6 7 7 9 10 11 12 12 15 3 Integrationskonflikte und Multidatenbanksprachen 3.1 Klassifikation von Integrationskonflikten . . . . . . . 3.2 Multidatenbanksprachen . . . . . . . . . . . . . . . . 3.3 Mechanismen zur Konfliktauflösung . . . . . . . . . . 3.3.1 Beschreibungskonflikte . . . . . . . . . . . . . 3.3.2 Heterogenitätskonflikte . . . . . . . . . . . . . 3.3.3 Extensionale Konflikte . . . . . . . . . . . . . 3.3.4 Strukturelle Konflikte . . . . . . . . . . . . . . 3.4 Integrationskonflikte bei räumlichen Daten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 18 20 21 22 23 23 24 30 4 Entwurf der SQL-Erweiterung 4.1 Grundbegriffe . . . . . . . . . . . . . . . . . . . 4.1.1 Das relationale Modell . . . . . . . . . . 4.1.2 NF2 -Relationen . . . . . . . . . . . . . . 4.1.3 Arrays . . . . . . . . . . . . . . . . . . . 4.1.4 Verlinken von Komponentendatenbanken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 33 33 34 35 36 i . . . . . . . . . . . . . . . INHALTSVERZEICHNIS 4.2 4.3 4.4 4.5 Attributtransformation . . . . . . . . . . . . . . . . . . 4.2.1 Standardattribute . . . . . . . . . . . . . . . . . 4.2.2 Geometrische Attribute . . . . . . . . . . . . . . 4.2.3 Bemerkungen . . . . . . . . . . . . . . . . . . . Mehrwertige Attribute . . . . . . . . . . . . . . . . . . 4.3.1 Aggregation . . . . . . . . . . . . . . . . . . . . 4.3.2 Aggregierungstabellen . . . . . . . . . . . . . . 4.3.3 Auflösen von Datenkonflikten . . . . . . . . . . 4.3.4 Bemerkungen . . . . . . . . . . . . . . . . . . . Integrationsoperatoren . . . . . . . . . . . . . . . . . . 4.4.1 Der erweiterte Verbundoperator . . . . . . . . . 4.4.2 Der erweiterte Vereinigungsoperator . . . . . . . 4.4.3 Bemerkungen . . . . . . . . . . . . . . . . . . . Substitution . . . . . . . . . . . . . . . . . . . . . . . . 4.5.1 Transformation von Relationennamen in Daten 4.5.2 Transformation von Attributnamen in Daten . . 4.5.3 Transformation von Daten in Relationennamen 4.5.4 Transformation von Daten in Attributnamen . . 4.5.5 Bemerkungen . . . . . . . . . . . . . . . . . . . 5 Entwurf des Anfragesystems 5.1 Architektur . . . . . . . . . . . . . . 5.2 Der Komponentendatenbankkatalog . 5.3 Übersetzen von SQLSF-Anweisungen 5.3.1 Attributtransformation . . . . 5.3.2 Aggregation . . . . . . . . . . 5.3.3 Integrationsoperatoren . . . . 5.3.4 Substitution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 39 41 42 42 42 44 46 48 48 49 51 53 54 54 56 57 58 59 . . . . . . . 61 61 63 67 67 71 74 79 6 Methodik der Föderierung räumlicher Daten 86 6.1 Ablauf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 6.2 Anwendungsbeispiel . . . . . . . . . . . . . . . . . . . . . . . . . 89 7 Implementierung des Prototypen 7.1 SQLSF*Plus . . . . . . . . . . . . 7.2 Parser . . . . . . . . . . . . . . . 7.3 Komponentendatenbankkatalog . 7.4 Aggregation . . . . . . . . . . . . 7.5 Konfliktauflösung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 94 96 98 98 99 8 Ausblick 101 A Die Grammatik von SQLSF 103 ii Kapitel 1 Einleitung 1.1 Motivation Wie in vielen anderen Bereichen werden auch geographische Informationen zunehmend elektronisch verarbeitet. Spezielle Software-System für diesen Zweck heißen geographische Informationssysteme (GIS). Häufig sind diese in der Lage mit geographischen Daten in vielen unterschiedlichen Formaten zu arbeiten. Somit wird die Vervielfältigung und der Austausch dieser Daten, wie z.B. digitaler Landkarten, zwischen Behörden, Unternehmen oder anderen Organisationen durch den Einsatz moderner Kommunikationsnetze ernorm vereinfacht, so dass einem Interessenten üblicherweise eine Vielzahl solcher Datensammlungen zur Verfügung stehen. Für die Verwaltung großer Mengen geographischer Daten verwendet man häufig ein Datenbanksystem, das zusätzliche Funktionalität zum Umgang mit der inhärenten räumlichen Ausprägung dieser Daten besitzt. Die Vorteile eines Datenbanksystems (z.B. Effizienz, Nebenläufigkeit usw.) lassen sich bei Einsatz eines solchen räumlichen Datenbanksystems auch für die Arbeit mit geographischen Daten nutzen. Je nachdem, wie die Bestände von geographischen Daten erhoben wurden, unterscheiden sich die enthaltenen Informationen über den durch die Daten beschriebenen geographischen Raum. In Abbildung 1.1 beispielsweise sind zwei Datenbestände mit digitalem Kartenmaterial dargestellt, die eine unterschiedliche Thematik besitzen. Die geologische Karte unterteilt den Raum in Flächen, für die jeweils die Beschaffenheit der Erdschichten beschrieben ist, während die topographische Karte Objekte auf der Erdoberfläche, wie z.B. Straßen, Siedlungen oder Gewässer beschreibt. 1 Einleitung (a) geologische Karte (b) topographische Karte Abbildung 1.1: Digitale Kartenblätter von Hannover mit unterschiedlicher Thematik In Abbildung 1.2 sind Datenbestände dargestellt, die zwar die gleiche Thematik besitzen, allerdings für die Darstellung in unterschiedlichen Maßstäben erhoben wurden. Die Datenbasis der Karte im feineren Maßstab enthält deutlich mehr Objekte und genauere Beschreibungen als die im gröberen Maßstab. Weitere Ursachen für Unterschiede in den Datensammlungen sind beispielsweise verschiedene Datenanbieter oder eine unterschiedliche Aktualität der Daten. Bestimmte Problemstellungen erfordern eine gemeinsame Nutzung mehrerer Datenbestände. Dazu gehört die Gewinnung neuer Informationen durch Kombination geographischer Daten aus unterschiedlichen Quellen. Beispielsweise könnte man die Beschreibung der Straßen in einer topographischen Karte mit Informationen über die geologische Beschaffenheit des Untergrundes ergänzen, indem man topographische und geologische Daten kombiniert. Ein weiteres Anwendungsszenario ist die Übertragung von aktualisierenden Änderungen eines Datenbestandes auf einen anderen. Damit spart man sich für den zweiten Datenbestand eine aufwendige Neuerfassung der geänderten geographischen Daten. Ein interessanter Ansatz zur gemeinsamen Nutzung ist die Föderierung der Datenbestände. Dieser hat gegenüber einem zentralisierten Ansatz, bei dem alle Daten in einem Datenbanksystem integriert werden, den Vorteil, dass die einzelnen Datenbestände weiterhin autonom und unabhängig voneinander verwaltet werden können und somit Anwendungen, die mit diesen Daten arbeiten nicht beeinträchtigt werden. Gleichzeitig erlaubt es eine zusätzlich eingeführte 2 1.1 Motivation (a) Maßstab 1:250000 (b) Maßstab 1:1000000 Abbildung 1.2: Kartenblätter von Buchholz für die Darstellung in unterschiedlichen Maßstäben Ebene, auf der eine integrierte Sichtweise auf die Daten zur Verfügung gestellt wird, Informationen aus verschiedenen Quellen zu verknüpfen. Wie eine solche Föderierungsebene insbesondere für geographische Datenbanken zu realisieren ist, ist Gegenstand aktueller Forschung. Zu lösende Probleme sind dabei z.B. • Die Entwicklung eines Schemas des Gesamtdatenbestandes aus den Schemata der einzelnen Datenbanken. • Die Identifikation von Datenobjekten aus verschiedenen Datenbeständen, die dasselbe geographische Objekt (z.B. dieselbe Straße) modellieren, das sogenannte Matching. • Die Auflösung von Konflikten, die dadurch entstehen, dass sich die Eigenschaften modellierter geographischer Objekte in verschiedenen Datenbeständen unterscheiden. Während bereits Verfahren zur Behandlung dieser Probleme vorgeschlagen wurden, existiert noch kein Vorschlag für eine Anfragesprache, mit der über die Föderierungsebene Informationen aus den Datenbeständen verknüpft werden können, indem diese Verfahren ausgenutzt werden. 3 Einleitung 1.2 Zielsetzung In dieser Arbeit soll untersucht werden, wie sich der Aufbau und die Benutzung eines föderierten räumlichen Datenbanksystems durch passende Erweiterungen der als Standard etablierten Anfragesprache SQL unterstützen lassen. Den Ausgangspunkt bildet zunächst eine Betrachtung SQL-basierter Multidatenbanksprachen, die für den Einsatz innerhalb eines Verbundes von Datenbanken mit Standarddaten konzipiert wurden und die spezielle Spracherweiterungen zur Unterstützung von Integrationsoperationen enthalten. Da auch in räumlichen Datenbanksystemen zum Teil mit Standarddaten operiert wird, sind diese Erweiterungen auch bei der Föderierung geographischer Daten einsetztbar. Es ist zu klären, inwieweit weitere Sprachkonstrukte benötigt werden, um Techniken zur Integration von räumlichen Daten zu unterstützen. Aufbauend auf dieser Untersuchung soll prototypisch eine eigene Anfragesprache für föderierte räumliche Datenbanksysteme entwickelt und realisiert werden. Es sind gegebenenfalls neue Spracherweiterungen, schwerpunktmäßig für die Anwendung von bereits erprobten Verfahren zur Integration von geographischen Daten, zu entwerfen. Insbesondere sollen für die Integration nützliche Zusatzinformationen über die zu föderierenden Daten auf der Föderierungsebene abgespeichert und implizit zur Beantwortung von Anfragen genutzt werden können. Beim Entwurf der Spracherweiterungen ist ein geeigneter Kompromiss aus einfacher Anwendbarkeit und der Ermöglichung vielfältiger Integrationsstrategien zu finden. Der Anwendungsbereich der Anfragesprache wird auf geographische Daten in einem festen Format eingeschränkt. Zur Realisierung der Anfragesprache ist ein System zu entwerfen, das eine Bearbeitung entsprechender Anfragen vornimmt. Dabei soll es möglich sein, sowohl direkt Anfragen an die föderierten Datenbestände zu stellen als auch integrierte Sichten auf der Föderierungsebene zu definieren. Weiterhin ist zu beschreiben, wie die Föderierung geographischer Datenbestände unter Einsatz der neu entworfenen Anfragesprache durchgeführt werden kann und wie man diese zur Verknüpfung von Informationen aus den Datenbeständen einsetzt. 1.3 Gliederung In Kapitel 2 werden zunächst für diese Arbeit wichtige Begriffe und Techniken erläutert. Insbesondere werden auch Verfahren vorgestellt, die bei der Integration geographischer Daten eingesetzt werden und an denen sich der Entwurf 4 1.3 Gliederung der Anfragesprache orientiert. Kapitel 3 befasst sich mit den unterschiedlichen Arten von Konflikten bei der Integration von Standarddaten. Es werden bereits existierende Vorschläge für SQL-Spracherweiterungen vorgestellt, mit denen solche Konflikte bei der Bearbeitung der Anfrage automatisch aufgelöst werden. Weiterhin wird die Anwendung dieser Erweiterungen auf Konflikte bei der Integration geographischer Daten diskutiert. Die in dieser Arbeit entworfene Anfragesprache wird in Kapitel 4 vorgestellt, wobei jeweils Syntax, Semantik und Anwendungsbeispiele für jedes SQL erweiternde Sprachkonstrukt angegeben werden. Es folgt der Entwurf eines Systems, durch das die neue Anfragesprache realisiert wird, in Kapitel 5. Dazu werden unter anderem Algorithmen angegeben, die die Erweiterungen in standardkonforme SQL-Anweisungen übersetzen. Kapitel 6 stellt dar, wie Anfragen zur Verknüpfung von Informationen aus föderierten Datenbeständen formuliert werden können. Weiterhin ist hier aufgeführt, welche Vorarbeiten zur Föderierung der Datenbestände durchgeführt werden müssen. Schließlich wird in Kapitel 7 die prototypische Implementierung des Anfragesystems beschrieben. 5 Kapitel 2 Grundlagen föderierter und räumlicher Datenbanksysteme In diesem Kapitel sollen grundsätzliche Konzepte erläutert werden, die für das Verständnis dieser Arbeit notwendig sind. In Abschnitt 2.1 wird zunächst der Begriff Multidatenbanksystem erläutert und charakteriesierende Eigenschaften vorgestellt. Anschließend wird in Abschnitt 2.2 genauer auf eine Klasse von Multidatenbanksystemen, die föderierten Datenbanksysteme eingegangen. Für räumliche Datenbanksysteme wird in den folgenden Kapiteln eine bestimmte Art der Realisierung vorausgesetzt, die in Abschnitt 2.3 beschrieben ist. Abschließend erläutert Abschnitt 2.4 Techniken, die zur Lösung einiger spezieller Probleme bei der Integration räumlicher Datenbanksysteme eingesetzt werden können, und die eine Grundlage der in Kapitel 4 entworfenen SQL-Erweiterung bilden. 2.1 Multidatenbanksysteme Im Gegensatz zu einem zentralen oder verteilten Datenbanksystem, bei dem alle Daten von einem einzigen Datenbankmanagementsystem verwaltet werden, handelt es sich bei einem Multidatenbanksystem um einen Verbund mehrerer Datenbanksysteme, die als die Komponentendatenbanksysteme oder Komponentendatenbanken 1 des Verbundes bezeichnet werden. Ein solcher Verbund läßt sich anhand dreier Merkmale charakterisieren: 1 Die Begriffe Datenbanksystem und Datenbank werden hier synonym benutzt und bezeichnen immer die Gesamtheit aus Datenbankmanagementsystem und verwalteten Daten. 6 2.2 Föderierte Datenbanksysteme Verteilung bezieht sich auf die Speicherung der Daten innerhalb des Multidatenbanksstems. In verteilten Systemen sind diese auf verschiedene Rechner oder verschiedene Datenbanken verteilt. Heterogenität tritt in Multidatenbanksystemen in vielfältiger Form auf. Beispiele sind die Verwendung unterschiedlicher Datenbankmanagementsysteme, unterschiedliche Modellierungen desselben Weltausschnittes oder eine sich in verschiedenen Komponentendatenbanken unterscheidende Interpretation der Daten. Autonomie beschreibt die Freiheitsgrade, die der Administrator einer Komponentendatenbank bei dessen Kontrolle hat. Kann eine Komponentendatenbank unabhängig von den anderen Datenbanken des Verbundes entworfen und ihr Schema beim Eintritt in den Verbund unverändert bleiben, spricht man von Entwurfsautonomie. Kommunikationsautonomie erlaubt es dem Administrator, über die Zugehörigkeit zum Verbund und darüber, welche Daten und Dienste anderen Teilnehmern angeboten werden, zu entscheiden. Die Möglichkeit, eigenständig zu bestimmen, ob und zu welchem Zeitpunkt Anwendungen, Anfragen oder Änderungsoperationen ausgeführt werden, bezeichnet man als Ausführungsautonomie. 2.2 Föderierte Datenbanksysteme Multidatenbanksysteme, in denen die Komponentendatenbanken einen hohen Grad an Autonomie besitzen, bezeichnet man als föderierte Datenbanksysteme [SL90]. Der allgemeine Aufbau eines föderierten Datenbanksystems ist in Abbildung 2.1 dargestellt. Der Föderierungsdienst integriert die Daten der Komponentendatenbanken und stellt sie für globale Anwendungen zur Verfügung. Dazu verwendet er typischerweise eine eigene Datenbank, die als Arbeitsdatenbank bezeichnet wird. Die Komponentendatenbanken werden nicht verändert und lokale Anwendungen, die auf die einzelnen Komponentendatenbanken zugreifen, dadurch nicht beeinträchtigt. 2.2.1 Schemaintegration Eine Aufgabe des Föderierungsdienstes ist die Bereitstellung eines sogenannten globalen Schemas, das die im föderierten Datenbanksystem verwalteten Daten in einheitlicher Form beschreibt. Dazu müssen die unabhängig voneinander entworfenen, heterogenen Schemata der Komponentendatenbanken zu 7 Grundlagen föderierter und räumlicher Datenbanksysteme Globale Anwendungen Globale Anwendungen Föderierungsdienst Arbeitsdatenbank Lokale Anwendungen Lokale Anwendungen ... KDB 1 KDB n Föderiertes Datenbanksystem Abbildung 2.1: Allgemeiner Aufbau eines föderierten Datenbanksystems (nach [LMT04]) einem neuen Schema kombiniert werden. Diesen Prozess bezeichnet man als Schemaintegration und das Ergebnis auch als integriertes Schema. Die Schemaintegration wird in der Regel vollständig manuell oder halbautomatisch durchgeführt (siehe [Con97] für einen Vergleich mehrerer vorgeschlagener Ansätze). Um die Schemata der Komponentendatenbanken in Einklang zu bringen, müssen vielfältige Probleme gelöst werden, die als Integrationskonflikte bezeichnet werden und auf die in Abschnitt 3.1 genauer eingegangen wird. In der Literatur werden die folgenden Anforderungen an ein globales Schema angegeben: Vollständigkeit: Das integrierte Schema muss alle Informationen enthalten, die in mindestens einem lokalen Schema vorhanden sind. Korrektheit: Die im globalen Schema vorhandenen Informationen müssen äquivalent in mindestens einem lokalen Schema enthalten sein. Minimalität: Informationen, die in mehreren lokalen Schemata vorhanden sind, dürfen nur einmal im globalen Schema repräsentiert sein. Verständlichkeit: Das globale Schema soll leicht verständlich sein. 8 2.2 Föderierte Datenbanksysteme 2.2.2 Anfragebearbeitung Zur Beantwortung von Anfragen an ein föderiertes Datenbanksystem, im folgenden als globale Anfragen bezeichnet, kann es notwendig sein, Informationen aus mehr als einer Komponentendatenbank zu kombinieren. Die Beantwortung einer solchen Anfrage erfordert im Vergleich zum zentralen Datenbanksystem zusätzliche Arbeit, die vom Föderierungsdienst geleistet werden muss. Der prinzipielle Ablauf ist in Abbildung 2.2 skizziert. Globales Ergebnis Globale Anfrage Anfragezerlegung und globale Optimierung Postprocessing Anfrage 1 ... Postprocessing Anfrage k Lokale Anfrage 1 Konvertiertes lokales Ergebnis 1 Anfrageübersetzer 1 Datenkonverter 1 Übersetzte lokale Anfrage 1 Lokales Ergebnis 1 ... DB 1 Zusammensetzen und Nachbearbeitung Lokale Anfrage n Konvertiertes lokales Ergebnis n Anfrageübersetzer n Datenkonverter n Übersetzte lokale Anfrage n Lokales Ergebnis n DB n Abbildung 2.2: Allgemeiner Ablauf der Anfragebearbeitung in föderierten Datenbanksystemen Zunächst werden aus der globalen Anfrage sogenannte lokale Anfragen erzeugt, die von den einzelnen Komponentendatenbanksystemen bearbeitet werden können. Eine lokale Anfrage muss dann in die von der jeweiligen Komponentendatenbank unterstützte Anfragesprache transformiert werden. Durch Ausführung einer übersetzten lokalen Anfrage auf einem Komponentendatenbanksystem erhält man ein lokales Ergebnis, das zunächst in das vom Föderierungsdienst verwendete Datenmodell konvertiert werden muss. Die konvertierten lokalen Ergebnisse müssen dann zum globalen Ergebnis zusammengesetzt 9 Grundlagen föderierter und räumlicher Datenbanksysteme werden. Das geschiet durch sogenannte Postprocessing-Anfragen, die bei der Anfragezerlegung erzeugt werden müssen. 2.2.3 Architektur Zur Realisierung eines föderierten Dantenbanksystems werden in der Literatur verschiedene Architekturen vorgeschlagen (siehe [Con97]). Im Rahmen dieser Arbeit wird die sogenannte 5-Ebenen-Schema-Architektur verwendet (siehe Abbildung 2.3). Externes Schema 1 ... Externes Schema m Föderiertes Schema Exportschema 1 ... Exportschema n Komponentenschema 1 ... Komponentenschema n Lokales Schema 1 ... Lokales Schema n ... DB 1 DB n Abbildung 2.3: 5-Ebenen-Schema-Architektur Lokale Schemata bezeichnen die konzeptionellen Schemata der Komponentendatenbanken. Da diese von lokalen Anwendungen zum Zugriff auf die Datenbank verwendet werden, dürfen sie aufgrund der geforderten Autonomie der Komponentendatenbanken durch den Integrationsprozess beim Aufbau der Föderation nicht verändert werden. In heterogenen Verbunden können die lokalen Schemata unterschiedlicher Komponentendatenbanken in unterschiedlichen Datenmodellen vorliegen. 10 2.3 Räumliche Datenbanksysteme Komponentenschemata gehen aus den lokalen Schemata durch Transformation in ein anderes Datenmodell, das gemeinsame Datenmodell der Föderation, hervor. Durch diesen Schritt kann in darüberliegenden Ebenen von der Heterogenität der Komponentendatenbanken abstrahiert werden. Exportschemata begrenzen den Zugriff des föderierten Datenbanksystems auf die Daten der Komponentendatenbanken, indem sie diejenigen Ausschnitte der Komponentenschemata definieren, die der Föderation zur Verfügung gestellt werden. Dadurch lässt sich ein gewisser Grad an Kommunikationsautonomie erreichen. Föderiertes Schema enthält das aus der Integration der Exportschemata enstandene globale Schema, eine integrierte Beschreibung aller durch die Komponentendatenbanken zur Verfügung gestellten Daten. Weiterhin sind alle Daten enthalten, die der Föderierungsdienst zur Bearbeitung von mittels des globalen Schemas formulierten Anfragen oder Änderungen sowie zum Verwalten der Föderation benötigt. Externe Schemata verbergen die Komplexität des föderierten Schemas vor globalen Anwendungen oder Nutzern, indem nur der für diese relevante Teil des föderierten Schemas beschrieben wird. 2.3 Räumliche Datenbanksysteme Werden in einem Datenverarbeitungssystem Objekte der realen Welt mitsamt räumlicher Eigenschaften modelliert, so spricht man allgemein von räumlichen Daten. Datenbanksysteme, die in der Lage sind, solche Daten zu speichern, zu manipulieren und auf Anfrage auszuliefern, bezeichnet man als räumliche Datenbanksysteme. Eines der wichtigsten Anwendungsgebiete für diese Datenbanksysteme ist die Speicherung digitaler Landkarten in Geo-Informationssystemen. Modellierte Objekte in der Datenbank entsprechen in diesem Kontext z.B. Abschnitten von Verkehrswegen und Gewässern oder Teilen von Landschaftsflächen. Ein naheliegender Ansatz für die Realisierung eines räumlichen Datenbanksystems ist die Erweiterung eines (objekt-)relationalen Datenbanksystems um geometrische Datentypen (z.B. Punkt, Linie oder Fläche) und Operationen. Relationen in einem solchen System können sowohl Standardattribute, die alphanumerische Werte (z.B. der Name einer Straße) enthalten, als auch geometrische Attribute, zur Repräsentation der geometrischen Ausprägung der 11 Grundlagen föderierter und räumlicher Datenbanksysteme modellierten räumlichen Objekte. Eine beispielhafte Relation ist in Abbildung 2.4 dargestellt. objektID 36576 36577 36578 Geo Objekt objektart bezeichnung Straße Schneiderberg Platz Welfengarten Straße Callinstr. geometrie Abbildung 2.4: Relation mit drei Standard- und einem geometrischen Attribut Zur Repräsentation von geometrischen Attributen können unterschiedliche Ansätze verwendet werden (siehe [RSV02]). In dieser Arbeit wird von einer vektoriellen Darstellung ausgegangen. Das bedeutet, dass Geometrien durch eine Menge repräsentativer Punkte, z.B. die Endpunkte einer Linie oder die Stützpunkte eines Polygons, beschrieben sind. Eine Geometrie und damit die räumliche Ausprägung eines geographischen Datenobjektes kann auch aus mehreren Linien oder Polygonen bestehen. 2.4 Föderation räumlicher Datenbanksysteme Aufgrund des besonderen Charakters räumlicher Daten treten bei deren Integration aus verschiedenen Quellen Probleme auf, die durch spezialisierte Techniken gelöst werden müssen. Daraus entstehen zum Teil weitere Anforderungen für die Bearbeitung von Anfragen in einem föderierten räumlichen Datenbanksystem. 2.4.1 Objektidentifikation Während bei nicht-räumlichen Daten häufig über die Grenzen eines Datenbanksystems hinaus einheitliche Identifikatoren existieren (man denke an ISBN, Immatrikulations- oder Personalausweisnummer), gibt es diese bei räumlichen Datenbanken häufig nicht. In diesem Fall ist es daher schwieriger, Datenobjekte aus zwei unterschiedlichen Komponentendatenbanken zu bestimmen, die dasselbe Objekt in der realen Welt beschreiben. Solche Korrespondenzbeziehungen weden allerdings für die Integration der Daten in einer Föderation von räumlichen Datenbanksystemen benötigt, um beispielsweise beschreibende Eigenschaften eines Objektes aus unterschiedlichen 12 2.4 Föderation räumlicher Datenbanksysteme Komponentendatenbanken zu einer umfassenderen Beschreibung zu kombinieren. Daher erschließt man diese Beziehungen aus übereinstimmenden oder ähnlichen geometrischen und thematischen Merkmalen der Datenobjekte. (a) 1:1 Zuordnung (b) 1:n Zuordnung (c) m:n Zuordnung Abbildung 2.5: Unterschiedliche Klassen von Zuordnungen Diese erschlossenen Korrespondenzbeziehungen bezeichnet man als Zuordnungen oder Links. Da bei der Erfassung geographischer Daten ein kontinuierliches Abbild der Erdoberfläche in diskrete Objekte eingeteilt werden muss und diese Einteilung auf viele unterschiedliche Arten erfolgen kann, sind diese Zuordnung oftmals nicht eindeutig. Man unterscheidet anhand der Kardinalität drei Klassen von Zuordnungen zwischen Objekten aus zwei unterschiedlichen Komponentendatenbanken (siehe Abbildung 2.5): 1:1 Zuordnung: Ein Objekt in der Komponentendatenbank A ist genau einem Objekt aus der Komponentendatenbank B zugeordnet. Diesem sind keine anderen Objekte aus A zugeordnet. 1:m Zuordnung: Ein Objekt in der Komponentendatenbank A ist mehreren Objekten in der Komponentendatenbank B zugeordnet. Diese stehen allerdings nicht mit anderen Objekten aus A in einer Zuordnungsbeziehung. n:m Zuordnung: Ein Objekt in der Komponentendatenbank A ist mehreren Objekten in der Komponentendatenbank B zugeordnet. Diese können wiederum mehreren Objekten aus A zugeordnet sein. Der für die Integration einfachste Fall sind die 1:1 Zuordnungen, da man es hier offensichtlich mit zwei einzelnen Datenobjekten zu tun hat, die dasselbe Objekt in der realen Welt beschreiben. In den anderen Fällen behilft man sich oftmals dadurch, dass man in jeder Komponentendatenbank Datenobjekte, die über 13 Grundlagen föderierter und räumlicher Datenbanksysteme eine Kette von Zuordnungen zusammenhängen, zu zusammengesetzten Objekten aggregiert (in Abbildung 2.5 rot dargestellt). Zwischen diesen aggregierten Objekten bestehen dann 1:1 Zuordnungen. Den Prozess der Erschließung von Korrespondenzbeziehungen bezeichnet man als Matching. Um qualitativ möglichst hochwertige Ergebnisse - also eine möglichst vollständige und fehlerfreie Menge von Zuordnungen - zu erzielen, werden aufwendige Verfahren in einem mehrstufigen Matchingprozess eingesetzt (siehe ausführliche Beschreibung in [ML04]). Dabei wird vorausgesetzt, dass in jeder Komponentendatenbank eine Relation existiert, die alle modellierten räumlichen Objekte enthält. Diese kann gegebenefalls über eine Sicht realisiert sein. Da der Matchingprozess viel Rechenzeit erfordert, werden die berechneten Zuordnungen üblicherweise in der Arbeitsdatenbank der Föderation abgespeichert. Dabei werden diese Daten entsprechend dem in Abbildung 2.6 gezeigten Schema strukturiert. 0..* 0..* Object_Link +topo_Relation 1 1 Object_A Object_B 1..* 1..* 1 1 Aggregated_Object_B Aggregated_Object_A 0..1 0..1 1..* Link 1..* +Status 1 0..* Link_Quality +Criterion +Value Abbildung 2.6: Schema zur Abspeicherung von Zuordnungen aus [LMT04] Die Klassen Object A und Object B enthalten Repräsentationen der gematchten Originalobjekte aus zwei Komponentendatenbanken. Die aus diesen Objekten zusammengesetzten aggregierten Objekte sind durch Instanzen der Klassen Aggregated Object A und Aggregated Object B repräsentiert. Zuordnungen zwischen diesen aggregierten Objekten werden in einer Klasse Link gespeichert. Zu jeder Zuordnung können Qualitätskriterien und -werte in der Klasse Link Quality verzeichnet werden. In der Klasse Object Link werden die 14 2.4 Föderation räumlicher Datenbanksysteme beim Matching ermittelten räumliche Beziehungen (z.B. benachbarte oder sich schneidende Objekte) zwischen den Originalobjekten gespeichert. 2.4.2 Rubber Sheeting Im Allgemeinen kann man nicht davon ausgehen, dass Objekte der realen Welt in unterschiedlichen Komponentendatenbanken durch die selbe Geometrie beschrieben werden. Aufgrund von unterschiedlicher Erfassung der räumlichen Daten entprechen Punkte mit den gleichen Koordinaten in unterschiedlichen Komponentendatenbanken nicht unbedingt demselben Punkt der realen Welt. Rubber Sheeting ist ein Verfahren zur Transformation von Geometrien, dass diese Probleme berücksichtigt. Man kann sich diese Transformation anschaulich wie die Verzerrung einer Gummihaut vorstellen auf der die zu transformierenden Geometrien aufgemalt sind. Es wird eine Menge sogenannter Passpunkte benötigt, die aus n Paaren (qk , zk ) von übereinstimmenden Punkten aus unterschiedlichen Komponentendatenbanken besteht. Diese Passpunkte müssen vor der Anwendung der Transformation entweder manuell (z.B. über eine graphische Schnittstelle) identifiziert oder automatisch bestimmt werden. Hat man bereits Objektzuordnungen berechnet, so kann man beispielsweise die Endpunkte einander zugeordneter Liniensegmente verwenden. Abbildung 2.7: Linienhafte Objekte aus unterschiedlichen Komponentendatenbanken vor und nach der Transformation der roten Objekte mittels Rubber Sheeting Man transformiert eine Geometrie aus einer Komponentendatenbank, indem man deren repräsentative Punkte mit Hilfe der Passpunkte in eine Darstellung 15 Grundlagen föderierter und räumlicher Datenbanksysteme entsprechend der anderen Komponentendatenbank umrechnet. Die folgende Beschreibung des Verfahrens orientiert sich an [Lau98]. Punkte im zweidimensionalen Raum werden als Vektoren aufgefasst. Der Ansatz für eine Funktion zur Transformation eines Punktes p = (x, y) mit den Koordinaten x und y ist die Vektorsumme aller bekannten Passpunkte zk in der Zieldatenbank gewichtet mit einem vom zu transformierenden Punkt abhängigen Gewichtsfaktor wk (p): f (p) = n X zk · wk (p) k=1 Die zugrundeliegende Idee ist, dass der Passpunkt zk aus der Zieldatenbank ein umso stärkeres Gewicht erhält, je näher der zu transformierende Punkt p dem zugehörigen Passpunkt qk in der Quelldatenbank ist. Im Extremfall, d.h. der zu transformierende Punkt entspricht einem der Passpunkte in der Quelldatenbank, also p = qk , soll gelten: ( 1 für i = k, wi (p) = 0 sonst. Dadurch wird erreicht, dass die Passpunkte tatsächlich aufeinander abgebildet werden, also f (qk ) = zk für alle k mit 1 ≤ k ≤ n gilt. Da es sich um eine stetige Abbildung handelt, werden auch alle Punkte aus einer Umgebung von qk in eine Umgebung von zk abgebildet. In [Lau98] wird die folgende Gewichtsfunktion vorgeschlagen: wk (p) = 1 + dk (p)m · 1 P j6=k dj (p)−m Dabei bezeichnet dk (p) den euklidischen Abstand des Punktes p von dem k-ten Passpunkt qk = (xk , yk ) in der Quelldatenbank, also p dk (p) = (x − xk )2 + (y − yk )2 Es ist leicht einzusehen, dass diese Gewichtsfunktionen die gewünschten Eigenschaften haben. Mit dem Parameter m kann gesteuert werden, wie stark die Verzerrung in der Nähe der Passpunkte ausfällt. Genauere Untersuchungen über sinnvolle Werte von m finden sich in [Kre04]. 16 Kapitel 3 Integrationskonflikte und Multidatenbanksprachen Das Schema einer Komponentendatenbank enthält eine semantische Beschreibung der in der Datenbank vorhandenen Informationen. Es existieren viele verschiedene Datenmodelle um diese Beschreibungen auszudrücken und somit Schemata zu definieren (Relationales Modell, Objektorientiertes Modell, Entity-Relationship-Modell u.a.). Weiterhin gibt es sogar innerhalb eines Datenmodells normalerweise viele verschiedene Möglichkeiten ein Konzept aus der realen Welt zu repräsentieren. Wenn gleiche Konzepte in den Schemata verschiedener Komponentendatenbanken auf unterschiedliche Art modelliert sind, entstehen bei der Integration zu einem föderierten Schema vielfältige Probleme. Diese werden in der Literatur als Integrationskonflikte bezeichnet. Um Anfragen in Multidatenbanksystemen zu stellen oder Daten zu manipulieren wurden sogenannte Multidatenbanksprachen entwickelt. Diese erlauben einen globalen, simultanen Zugriff auf mehrere Komponentendatenbanken und können zur Definition von integrierten Sichten oder eines globalen Schemas verwendet werden. In Abschnitt 3.1 wird eine Klassifizierung von Integrationskonflikten vorgestellt. Diese erweist sich als hilfreich um anschließend in Abschnitt 3.3 Lösungsansätze, die von verschiedenen, in Abschnitt 3.2 vorgestellten Multidatenbanksprachen für unterschiedliche Arten von Konflikten angeboten werden, diskutieren zu können. Zum besseren Verständnis soll die Diskussion beispielhaft für die in Abbildung 3.1 dargestellten Datenbanken erfolgen. Abschnitt 3.4 beschreibt Konflikte, auf die man bei der Integration von räumlichen Daten stösst und die nicht mit den in Abschnitt 3.2 vorgestellten Multidatenbanksprachen behandelt werden können. 17 Integrationskonflikte und Multidatenbanksprachen Datenbank A: id 1 2 3 Datenbank B: Straße objektart länge m Kreisstraße 500 Landstraße 2500 Landstraße 3200 breite 7 10 11,5 Datenbank C: id 11 12 Straße kennung obj art B 83 1103 L 342 1105 länge km 25,0 5,7 Datenbank D: id 2 3 Straße objektart länge Bundesstraße 24000 Autobahn 75000 sid 2 3 3 Kennung art wert D B83 D A2 EU E30 breite 9 18 id 3 Autobahn länge breite 75000 18 id 2 Bundesstraße länge breite 24000 9 sid 2 3 Kennung D EU B83 A2 E30 Abbildung 3.1: Beispieldatenbanken 3.1 Klassifikation von Integrationskonflikten Grundsätzlich unterscheidet man in der Literatur zwischen Schemakonflikten und Datenkonflikten. Schemakonflikte können allein durch Betrachtung der zu integrierenden Schemata identifiziert werden, während Datenkonflikte erst nach der Schemaintegration aufgrund von Inkonsistenzen zwischen den Ausprägungen auftreten. Für die Klassifikation von Schemakonflikten wird in aktueller Literatur häufig die Einordnung aus [SPD92] übernommen. Diese unterscheidet vier Konfliktarten auf Schemaebene: Beschreibungskonflikte entstehen, wenn einander entsprechende Konzepte mit unterschiedlichen Eigenschaften modelliert werden. Unter diesen Begriff fallen z.B. Homonyme, Synonyme, unterschiedliche Attribute, unterschiedliche Einheiten, unterschiedliche Wertebereiche und unterschiedliche Integritätsbedingungen. Man betrachte die Straße-Relationen aus den Datenbanken A und B in Abbildung 3.1. Die Attribute objektart und obj art bezeichnen die selbe Eigenschaft, die Länge ist in unterschiedlichen Maßeinheiten angegeben und in Datenbank A ist keine Kennung, in B hingegen keine Breite gespeichert. Heterogenitätskonflikte liegen vor, wenn die zu integrierenden Schemata in unterschiedlichen Datenmodellen vorliegen, z.B. relational versus objektorientiert. 18 3.1 Klassifikation von Integrationskonflikten Semantische Konflikte treten auf, wenn sich Relationen überlappen, also sich überschneidende Mengen von Real-Welt Objekten repräsentieren. Dabei entsteht das Problem, welche Datensätze in verschiedenen Relationen einander entsprechen. Man betrachte beispielsweise die Datenbanken B und C, in denen jeweils die Straße mit der Kennung B 83 modelliert ist. Diese Konfliktart ist Voraussetzung für das Auftreten der sogenannten Datenkonflikte, bei denen sich die Attributwerte korrespondierender Objekte unterscheiden. Strukturelle Konflikte sind dadurch charakterisiert, dass innerhalb desselben Datenmodells unterschiedliche Modellierungskonzepte verwendet wurden, um gleiche Ausschnitte der realen Wert zu modellieren. Im relationalen Modell liegen Daten oft unterschiedlich fragmentiert vor, wobei man zwischen horizontaler und vertikaler Fragmentierung unterscheidet. Während beispielsweise alle Straßen in der Datenbank C in einer Relation gespeichert sind, liegen diese in Datenbank D horinzontal entsprechend ihrer Objektart fragmentiert vor. Ein Beispiel für unterschiedliche vertikale Fragmentierung ist die Modellierung der Straßenkennung in einer separaten Relation in der Datenbank C, während in Datenbank B die Kennung mit den anderen Attributen gemeinsam in einer Relation vorliegt. Eine weitere Art von strukturellen Konflikten, die sogenannten DatenMetadaten-Konflikte, tritt auf, wenn in einer Komponentendatenbank explizit vorhandene Informationen in einer anderen Komponentendatenbank nur implizit aus deren Schema bestimmt werden können. Zum Beispiel entfällt in der Datenbank D eine explizite Speicherung der Objektart einer Straße, da sich diese aufgrund der horizontalen Fragmentierung aus dem Namen der Relation also aus dem Schema ergibt. Bei den Straßenkennungen in der Datenbank C enthält das Attribut art die Information, ob es sich um eine nationale oder europäische Kennung handelt. Diese Information existiert in der Datenbank D nur implizit als Name des Attributs, das die Kennung als Wert enthält. Als Datenkonflikte werden Situationen bezeichnet, in denen Datenbankobjekte, die das selbe Objekt in der realen Welt modellieren, in unterschiedlichen Datenbanken verschiedene Werte für eine Eigenschaft besitzen, wie z.B. die Länge der Straße mit der Kennung B 83 in den Datenbanken B und C. Damit überhaupt Datenkonflikte auftreten können, müssen sich die Extensionen der zu integrierenden Datenbanken überlappen, also ein semantischer Konflikt vorliegen. Daher erscheint es für die folgenden Betrachtungen sinnvoll, Daten- und semantische Konflikte zu sogenannten extensionalen Konflikten zusammenzufassen und Lösungsansätze vorzustellen, die beide Konflikttypen behandeln. 19 Integrationskonflikte und Multidatenbanksprachen 3.2 Multidatenbanksprachen Aufgrund umfangreicher Forschung auf dem Gebiet der Interoperabilität von Datenbanken existieren zahlreiche Vorschläge für Multidatenbanksprachen, die ein simultanes Arbeiten mit mehreren heterogenen Datenbanken ermöglichen sollen. Die Komplexität dieser Sprachen ist im Vergleich zu den etablierten Lösungen für zentrale Datenbanksysteme deutlich höher und die Formulierung korrekter Anfragen schwieriger, weshalb eine Verwendung als Anfragesprache für Benutzer eines Multidatenbanksystems nicht immer sinnvoll erscheint. Die Mehrheit der hier vorgestellten Multidatenbanksprachen ist daher darauf ausgelegt, sogenannte integrierte Sichten zu erstellen, die Integrationskonflikte auflösen und die Daten der Komponentendatenbanken in integrierter Form darstellen. Es kann dann eine übliche Anfragesprache wie SQL verwendet werden, um Anfragen an die Sichten zu stellen, wodurch die Komplexität der Integration beim Arbeiten mit dem System verborgen wird. Wie leicht einzusehen ist, kann das Konzept der integrierten Sichten auch verwendet werden, um deklarativ und mit geringem Aufwand ein globales Schema innerhalb eines föderierten Datenbanksystems zu erstellen. Der Einsatz einer Multidatenbanksprache ist in diesem Fall besonders sinnvoll, wenn das globale Schema nicht für alle Zeiten fix ist, sondern oft geändert werden muss, z.B. um neue Komponentendatenbanken in die Föderation aufzunehmen oder um verschiedene Konfliktlösungsstrategien auszuprobieren. Multidatenbanksprachen unterscheiden sich in erster Linie in dem verwendeten Datenmodell. Da das dieser Arbeit zugrundeliegende Anwendungsszenario ein (objekt-)relationales Datenmodell impliziert, handelt es sich bei den folgenden Beispielen für Multidatenbanksprachen um Erweiterungen der am weitesten verbreiteten relationalen Anfragesprache SQL. Sprachvorschläge für die Integration von Daten in anderen Modellen (z.B. Logik-Datenmodell, objektorientiertes Datenmodell, usw.) werden hier nicht betrachtet, da diese im Wesentlichen auf denselben Ideen aufbauen. Beispiele für die Anwendung der hier vorgestellten Sprachen folgen im nächsten Abschnitt. MSQL (Multidatabase SQL [LAN+ 89]) ist die älteste der hier vorgestellten Sprachen und hat die Entwicklung der folgenden Multidatenbanksprachen maßgeblich beeinflusst. Sie ermöglicht es, mehrere Datenbanken innerhalb eines Verbundes gleichzeitig abzufragen und auch zu ändern. Allerdings ist die Möglichkeit, Daten mittels der Multidatenbanksprache zu manipulieren für das Anwendungsszenario in dieser Arbeit nicht relevant. 20 3.3 Mechanismen zur Konfliktauflösung SQL/M ([KCGS95]) wird innerhalb des Datenbanksystems UniSQL verwendet, um integrierte Sichten, die dort als virtuelle Relationen bezeichnet werden, zu erstellen. Das verwendete Datenmodell ist zwar objektorientiert, erlaubt jedoch auch die Integration von relationalen Datenbanken. SchemaSQL ([LSS96]) wurde hauptsächlich zur Auflösung von strukturellen Konflikten entwickelt und erlaubt eine einheitliche Behandlung von Metadaten und Daten innerhalb von Anfragen. Dies wird erreicht, indem es eine spezielle Syntax ermöglicht, Variablen an Metadaten, also an Namen von Datenbanken innerhalb der Föderation, an Namen von Relationen in einer Datenbank und an Namen von Attributen einer Relation, zu binden. Damit wird die Funktionalität von SQL erweitert, das lediglich Tupelvariablen gestattet. Ein weiteres Feature von SchemaSQL ist die Definition von Sichten, deren Schema dynamisch von den Ausprägungen der Komponentendatenbanken in der Föderation abhängt. FraQL (Federated Query Language [SCS00]) enthält ähnliche Konzepte wie SchemaSQL zur Behandlung von Metadaten und strukturellen Konflikten. Zusätzlich sind Erweiterungen zur Behandlung von Beschreibungsund extensionalen Konflikten enthalten. FISQL/FIRA (Federated Interoperable SQL/Federated Interoperable Relational Algebra [WR05]) ist eine für theoretische Untersuchungen entwickelte Erweiterung der Relationalen Algebra samt zugehöriger Anfragesprache, die wie SchemaSQL eine gleichwertige Behandlung von Daten und Metadaten erlaubt. Weiterhin wird in diesem Ansatz das übliche relationale Modell dahingehend erweitert, dass das Ergebnis einer Anfrage aus mehreren Relationen (auch dynamisch vielen) bestehen kann. 3.3 Mechanismen zur Konfliktauflösung Im folgenden werden Sprachkonstrukte der letzten drei in Abschnitt 3.2 vorgestellten Multidatenbanksprachen zur Auflösung der unterschiedlichen Arten von Integrationskonflikten anhand von Beispielen vorgestellt. Diese Konfliktauflösungsmechanismen werden, was das relationale Datenmodell betrifft, hier als überlegen gegenüber denen der älteren beiden Sprachen betrachtet. 21 Integrationskonflikte und Multidatenbanksprachen 3.3.1 Beschreibungskonflikte Datenbank A: id 1 2 3 Straße objektart länge m Kreisstraße 500 Landstraße 2500 Landstraße 3200 Datenbank B: breite 7 10 11,5 id 11 12 13 kennung B 83 L 342 U 25 nummer 1105 1103 Straße obj art 1103 1105 1107 länge km 25,0 5,7 10,3 OArten art Landstraße Bundesstraße Abbildung 3.2: Beispieldatenbanken zu Beschreibungskonflikten Die Möglichkeit, Schemaelemente umzubenennen, existiert bereits in SQL und kann somit auch in Multidatenbanksprachen benutzt werden, um Synonyme und Homonyme aufzulösen. Um die Schemata der Datenbanken A und B anzugleichen, könnte man z.B. die Attribute länge km und länge m in länge sowie obj art in objektart umbenennen. Das Problem der unterschiedlichen Längeneinheiten km und m bekommt man durch Umrechnen in den Griff. Da diese Umrechnungen auch komplizierter ausfallen können, wie im Fall der Objektarten-Attribute, die offensichtlich unterschiedliche Wertebereiche besitzen, erlauben es einige Multidatenbanksprachen, benutzerdefinierte Funktionen zu benutzen. Die Sprache FRAQL bietet außerdem die komfortable Erweiterung, zur Umrechnung statt einer Funktion direkt eine Ersetzungstabelle anzugeben. Mit der Anweisung SELECT @Table(attribute, source, destination, default) FROM Relation wird die Relation Table benutzt, um Werte des Attributs attribute der Relation Relation umzurechnen. Dazu wird der jeweilige Wert des Attributs attribute in der Spalte source der Tabelle Table gesucht und durch den korrespondierenden Wert in der Spalte destination ersetzt. Wird in der Relation Table kein passender Eintrag gefunden, wird durch den Wert von default (entweder ein Attribut oder ein konstanter Wert) ersetzt. Im Beispiel 3.1 werden die benutzerdefinierte Funktion km to m zum Umrechnen der Länge und die OArten-Tabelle der Datenbank B zum Umrechnen der Objektart in eine zur Datenbank A konforme Darstellung benutzt. Das in der Datenbank B fehlende Attribut Breite wird durch einen Default-Wert ersetzt. 22 3.3 Mechanismen zur Konfliktauflösung SELECT id, km_to_m(länge_km) AS länge, @B.OArten(obj_art, nummer, art, ’NN’) AS objektart, ’NN’ AS breite FROM B.Straße id 11 12 13 länge 25000 5700 10300 objektart Bundesstraße Landstraße NN breite NN NN NN Beispiel 3.1: Umwandlung der Datenbank B in eine zur Datenbank A konforme Darstellung 3.3.2 Heterogenitätskonflikte Üblicherweise geht man bei der Betrachtung der hier vorgestellten Multidatenbanksprachen davon aus, dass die zu integrierenden Schemata in einem einheitlichen Datenmodell vorliegen oder innerhalb des Integrationsprozesses dahingehend transformiert werden. Dadurch treten dann bei der Anwendung von Multidatenbanksprachen keine Heterogenitätskonflikte mehr auf. Eine Ausnahme bildet hier die Sprache SQL/M, mit der man zumindest relationale und objektorientierte Schemata integrieren kann. Da eine solche Funktionalität für das in dieser Arbeit betrachtete Anwendungsszenario allerdings nicht benötigt wird, wird hier nicht weiter darauf eingegangen. 3.3.3 Extensionale Konflikte Man betrachte die Datenbanken A und C in Abbildung 3.3. Will man die Straßen aus beiden Datenbanken zu einer Relation vereinigen, so tritt dabei das Problem auf, dass die Straße mit der ID 2 in beiden Straße-Relationen auftritt. Die mit dem aus SQL bekannten UNION-Operator berechnete Vereinigung würde also zwei Einträge für dieselbe Straße enthalten. Datenbank A: id 1 2 Straße objektart länge Bundesstraße 25000 Autobahn 70000 Datenbank C: breite 10 18 id 2 3 Straße objektart länge Autobahn 75000 Bundesstraße 16000 breite 20 12 Abbildung 3.3: Beispieldatenbanken zu extensionalen Konflikten In FraQL ist dieses Problem dadurch gelöst, dass man bei der Vereinigung der Relationen durch eine optionale On-Klausel angeben kann, welche Attribute 23 Integrationskonflikte und Multidatenbanksprachen übereinstimmen müssen, damit ein Tupel dasselbe Objekt repräsentiert. Bei den Datenbanken in Abbildung 3.3 ist dies nur das Attribut id. Die mit der Anfrage in Beispiel 3.2 berechnete Vereinigung enthält dann für Objekte mit derselben ID nur einen entprechenden Eintrag. SELECT * FROM A.Straße UNION C.Straße ON id RECONCILED BY resolveAC id 1 2 3 objektart Bundesstraße Autobahn Bundesstraße länge 25000 72500 16000 breite 10 19 12 Beispiel 3.2: Vereinigung der Straße-Relationen der Datenbanken A und C Es ist dabei jedoch nicht automatisch klar, welche Werte die Attribute objektart, länge und breite bekommen, da sich diese in den lokalen Datenbankrelationen unterscheiden können. FraQL bietet deshalb die Möglichkeit, sogenannte Konfliktauflösungsfunktionen zu programmieren, die jeweils zwei als übereinstimmend identifizierte Tupel aus den Ausgangsrelationen als Eingabe erhalten und jeweils ein Tupel als Ergebnis liefern. Mit einer optionalen Reconciled-By-Klausel kann bei einer Integrationsoperation angegeben werden, dass eine solche benutzerdefinierte Funktion zur Auflösung von eventuell in den Daten auftretenden Konflikten verwendet werden soll. Im Beispiel 3.2 errechnet die Funktion resolveAC jeweils den Durchschnitt aus den unterschiedlichen Längen- und Breitenwerten für das Tupel mit der ID 2. Leider schränkt dieser Ansatz die Wiederverwendbarkeit einer Konfliktauflösungsfunktion stark ein, denn diese kann nur für die Integration von Relationen mit einem bestimmten Schema verwendet werden. Will man Relationen mit einem anderen Schema integrieren oder Konflikte zwischen unterschiedlichen Attributwerten auf andere Art auflösen, muss jeweils eine neue Konfliktauflösungsfunktion programmiert werden. 3.3.4 Strukturelle Konflikte Durch Fragmentierung entstehende strukturelle Konflikte lassen sich mit den Möglichkeiten von SQL auflösen, indem Fragmente durch Vereinigung oder Verbund zusammengesetzt werden. Allerdings bietet SQL keine Möglichkeit, Metadaten in Daten zu transformieren und umgekehrt. Zur Behandlung von Daten-Metadaten-Konflikten sind Erweiterungen notwendig, wie sie die Multidatenbanksprachen SchemaSQL, FraQL und FISQL anbieten. Diese erlauben 24 3.3 Mechanismen zur Konfliktauflösung einen Zugriff auf Metadaten, z.B. die Namen von Relationen in einer Datenbank oder die Namen von Attributen einer Relation, innerhalb einer Anfrage. Mit diesen Erweiterungen wird eine sehr elegante Umstrukturierung von Schemata ermöglicht. Die Umsetzung ist jedoch in den vorgestellten Sprachen leicht unterschiedlich, was im Folgenden anhand der Beispieldatenbanken in Abbildung 3.4 demonstriert wird. Datenbank C: id 2 3 Straße objektart länge Bundesstraße 15000 Autobahn 75000 sid 2 3 3 Kennung art wert D B83 D A2 EU E30 Datenbank D: breite 9 18 id 3 Autobahn länge breite 75000 18 id 2 Bundesstraße länge breite 15000 9 sid 2 3 Kennung D EU B83 A2 E30 Abbildung 3.4: Beispieldatenbanken zu strukturellen Konflikten Transformation von Metadaten in Daten In SchemaSQL können in der FROM-Klausel einer Anfrage fünf verschiedene Arten von Mengen definiert werden, an deren Elemente eine Variable gebunden wird: 1. Der Ausdruck -> D bindet die Variable D an die Namen aller Datenbanken in der Föderation. 2. Der Ausdruck db-> R bindet die Variable R an die Namen aller Relationen in der Datenbank db. 3. Der Ausdruck db::rel-> A bindet die Variable A an die Namen aller Attribute der Relation rel in der Datenbank db. 4. Der Ausdruck db::rel T bindet die Variable T an alle Tupel der Relation rel in der Datenbank db. Dies entspricht den Tupelvariablen aus SQL. 5. Der Ausdruck db::rel.attr W bindet die Variable W an alle Werte des Attributs attr der Relation rel in der Datenbank db. Solche Variablen nennt man auch Bereichsvariablen. Variablen können in einer Anfrage anstelle von Relationen- oder Attributnamen angegeben werden. Im Gegensatz zur Verwendung konstanter Relationenoder Attributnamen wird damit erreicht, dass erst zur Laufzeit bestimmt wird, welche Relationen und Attribute in der Anfrage referenziert werden. 25 Integrationskonflikte und Multidatenbanksprachen CREATE VIEW Straße(id, objektart, länge, breite) AS SELECT T.id, R, T.länge, T.breite FROM D -> R, D::R T WHERE R <> ’Kennung’ CREATE VIEW Kennung(sid, art, wert) AS SELECT T.sid, A, T.A FROM D::Kennung-> A, D::Kennung T WHERE A <> ’sid’ Beispiel 3.3: Umwandlung der Datenbank D nach C mit SchemaSQL Im Beispiel 3.3 wird die Anwendung dieser Konstrukte demonstriert, indem die Datenbank D mittels SchemaSQL derart umstrukturiert wird, dass ihr Schema dem der Datenbank C entspricht. Dazu müssen zunächst alle StraßentypRelationen zu einer Sicht zusammengefasst werden, die eine zusätzliche Spalte für die Objektart enthält. Man beachte, wie die Variable R an alle Relationennamen außer Kennung gebunden und sofort verwendet wird, um die Variable T an alle Tupel aus einer dieser Relationen zu binden. Zu jedem Tupel wird im Ergebnis der Name der Ursprungsrelation als Wert des Attributs objektart hinzugefügt. Bei der Umstrukturierung der Relation Kennung wird die Variable A an die Namen aller Attribute außer sid gebunden. Das Ergebnis enthält ein Tupel für jede Kombination von Werten von T und A, wobei der Wert von A als Wert des Attributs art und der Wert des zugehörigen Attributs von T als Wert des Attributs wert angenommen wird. Das Ergebnis dieser Umstrukturierungsoperationen entspricht genau der Datenbank C in Abbildung 3.4. Die Multidatenbanksprache FISQL nutzt ähnliche Konzepte wie SchemaSQL, allerdings mit etwas veränderter Syntax. Hier gibt es keine Create-View-Anweisung um das Ausgabeschema festzulegen. Stattdessen wird der Name der Ergebnisrelation durch eine Into-Anweisung und die Namen ihrer Attribute wie aus SQL bekannt durch Umbenennung in der Select-Klausel angegeben. Die Bindung von Variablen an Metadaten in der From-Klausel erfolgt implizit, indem anstelle eines Relationen- oder Attributnamens der Name der Variable eingesetzt wird. Auf diese Weise wird in der ersten Anfrage im Beispiel 3.4 die Variable R implizit an die Namen und die Variable T an die Tupel aller Relationen außer Kennung in der Datenbank D gebunden. Der Relationenname ergibt im Ergebnis 26 3.3 Mechanismen zur Konfliktauflösung SELECT T.id, R AS "objektart", T.länge, T.breite INTO "Straße" FROM D.R AS T WHERE R <> "Kennung" SELECT T.sid, A AS "art", T.A AS "wert" INTO "Kennung" FROM D.Kennung.A D.Kennung AS T WHERE A <> "sid" Beispiel 3.4: Umwandlung der Datenbank D nach C mit FISQL den Wert des Attributs objektart. In der zweiten Anfrage erfolgt implizit eine Bindung der Variable A an die Namen der Attribute der Relation Kennung in der Datenbank D. Einen etwas anderen Ansatz verfolgt die Sprache FraQL. Dort gibt es keine spezielle Spracherweiterung zur Bindung von Variablen an Metadaten. Stattdessen können Metadaten aus dem Schemakatalog, einer Sammlung spezieller Relationen, die vom Föderierungsdienst gepflegt werden müssen, abgefragt und somit wie gewöhnliche Daten behandelt werden. Im Gegensatz zu SchemaSQL und FISQL wird das Ersetzen von konstanten Relationen- oder Attributnamen durch Datenwerte mit dem Substitutionsoperator $ syntaktisch hervorgehoben. Weiterhin ist es in FraQL erforderlich, dass beim Erstellen einer Sichtrelation das Schema durch die Angabe eines Typs festgelegt wird. CREATE TABLE Straße OF Straße_Typ_C AS SELECT T.id, R.table_name AS objektart, T.länge, T.breite FROM catalog.tables R, $(R.table_name) T WHERE R.schema = ’D’ AND R.table_name <> ’Kennung’ CREATE TABLE Kennung OF Kennung_Typ_C AS SELECT T.sid, A.column_name, T.$(A.column_name) FROM D.Kennung T, catalog.columns A WHERE A.table = ’Kennung’ AND A.column_name <> ’sid’ Beispiel 3.5: Umwandlung der Datenbank D nach C mit FraQL Im Beispiel 3.5 stammen in der ersten Anfrage die Namen der abzufragenden Relation aus der Relation tables und werden in der From-Klausel anstelle ei27 Integrationskonflikte und Multidatenbanksprachen nes konstanten Relationennamens eingesetzt. In der zweiten Anfrage bekommt man die Namen der abzufragenden Attribute der Relation Kennung aus der Relation columns, und setzt diese anstelle eines konstanten Attributnamens in der Select-Klausel ein. Transformation von Daten in Metadaten Bei der inversen Transformation, also der Umstrukturierung der Datenbank C entsprechend dem Schema der Datenbank D, beeinflussen die in C vorhandenen Daten, welche Relationen und Attribute im Ergebnis der Transformation auftreten. Für jeden Wert des Attributs objektart in der Relation Straße muss das Ergebnis eine eigene Relation und für jeden Wert des Attributs art der Relation Kennung ein zusätzliches Attribut enthalten. SchemaSQL erlaubt es, Variablen in der Create-View-Klausel anstelle von Relationen- oder Attributnamen einzusetzen, um Datenwerte in Elemente des Ergebnisschemas umzuwandeln. CREATE VIEW W(id, länge, breite) AS SELECT T.id, T.länge, T.breite FROM C::Straße T, T.objektart W CREATE VIEW Kennung(sid, W) AS SELECT T.sid, T.wert FROM C::Kennung T, T.art W Beispiel 3.6: Umwandlung der Datenbank C nach D mit SchemaSQL In der ersten Anfrage in Beispiel 3.6 wird die Relation Straße in Teilrelationen entsprechend der Objektart fragmentiert. Dazu wird die Variable W an die Objektarten der Tupel in der Relation Straße gebunden. Die Werte von W werden als Namen der zu erstellenden Sichtrelationen verwendet und die übrigen Attributwerte jedes Tupels werden übernommen. Das Ergebnis dieser Anweisung sind also mehrere Relationen, die die Straßen mit der jeweils passenden Objektart enthalten. Die Umstrukturierung der Kennungen funktioniert auf ähnliche Weise. Die Variable W wird an die Arten von Kennungen gebunden und die erzeugte Sichtrelation erhält ein Attribut für jeden Wert von W. Der Wert des Attributs wert wird als Wert des Attributs, das mit der passenden Kennung benannt ist, übernommen. Somit entspricht das Ergebnis dieser Umstrukturierung der Datenbank D in Abbildung 3.4. FISQL erlaubt es ebenfalls, Anfragen mit dynamischem Ausgabeschema zu 28 3.3 Mechanismen zur Konfliktauflösung formulieren. Variable Ausdrücke können in der Into-Klausel verwendet werden, um die Relationen im Ergebnis dynamisch zu bestimmen, und in einer zusätzlichen On-Klausel, die Anstelle der As-Klausel verwendet wird, um ein Ergebnis mit dynamisch bestimmten Attributen zu erhalten. SELECT T.id, T.länge, T.breite INTO T.objektart FROM C.Straße AS T SELECT T.sid, T.wert ON T.art INTO "Kennung" FROM C.Kennung AS T Beispiel 3.7: Umwandlung der Datenbank C nach D mit FISQL In der ersten Anfrage im Beispiel 3.7 werden die Werte des Attributs objektart der Relation Straße in der Datenbank C mittels der INTO-Anweisung als Namen der Ergebnisrelationen festgelegt. In der zweiten Anfrage wird mit der ONKlausel bestimmt, dass das Ergebnis Attribute enthält, die entsprechend der Werte des Attributs art der Relation Kennung in der Datenbank C benannt sind. In Bezug auf die zweite Anfrage unterscheidet sich die Semantik von SchemaSQL und FISQL (siehe Ergebnisse in Abbildung 3.5). SchemaSQL fasst die Tupel mit dem gleichen sid-Wert zu einem Ergebnistupel zusammen, während FISQL für jedes Ausgangstupel ein Ergebnistupel liefert. sid 2 3 Kennung D EU B83 A2 E30 sid 2 3 3 (a) SchemaSQL Kennung D EU B83 A2 E30 (b) FISQL Abbildung 3.5: Ergebnisse der Umstrukturierung der Relation Kennung In diesem Fall erhält man mit SchemaSQL das gewünschte Ergebnis, allerdings nur deshalb, weil es zu jeder Kombination aus Attributwerten von sid und art nur einen eindeutigen Attributwert von wert gibt. Sollte dies nicht gelten, so führt das Zusammenfassen zu unerwünschten Ergebnissen. FraQL erlaubt keine Substitution in der Create-Table-Klausel oder einer Attributumbennenungsanweisung und erfordert die Festlegung des Schemas beim 29 Integrationskonflikte und Multidatenbanksprachen Erstellen einer Sichtrelation durch die Angabe des Typs. Sichten mit dynamisch bestimmten Schema, wie sie bei der Transformation der Datenbank C entsprechend dem Schema von D hilfreich sind, sind mit FraQL daher nicht möglich. Es sei hier angemerkt, dass die hier vorgestellten Beispiele auch durch SQLAnweisungen realisiert werden könnten, wenn alle in der Datenbank auftretenden Arten von Straßen und Kennungen bekannt sind, indem man diese als Konstanten in die Anweisungen kodiert. Bei größerer Anzahl von unterschiedlichen Arten wird diese Lösung aber immer umständlicher, während die obigen Anweisungen in den Multidatenbanksprachen unverändert bleiben können. 3.4 Integrationskonflikte bei räumlichen Daten Bei der Arbeit mit räumlichen Daten verwendet man wie in Abschnitt 2.3 beschrieben Standard- und geometrische Attribute gemeinsam. Somit können die bis hierher vorgestellten Konflikte auch bei der Integration räumlicher Daten auftreten. Im Folgenden werden einige Konflikte beschrieben, die durch die Hinzunahme von geometrischen Attributen zusätzlich auftreten, und diskutiert, wie diese Konflikte in die Klassifikation in Abschnitt 3.1 eingeordnet werden können. Außerdem wird eine Einschätzung vorgenommen, wie sich die Konfliktauflösungsmechanismen der Multidatenbanksprachen aus Abschnitt 3.2 auf solche durch geometrische Attribute verursachte Konflikte anwenden lassen. Die Semantik eines geometrischen Attributwertes, der durch repräsentative Punkte in einem Koordinatensystem gegeben ist, ergibt sich im Fall von geographischen Objekten dadurch, dass Punkte in diesem Koordinatensystem realen Punkten auf der Erdoberfläche entsprechen. Da man die Abbildung von Punkten in der Datenbank auf reale Orte auf viele unterschiedliche Arten realisieren kann, wird man eher häufig auf den Fall stoßen, dass die räumliche Ausprägung von Objekten der realen Welt in unterschiedlichen Komponentendatenbanken durch unterschiedliche Geometrien repräsentiert ist. Anders ausgedrückt bedeutet dies, dass der Wert eines geometrischen Attributs verschiedene Bedeutungen besitzen kann, wenn man diesen in Kontext von unterschiedlichen Komponentendatenbanken betrachtet. Dieser Fall ähnelt vom Prinzip her beispielweise einem Attribut länge, das in zwei verschiedenen Komponentendatenbanken jeweils die Länge eines Objektes durch einen Zahlenwert beschreibt, wobei dieser Wert im Kontext der ersten Datenbank als Angabe in 30 3.4 Integrationskonflikte bei räumlichen Daten Kilometern, im Kontext der anderen Datenbank jedoch als Angabe in Metern interpretiert wird. Somit kann man hier von einem Beschreibungskonflikt sprechen. Für die Auflösung von Beschreibungskonflikten bei Standardattributen wird in Abschnitt 3.3.1 die Verwendung von Umrechnungsfunktionen oder Ersetzungstabellen vorgeschlagen. Prinzipiell kann man auch benutzerdefinierte Funktionen zur Umrechnung von Geometrien erstellen, wobei die zu realisierende Abbildung dabei meistens recht komplex und daher mit hohem Programmieraufwand verbunden ist. Ersetzungstabellen können auf geometrische Attribute aufgrund der Vielzahl an möglichen Geometrien nicht angewendet werden. Mit dem in Abschnitt 2.4.2 beschriebenen RubberSheeting existiert jedoch ein Verfahren, das Geometrien mit Hilfe von Passpunkten umrechnet. Eine Tabelle, die Passpunkte aus zwei Komponentendatenbanken enthält, stellt in gewissem Sinne ein geometrisches Analogon zu einer Ersetzungstabelle dar, denn durch die Passpunkttabelle wird eine Ersetzungsvorschrift für einzelne Punkte aus den Koordinatensystemen der Komponentendatenbanken definiert. Somit erscheint es als sinnvoll, für die Umrechnung von Geometrien eine Unterstützung von Passpunkttabellen innerhalb einer Multidatenbanksprache anzubieten, was aufgrund der Ausrichtung der Sprachen aus Abschnitt 3.2 auf Standarddaten bisher nicht realisiert ist. Beschreiben räumliche Daten aus unterschiedlichen Komponentendatenbanken zumindest teilweise denselben geographischen Raum, können extensionale Konflikte auftreten, wenn beispielsweise die innerhalb des beschriebenen Gebiets verlaufenden Straßen in beiden Komponentendatenbanken modelliert sind. Wie bereits in Abschnitt 2.4.1 beschrieben wurde, hat man oftmals keine über die Grenzen einer Komponentendatenbank hinaus eindeutigen Identifikatoren für die modellierten Objekte zur Verfügung, um übereinstimmende Objekte zu identifizieren. Daher berechnet man mit großem Aufwand Tabellen, die solche übereinstimmenden Objekte einander zuordnen. Ebenfalls beschrieben wurde bereits, dass dabei aufgrund von unterschiedlicher Einteilung eines geographischen Gebietes in räumliche Datenobjekte mehrdeutige Zuordnungen zwischen diesen Objekten auftreten. Diese Probleme sind nicht auf räumliche Daten beschränkt. Auch bei Standarddaten können Fälle auftreten, in denen man explizit n:m-Zuordnungen zwischen modellierten Objekten abspeichern und ausnutzen möchte. Man denke beispielsweise an Datenbanken, die Texte enthalten, wobei in der einen Datenbank die Texte in Abschnitte gegliedert und in der anderen in Seiten unterteilt sind. Dennoch bieten die in Abschnitt 3.2 vorgestellten Multidatenbanksprachen keine Spracherweiterungen zur Verwendung von explizit abgespeicherten 31 Integrationskonflikte und Multidatenbanksprachen Objektzuordnungen an, da solche Fälle bei Standarddaten offenbar weniger häufig auftreten. Beim Entwurf einer Multidatenbanksprache für räumliche Datenbanken wird man auf derartige Erweiterungen aber nicht verzichten können. Die Identifizierung von übereinstimmenden Objekten über mehrdeutige Zuordnungen verkompliziert ebenfalls die Auflösung von Datenkonflikten. In solchen Fällen können diese Konflikte nicht nur auftreten, wenn übereinstimmende Objekte in verschiedenen Komponentendatenbanken einen unterschiedlichen Wert für eine Eigenschaft besitzen, sondern auch, wenn innerhalb einer Komponentendatenbank Objekte mit sich unterscheidenden Eigenschaften zu einem aggregierten Objekt zusammengefasst werden. Man stelle sich beispielsweise modellierte Straßenabschnitte vor, denen jeweils unterschiedliche Breitenwerte zugeordnet sind, wobei der Datenkonflikt darin besteht, dass beim Zusammenfassen dieser Abschnitte zu einem größeren Abschnitt diesem nicht ohne weiteres eine eindeutige Breite zugeordnet werden kann. Zur Auflösung solcher durch die Aggregation verursachter Datenkonflikte kann das Konzept für Konfliktauflösungsfunktionen aus Abschnitt 3.3.3 nicht angewendet werden, da in dem durch die Sprache FraQL realisierten Ansatz eine Konfliktauflösungsfunktion immer aus genau zwei als übereinstimmend identifizierten Tupeln ein Ergebnistupel berechnet, aggregierte Objekte jedoch aus beliebig vielen einzelnen Objekten zusammengesetzt sein können. 32 Kapitel 4 Entwurf der SQL-Erweiterung In diesem Kapitel wird der Entwurf einer SQL-Erweiterung SQLSF 1 vorgestellt, die zur Integration von räumlichen Daten verwendet werden kann. Diese ist zum Teil inspiriert von den in Kapitel 3 vorgestellten Sprachkonstrukten, allerdings sind Konzepte wie mehrwertige Attribute oder Komponentendatenbanklinks im Kontext von Multidatenbanksprachen neu. In Abschnitt 4.1 werden zunächst einige grundlegende Begriffe erläutert, die beim Entwurf der Sprache eine Rolle spielen. Der folgende Abschnitt 4.2 beschreibt die Verwendung von Ersetzungstabellen und Passpunkten zur Umrechnung von Attributwerten. In Abschnitt 4.3 werden Sprachkonstrukte zum Erzeugen von mehrwertigen Attributen und zum Umgang mit Datenkonflikten eingeführt. Abschnitt 4.4 stellt Integrationsoperatoren vor, die abgespeicherte Zuordnungen zwischen Objekten ausnutzen und Abschnitt 4.5 beschreibt eine Spracherweiterung zur Realisierung von Daten-Metadaten-Transformationen. 4.1 4.1.1 Grundbegriffe Das relationale Modell Eine Datenbank besteht aus einer Menge von Relationen und einem Schema. Das Schema ordnet jeder Relation einen in der jeweiligen Datenbank eindeutigen Namen und eine Menge von Attributen zu. Jedem einer Relation zugeordneten Attribut wird wiederum durch das Schema ein innerhalb der Attri1 Structured Query Language for Spatial Federations 33 Entwurf der SQL-Erweiterung butmenge dieser Relation eindeutiger Name und ein Wertebereich, der auch Datentyp des Attributs genannt wird, zugeordnet. Eine Relation besteht aus einer Menge von Tupeln. Ein Tupel definiert für alle Attribute einer Relation eine Zuordnung eines Wertes aus dem Wertebereich des Attributs zu diesem Attribut. Weiterhin ist durch das Schema für jede Relation ein Schlüssel festgelegt. Dieser besteht aus einer Teilmenge der Attribute der Relation, wobei in dieser Relation keine zwei Tupel existieren dürfen, die den Attributen des Schlüssels dieselben Werte zuordnen. In Abbildung 4.1 sind die im Folgenden verwendeten Abkürzungen für diese Begriffe aufgelistet. name(R) attributes(R) key(R) name(A) type(A) t.A Name der Relation R Menge der Attribute der Relation R Schlüssel der Relation R Name des Attributs A Wertebereich des Attributs A Wert des Attributs A im Tupel t Abbildung 4.1: Abkürzungen 4.1.2 NF2 -Relationen Eine Relation ist in 1NF (1.Normalform), wenn alle Attribute einzelne atomare Werte besitzen. Wird diese Bedingung nicht eingehalten, indem Attributen mehr als ein Wert zugeordnet wird, spricht man von NF2 -Relationen (NonFirst-Normal-Form). Es existieren verschiedene Ansätze zur Repräsentation von NF2 -Relationen, die in Abbildung 4.2 beispielhaft dargestellt sind. Dabei handelt es sich um Relationen, die aggregierte Straßen-Objekte modellieren, welche aus mehreren einzelnen Objekten zusammengesetzt sind. Der erste Ansatz (ausführlich vorgestellt z.B. in [OOM87]) in Abbildung 4.2 (a) erlaubt es, dass der Wert eines Attributs eine Menge von atomaren Werten ist, z.B. die Menge der Identifikationsnummern der zu einem aggregierten Objekt zusammengefassten Objekte. Diese Darstellung hat allerdings den Nachteil, dass nicht rekonstruierbar ist, welche einzelnen Werte unterschiedlicher Attribute zu demselben einzelnen Objekt gehören. In Abbildung 4.2 (b) werden Arrays als Attributwerte eingesetzt. Die dabei implizit vorhandene Nummerierung der einzelnen Attributwerte über den Index wird zur Modellierung der Zusammengehörigkeit von Attributwerten verwendet, indem zusammengehörende Werte unterschiedlicher Attribute an der selben Position im Array abgelegt sind. 34 4.1 Grundbegriffe aid 1 Straße oid breite {235, {15m, 236, 12m} 237} {214, 215} 2 {16m, 14m} (a) Mengen als Attributwerte aid 1 2 aid Straße oid [1] 235 [2] 236 [3] 237 breite [1] 15m [2] 12m [3] 15m [1] 214 [2] 215 [1] 16m [2] 14m (b) Arrays als Attributwerte Straße nested table 1 oid 235 236 237 breite 15m 12m 15m 2 oid 214 215 breite 16m 14m (c) Relationen als Attributwerte Abbildung 4.2: Unterschiedliche Ansätze zur Realisierung von NF2 -Relationen Eine weitere Möglichkeit ist die Verwendung von sogenannten Nested-Relations (siehe z.B. Beschreibung in [EN00]). Dabei können einem Attribut einer Relation wiederum Relationen als Werte zugewiesen werden (siehe Abbildung 4.2 (c)). Im Beispiel entspricht jedes Tupel in einer der geschachtelten Relationen einem einzelnen Straßenabschnitt, der zu dem jeweiligen aggregierten Straßenobjekt gehört. 4.1.3 Arrays Um Tupel darstellen zu können, die für einzelne Attribute mehr als einen Wert besitzen, werden hier Arrays als Datentypen von Attributen erlaubt. Die Verwendung von Arrays bietet sowohl den Vorteil einer relativ einfachen Struktur der damit gebildeten NF2 -Relationen als auch die Rekonstruierbarkeit der Zusammengehörigkeit von Attributwerten. Weiterhin sind Arrays seit 1999 auch Bestandteil des SQL-Standards (siehe z.B. [EM99]) und in vielen Datenbanksystemen bereits implementiert. Um auch Skeptiker zu überzeugen, die hartnäckig eine Einhaltung der 1. Normalform fordern, wird in [EM99] argumentiert, dass Arrays diese nicht wirklich verletzen, da es sich lediglich um einen zusammengesetzten Datentyp handelt, der einen komfortablen Zugriff auf einzelne Bestandteile erlaubt. Konzeptionell besteht somit kein Unterschied zu einer Zeichenkette, die ebenfalls aus mehreren kürzeren Zeichenketten zusammengesetzt sein kann und mittels einer Substring-Funktion zerlegbar ist. 35 Entwurf der SQL-Erweiterung Ein Array von n Elementen aus einer Menge Σ ist eine Abbildung ωn : {1, . . . , n} → Σ von der Menge der ersten n natürlichen Zahlen in die Menge Σ. Die Menge aller Arrays von Elementen aus Σ sei definiert als die Menge aller derartiger Abbildungen: ∞ [ Array [Σ] = {ωn } n=1 Der Datentyp eines mehrwertigen Attributs ist dann eine solche Menge von Arrays. Beispielsweise ist der Datentyp des Attributs oid in Abbildung 4.2(c) die Menge aller Arrays mit natürlichen Zahlen als Elementen: type(oid) = Array[N] 4.1.4 Verlinken von Komponentendatenbanken Wie bereits in Abschnitt 2.2 beschrieben, verwendet der Föderierungsdienst eines föderierten Datenbanksystems eine Arbeitsdatenbank, in der Informationen gespeichert werden, die man zur Integration der Daten aus den beteiligten Komponentendatenbanken benötigt. Einige der im folgenden definierten Spracherweiterungen basieren darauf, dass diese Informationen in Form von Links organisiert sind, die immer zwei Komponentendatenbanken miteinander verbinden. Mit diesen Erweiterungen können Daten aus zwei Komponentendatenbanken mittels eines solchen Komponentendatenbanklinks verknüpft werden, wobei implizit die unter diesem Link abgespeicherten Informationen verwendet werden. Ein solcher Komponentendatenbanklink besitzt hier implizit immer eine Richtung, die dadurch gegeben ist, dass eine Komponentendatenbank als linke und die andere als rechte Komponentendatenbank bezeichnet wird. Es wird hier bei der Verwendung von Komponentendatenbanklinks vorausgesetzt, dass in jeder Komponentendatenbank Identifikatoren für die enthaltenen Objekte existieren und dass diese zumindest in der jeweiligen Datenbank eindeutig sind. Die Attribute, die diese Identifikatoren enthalten, heißen im folgenden Identifikatorattribute. Abbildung 4.3 zeigt beispielhaft einige Tabellen in der Arbeitsdatenbank, die Informationen zur Integration von zwei Komponentendatenbanken enthalten und einem Komponentendatenbanklink zugeordnet werden können. 36 4.1 Grundbegriffe Arbeitsdatenbank: ObjektartTransition objektartA objektartB Landstraße 3105 Gewerbegebiet 2013 Siedlung 2203 xA 52.32 64.22 81.32 ReferencePoints yA xB yB 44.21 50.79 43.25 15.37 89.36 15.68 13.28 72.74 14.05 AggregationA oid aggID 321 81 322 82 323 81 324 83 AggregationB oid aggID 561 11 562 12 563 11 ObjektLinkAB aid bid 321 562 322 561 322 563 323 562 LinkAB aid bid 81 12 82 11 Abbildung 4.3: Tabellen mit Informationen zum Verlinken von zwei Komponentendatenbanken • Ersetzungstabellen, wie die Tabelle ObjektartTransition, sind für die Umrechnung von Attributwerten bestimmt. Solche Tabellen müssen mindestens zwei Spalten, im folgenden als linkes und rechtes Werteattribut bezeichnet, besitzen, die mögliche Werte eines Attributs aus der linken und die zugehörigen Werte eines Attributs aus der rechten Komponentendatenbank enthalten. Es können dem Komponentendatenbanklink zusätzlich Default-Werte zur Umrechnung von nicht in der Tabelle auftretenden Werten zugeordnet werden. • Für die Transformation von Geometrien kann einem Komponentendatenbanklink eine Tabelle mit Passpunkten zugewiesen werden, im Beispiel die Tabelle ReferencePoints, die vier Spalten mit den Koordinaten von jeweils zwei übereinstimmenden Punkten aus den Komponentendatenbanken enthält. Durch diese Tabelle und das in Abschnitt 2.4.2 beschriebene Rubber Sheeting wird eine Abbildung zur Umrechnung von Geometrien der Komponentendatenbanken definiert, wobei zu einer Passpunktabelle noch ein Parameter für die Stärke der Verzerrung festgelegt werden muss. • Bei der Objektzuordnung (siehe Abschnitt 2.4.1) berechnete Tabellen, die einzelne Objekte einer Komponentendatenbank zu aggregierten Objekten zusammenfassen (beispielsweise AggregationA und AggregationB), besitzen zwei Spalten für die Identifikatoren der aggregierten und zugehörigen einzelnen Objekte. Im folgenden werden diese Tabellen als Aggregierungstabellen und ihre Spalten als Identifikatorattribut bzw. Aggregierungsidentifikatorattribut bezeichnet. Einem Komponentendatenbanklink kann jeweils eine Aggregierungstabelle für die linke und rechte Komponentendatenbank zugeordnet sein. 37 Entwurf der SQL-Erweiterung • Tabellen zur Abspeicherung von Zuordnungen enthalten zwei Spalten für die Identifikatoren der zugeordneten Objekte. Man kann einem Komponentendatenbanklink eine Tabelle mit Zuordnungen von einzelnen Objekten (z.B. ObjektLinkAB) und eine Tabelle mit Zuordnungen von aggregierten Objekten (z.B. LinkAB) zuweisen. Solche Tabellen werden im folgenden als Objektlinktabellen bzw. Linktabellen und ihre Spalten als linkes und rechtes Identifikatorattribut bzw. Aggregierungsidentifikatorattribut bezeichnet. Bevor solche Tabellen implizit zur Beantwortung von Anfragen, die Informationen aus zwei Komponentendatenbanken integrieren, ausgenutzt werden können, muss ein Komponentendatenbanklink zwischen diesen Datenbanken angelegt und die Tabellen als Bestandteile dieses Links registriert werden. Dabei werden die Namen der Tabellen, der Spalten und der in den Komponentendatenbanken referenzierten Attribute im Anfragesystem abgespeichert, so dass diese bei der Formulierung von Anfragen nicht mehr angegeben werden müssen. In Abschnitt 5.2 ist ausführlich beschrieben, wie man im Anfragesystem Komponentendatenbanklinks anlegt und wie man zugeordnete Tabellen registriert. 4.2 Attributtransformation Die Auflösung von Beschreibungskonflikten erfordert es, Attributwerte umzurechnen, da sich die Semantik eines Wertes innerhalb verschiedener Komponentendatenbanken unterscheiden kann. Wie bereits in Abschnitt 3.3.1 beschrieben können mit den Möglichkeiten von SQL benutzerdefinierte Funktionen zur Umrechnung verwendet werden. Eine andere dort beschriebene Option, Abbildungen auf Tupelebene zu realisieren, ist die Verwendung von Ersetzungstabellen. Auch für SQLSF wird im folgenden eine Möglichkeit erläutert, Ersetzungstabellen für Standardattribute zu verwenden. Für geometrische Attribute können Tabellen mit Passpunkten verwendet werden, um die enthaltenen Geometrien umzurechnen. Die folgenden Beispiele beziehen sich auf die Datenbanken in Abbildung 4.4. Die Datenbanken A und B enthalten jeweils eine Relation mit geographischen Objekten, wobei sich die Darstellung der Attributart unterscheidet. Um diese Darstellungen ineinander umzurechnen, soll die Tabelle ObjektartTransition in der Arbeitsdatenbank verwendet werden. Die Tabelle ReferencePoints enthält die Koordinaten von Passpunkten aus den Komponentendatenbanken. 38 4.2 Attributtransformation Datenbank A: oid 101 102 103 104 Objekt objektart Landstraße Gewerbegebiet Siedlung Weg Datenbank B: geometrie oid 101 102 103 104 Objekt objektart geometrie 3105 2013 2203 9999 Arbeitsdatenbank: ObjektartTransition objektartA objektartB Landstraße 3105 Gewerbegebiet 2013 Siedlung 2203 xA 52.32 364.22 81.32 ReferencePoints yA xB 44.21 50.79 15.37 389.36 103.28 72.74 yB 43.25 15.68 96.05 Abbildung 4.4: Beispieldatenbanken sowie Ersetzungs- und Passpunkttabelle in der Arbeitsdatenbank 4.2.1 Standardattribute Während FraQL einen Vorschlag enthält, mit dem Ersetzungstabellen für einzelne Attribute in der Anfrage referenziert werden können, wird es hier ermöglicht, Ersetzungstabellen, die als Bestandteil eines Komponentendatenbanklinks eingerichtet wurden, implizit zur Umrechnung innerhalb von Anfragen zu verwenden. Dazu müssen dass umzurechnende Attribut und der Komponentendatenbanklink innerhalb einer Transform-Klausel angegeben werden, die Anstelle eines gewöhnlichen Ausdrucks in der Select-Klausel angewendet werden kann. Bei dieser Art von Verwendung eines Komponentendatenbanklinks muss durch das Schlüsselwort LEFT bzw. RIGHT angegeben werden, auf welcher Seite des Links sich die Datenbank befindet, aus der das umzurechnende Attribut stammt. Sei R eine Relation in einer Komponentendatenbank K1 mit mindestens zwei Attributen A und B. Weiterhin existiere ein Komponentendatenbanklink L, der K1 mit einer anderen Komponentendatenbank K2 verbindet. Sei T ab eine Ersetzungstabelle mit den Werteattributen B1 und B2 , die dem Komponentendatenbanklink L zur Umrechnung des Attributs B in ein Attribut B 0 in der Komponentendatenbank K2 zugeordnet ist. Dabei enthalte das linke Werteattribut B1 paarweise verschiedene mögliche Werte von B und das rechte Werteattribut B2 die semantisch äquivalenten Werte von B 0 . Sei schließlich D ein dieser Umrechnung zugeordneter Default-Wert für B 0 . 39 Entwurf der SQL-Erweiterung Die Anweisung SELECT A, TRANSFORM B USING LEFT LINK L FROM R definiert eine neue Relation S mit zwei Attributen A und B 0 , die für jedes Tupel t aus der Ursprungsrelation R ein Tupel s(t) enthält. attributes(S) = {A, B 0 } S = {s(t) | t ∈ R} Dabei wird der Wert des Attributs A von s(t) unverändert übernommen, während das Attribut B 0 den Wert des Attributs B2 in der Zeile der Ersetzungstabelle T ab erhält, deren Wert des Attributs B1 mit dem Wert des Attributs B von t übereinstimmt. Falls keine solche Zeile in der Ersetzungstabelle T ab existiert, wird dem Attribut B 0 der Default-Wert D zugewiesen. Diese Definition ist eindeutig, da B1 keine doppelten Werte enthält. Also gilt: s(t).A = t.A ( t0 .B2 0 s(t).B = D falls t0 ∈ T ab existiert mit t0 .B1 = t.B, sonst. Dieselbe Ersetzungstabelle kann auch verwendet werden, um die Werte des Attributs B 0 in der rechten Komponentendatenbank K2 in die Darstellung von K1 zu transformieren. In diesem Fall ist anstelle von LEFT das Schlüsselwort RIGHT zu verwenden. Als Beispiel sei angenommen dass für die Datenbanken A und B in Abbildung 4.4 ein Komponentendatenbanklink mit dem Namen A B eingerichtet, die Tabelle ObjektartTransition für die Umrechnung der Objektart-Attribute registriert und dabei für die Datenbank B die Default-Objektart 9999 festgelegt wurde. In der Anfrage in Beispiel 4.1 muss dann nur der Name des Datenbanklinks referenziert werden, um die alphanumerische Objektart der Objekte aus der Datenbank A anhand der Ersetzungstabelle in die numerische Darstellung der Datenbank B zu transformieren. Da die Tabelle ObjektartTransition keine Ersetzung für den Wert Weg enthält, wird dem entsprechenden Objekt die festgelegte Default-Objektart zugewiesen. 40 4.2 Attributtransformation SELECT oid, TRANSFORM objektart USING LEFT LINK A_B, geometrie FROM A.Objekt oid 101 102 103 104 objektart 3105 2013 2203 9999 geometrie Beispiel 4.1: Umrechnung der Objektart durch Verwendung eines Komponentendatenbanklinks mit zugeordneter Ersetzungstabelle 4.2.2 Geometrische Attribute Für die Umrechnung eines geometrischen Attributs kann in dieser SQL-Erweiterung implizit eine Tabelle mit Passpunkten, die für ausgewählte Punkte beschreibt, wie diese umzurechnen sind, verwendet werden. Dazu muss diese Tabelle ebenfalls einem Komponentendatenbanklink zugeordnet sein, der die Komponentendatenbank mit den umzurechnenden Geometrien mit einer weiteren Datenbank verbindet. Bei Anwendung der Transform-Klausel auf ein geometrisches Attribut wird dann implizit das in Abschnitt 2.4.2 beschriebene Rubber Sheeting ausgeführt, wobei die dem referenzierten Komponentendatenbanklink zugeordnete Passpunkttabelle und der zugehörige Verzerrungsparameter verwendet werden. In der Anfrage in Beispiel 4.2 wird die Transform-Klausel verwendet, um die Geometrien aus der Komponentendatenbank B in Abbildung 4.4 in eine an die Datenbank A angepasste Darstellung zu transformieren. Es sei wiederum angenommen, dass zwischen den Datenbanken ein Komponentendatenbanklink SELECT oid, objektart, TRANSFORM geometrie USING RIGHT LINK A_B FROM B.Objekt oid 101 102 103 104 objektart 3105 2013 2203 9999 geometrie Beispiel 4.2: Transformation von Geometrien durch implizite Verwendung einer Passpunkttabelle 41 Entwurf der SQL-Erweiterung mit dem Namen A B eingerichtet und diesem die Tabelle ReferencePoints als Passpunkttabelle zugeordnet wurde. 4.2.3 Bemerkungen Neben Ersetzungs- und Passpunkttabellen sind andere Möglichkeiten vorstellbar, Beschreibungskonflikte auf Standard- oder geometrischen Attributen durch Transformation von Attributwerten aufzulösen. Alternative Verfahren können als benutzerdefinierte Funktionen innerhalb des föderierten Datenbanksystems erstellt und anschließend in Anfragen angewendet werden. Dies stellt allerdings keine Erweiterung zum aus SQL bekannten Sprachumfang dar und ist deshalb hier nicht beschrieben. 4.3 Mehrwertige Attribute Mehrwertige Attribute werden in dieser Spracherweiterung benutzt, um Datenkonflikte zu repräsentieren. Diese treten auf, wenn Objekte aus unterschiedlichen Komponentendatenbanken, deren Attributwerte sich unterscheiden, zusammengefasst werden. Außerdem stösst man auf diese Konflikte, wenn man mehrere Objekte in einer Komponentendatenbank zu einem aggregierten Objekt zusammenfasst. Die folgenden Abschnitte enthalten Sprachvorschläge zur Unterstützung dieser Operationen und zur Auflösung von Datenkonflikten. Diese Vorschläge werden anhand der Datenbanken in Abbildung 4.5 demonstriert. Die Datenbanken A und B enthalten jeweils eine Relation mit Straßen-Objekten. In der Arbeitsdatenbank befindet sich jeweils eine Aggregierungstabelle für jede Komponentendatenbank, die einzelne Objekte aus dieser Komponentendatenbank zu aggregierten Objekten zusammenfasst. 4.3.1 Aggregation Mit der hier vorgestellten Erweiterung der Anfragesprache SQL ist es möglich, die Tupel in einer Relation zu Tupeln mit mehrwertigen Attributen zu aggregieren. Dazu wird hier die Verwendung einer Aggregate-Klausel vorgeschlagen, die ähnlich der aus SQL bekannten Group-By-Klausel Tupel zusammenfasst, die in bestimmten Attributwerten übereinstimmen. Der Unterschied besteht darin, dass die Group-By-Klausel nur zusammen mit Aggregierungsfunktionen eingesetzt werden darf, die aus mehreren Attributwerten einen einzigen berechnen, 42 4.3 Mehrwertige Attribute Datenbank A: oid 214 215 235 236 237 länge 6100m 4800m 3200m 4300m 1500m Datenbank B: Straße breite 16m 14m 15m 12m 15m geometrie oid 14 15 16 36 37 länge 5400m 4600m 700m 5100m 1900m Straße breite 17m 15m 14m 13m 16m geometrie Arbeitsdatenbank: AggregationA aid oid 1 214 1 215 2 235 2 236 2 237 AggregationB aid oid 1 14 1 15 1 16 2 36 2 37 Abbildung 4.5: Komponentendatenbanken mit Straßen-Relationen und in der Arbeitsdatenbank abgespeicherte Aggregierungstabellen und somit das Anfrageergebnis die 1.Normalform besitzt. Mit der AggregateKlausel gebildete Relationen enthalten hingegen Attribute, deren Werte Arrays sind, die die zusammengefassten Attributwerte als Elemente enthalten. Sei R eine Relation mit mindestens m + 1 Attributen A und B1 , . . . , Bm und seien a1 , . . . , an alle paarweise verschiedenen Attributwerte, die das Attribut A in der Relation R annimmt. Die Anweisung SELECT A,B1 ,. . . ,Bm FROM R AGGREGATE BY A definiert eine neue Relation S mit dem unveränderten Attribut A und m mehr0 wertigen Attributen B10 , . . . , Bm , deren Typ die Menge aller Arrays von Elementen des Typs des jeweiligen Ursprungsattributs ist. Also gilt für alle j mit 1≤j≤m: type(Bj0 ) = Array[type(Bj )] Die Relation S enthält ein Tupel si für jede Gruppe θi der ni Tupel aus R, die den Wert ai des Attributs A besitzen. S = {si | 1 ≤ i ≤ n} 43 Entwurf der SQL-Erweiterung Dabei gilt für alle i mit 1 ≤ i ≤ n : θi = {t | t ∈ R ∧ t.A = ai } Der Wert des Attributs A des Tupels si wird unverändert übernommen und der Wert von Bj0 ist ein Array, das die Werte des Attributs Bj aller Tupel aus θi enthält. Dabei stehen die Werte des k-ten Tupels tik aus θi in allen m Arrays an der Position k. Also gilt für alle i, j mit 1 ≤ i ≤ n und 1 ≤ j ≤ m : si .A = ai si .Bj0 [k] = tik .Bj für 1 ≤ k ≤ ni und ni = |θi | Ein Beispiel für die Verwendung der Aggregate-Klausel zeigt die Anwendung der Anfrage in Beispiel 4.3 auf die Datenbanken in Abbildung 4.5. Dabei wird zunächst die Straße-Relationen aus der Datenbank A mit der entsprechenden Aggregierungstabelle aus der Arbeitsdatenbank verbunden. Anschließend werden Objekte, die zu demselben aggregierten Objekt gehören, zusammengefasst. SELECT a.aid, s.länge, s.breite, s.geometrie FROM A.Straße s JOIN AggregationA a ON s.oid = a.oid AGGREGATE BY a.aid aid 1 länge [1] 6100m [2] 4800m breite [1] 16m [2] 14m geometrie [1] [2] 2 [1] 3200m [2] 4300m [3] 1500m [1] 15m [2] 12m [3] 15m [1] [2] [3] Beispiel 4.3: Verbund einer Relation mit der passenden Aggregierungstabelle und Aggregation zusammengehörender Objekte Das Ergebnis dieser Anfrage ist eine Relation mit drei mehrwertigen Attributen länge, breite und geometrie, wobei diese für jedes aggregierte Objekt die Attributwerte der zugehörigen einzelnen Objekte enthalten. Dabei sind Attributwerte, die zum selben einzelenen Objekt gehören in allen drei Arrays an derselben Position zu finden. 4.3.2 Aggregierungstabellen Eine andere Möglichkeit, Objekte auf diese Art zusammenzufassen, besteht hier darin, einen Komponentendatenbanklink auszunutzen, dem die entsprechenden 44 4.3 Mehrwertige Attribute Aggregierungstabellen zugeordnet sind. In diesem Fall müssen die Tabelle und die benötigten Spalten nicht mehr in der Anfrage referenziert werden. Stattdessen wird die Aggregate-Klausel mit einer Using-Link-Klausel kombiniert, so dass nur noch der Name des Komponentendatenbanklinks und auf welcher Seite sich die Datenbank mit den zu aggregierenden Objekten befindet angegeben werden muss. Voraussetzung ist, dass die zu aggregierende Relation die Identifikatoren aus der jeweiligen Komponentendatenbank enthält. Dem Ergebnis wird implizit das Attribut mit den Identifikatoren der aggregierten Objekte hinzugefügt. Man betrachte die Anfrage in Beispiel 4.4, die die Objekte in der Datenbank A in Abbildung 4.5 aggregiert. Es sei angenommen, dass zwischen den Datenbanken A und B ein Komponentendatenbanklink mit dem Namen A B eingerichtet und die Aggregierungstabellen AggregationA und AggregationB für die linke bzw. rechte Komponentendatenbank registriert wurden. In diesem Fall kann die Aggregate- mit einer Using-Link-Klausel kombiniert werden, durch die festgelegt wird, dass implizit die dem Komponentendatenbanklink A B zugeordneten Aggregierungstabellen zur Bildung der aggregierten Objekte benutzt werden. Das Schlüsselwort LEFT gibt an, dass die Objekte der linken Komponentendatenbank aggregiert werden sollen und somit implizit die Aggregierungstabelle AggregationA verwendet werden muss. Zur Aggregation der Objekte in der Datenbank B müsste folglich das Schlüsselwort RIGHT verwendet werden. Man erhält mit dieser Anfrage dasselbe Ergebnis wie in Beispiel 4.3, da das Attribut aid implizit zum Ergebnis hinzugefügt wird. SELECT länge, breite, geometrie FROM A.Straße AGGREGATE USING LEFT LINK A_B aid 1 länge [1] 6100m [2] 4800m breite [1] 16m [2] 14m geometrie [1] [2] 2 [1] 3200m [2] 4300m [3] 1500m [1] 15m [2] 12m [3] 15m [1] [2] [3] Beispiel 4.4: Aggregation der Straßen-Objekte aus der Datenbank A mittels abgespeicherter Aggregationstabelle 45 Entwurf der SQL-Erweiterung 4.3.3 Auflösen von Datenkonflikten Für die Auflösung von Datenkonflikten, die in Form eines mehrwertigen Attributs repräsentiert sind, genügt es, auf Tupelebene Abbildungen anzuwenden, die aus den Werten eines mehrwertigen Attributs einen eindeutigen Wert berechnen. Solche Abbildungen lassen sich als benutzerdefinierte Funktionen innerhalb des Datenbanksystems realisieren. Diese können dann in Anfragen verwendet werden, um ein Array mit zueinander in Konflikt stehenden Werten in einen aufgelösten Wert umzuformen. Im folgenden werden einige nützliche Konfliktauflösungsfunktionen vorgeschlagen. Diese sollen als Standardauflösungsmethoden bereits Bestandteil eines SQLSF-Anfragesystems sein. Für Fälle in denen diese Funktionen nicht ausreichen, können innerhalb des Datenbanksystems weitere Konfliktauflösungsfunktionen programmiert werden. Wie dies zu erreichen ist, ist implementationsabhängig und wird in Abschnitt 7.5 für den in dieser Arbeit erstellten Prototypen beschrieben. Es werden hier nur die in dieser Arbeit am häufigsten verwendeten Datentypen Zahl, Zeichenkette und Geometrie betrachtet. Konfliktauflösungsfunktionen für Zahlen • sumOf : Array[Number] → Number Berechnet die Summe der Elemente eines Arrays von Zahlen. • avgOf : Array[Number] → Number Berechnet den Durchschnitt der Elemente eines Arrays von Zahlen. • weightedAvgOf : Array[Number] × Array[Number] → Number Berechnet den Durchschnitt der Elemente des zweiten Arrays gewichtet mit denen des ersten. • maxOf : Array[Number] → Number Berechnet das Maximum der Elemente eines Arrays von Zahlen. • minOf : Array[Number] → Number Berechnet das Minimum der Elemente eines Arrays von Zahlen. Konfliktauflösungsfunktionen für Zeichenketten • maxOf : Array[String] → String Berechnet das Maximum einer alphabetischen Ordnung der Elemente eines Arrays von Zeichenketten. • minOf : Array[String] → String Berechnet das Minimum einer alphabetischen Ordnung der Elemente eines Arrays von Zeichenketten. 46 4.3 Mehrwertige Attribute Konfliktauflösungsfunktionen für Geometrien • spatialUnionOf : Array[Geometry] → Geometry Berechnet die Vereinigung der Elemente eines Arrays von Geometrien. • spatialIntersectionOf : Array[Geometry] → Geometry Berechnet den Schnitt der Elemente eines Arrays von Geometrien. Manche Methoden zur Konfliktauflösung, wie z.B. die Bevorzugung von Werten aus einer der Komponentendatenbanken, können bei allen Typen von Attributwerten eingesetzt werden. Daher werden hier Konfliktauflösungsfunktionen der folgenden Art für jeden der obigen drei Datentypen vorgeschlagen. • preferLeftT ypeOf : Array[T ype] → T ype Liefert das erste Element eines Arrays von Elementen eines bestimmten Typs. Falls dieses Element ein Nullwert ist, wird das zweite zurückgegeben. • preferRightT ypeOf : Array[T ype] → T ype Liefert das zweite Element eines Arrays von Elementen eines bestimmten Typs, falls dieses Element von Null verschieden ist, ansonsten das erste. • firstT ypeOf : Array[T ype] → T ype Liefert das erste von Null verschiedene Element eines Arrays von Elementen eines bestimmten Typs. In Beispiel 4.5 ist noch einmal die Aggregation der Straßen-Objekte aus Datenbank A dargestellt, allerdings diesmal mit Auflösung der Datenkonflikte durch passende Funktionen. Das Ergebnis dieser Anfrage enthält damit auch weiterhin ein Tupel für jedes aggregierte Objekt, allerdings sind die Attribute länge, breite und geometrie hier nicht mehrwertig. SELECT aid, sumOf(länge) AS länge, weightedAvgOf(länge, breite) AS breite, spatialUnionOf(geometrie) AS geometrie FROM A.Straße AGGREGATE USING LEFT LINK A_B aid 1 2 länge 10900 9000 breite 15.1 13.6 geometrie Beispiel 4.5: Aggregation der Straßen aus Datenbank A mit Konfliktauflösung Die Länge eines aggregierten Objekts wird mit der Funktion sumOf durch Summation der Längen der zugehörigen einzelnen Objekte gebildet. Zur Berech47 Entwurf der SQL-Erweiterung nung eines Breitenwertes wird mit der Funktion weightedAvgOf der Durchschnitt der einzelnen Breitenwerte gewichtet mit der zugehörigen Länge berechnet. Die Geometrie des aggregierten Objekts erhält man hier durch Berechnung der Vereinigung aller einzelnen Geometrien mit der Funktion spatialUnionOf. 4.3.4 Bemerkungen Etwas umständlicher ist die hier beschriebene Art von Aggregation auch durch eine Anfrage mit Group-By-Klausel darstellbar. Allerdings benötigt man für jeden Datentyp eines zu aggregierenden Attributs eine eigene Aggregierungsfunktion, die Elemente dieses Datentyps zu einem Array zusammenfasst. Im Beispiel 4.6 sind dies Funktionen für die Aggregation von Zahlen und Geometrien. Somit liefert diese Anfrage das selbe Ergebnis wie Beispiel 4.3. SELECT a.aid, aggregateNumber(s.länge) AS länge, aggregateNumber(s.breite) AS breite, aggregateGeometry(s.geometrie) AS geometrie FROM A.Straße s JOIN AggregationA a ON s.oid = a.oid GROUP BY a.aid Beispiel 4.6: Aggregation mit Group-By-Klausel 4.4 Integrationsoperatoren Dieser Abschnitt beschreibt Operatoren zur Integration von Objekten aus unterschiedlichen Komponentendatenbanken, für die explizit Zuordnungen in der Arbeitsdatenbank abgespeichert sind. Dazu werden die SQL-Operatoren zur Berechnung von Verbund und Vereinigung dahingehend erweitert, dass implizit die in dem Zuordnungsschema aus Abschnitt 2.4.1 strukturierten Zuordnungen ausgenutzt werden, so dass man diese Operatoren verwenden kann, ohne die Details des Zuordnungsschemas zu kennen. Die Anwendung dieser Operatoren erfolgt durch Kombination der Join- bzw. Union-Klausel mit der in dieser Arbeit neu eingeführten Using-Link-Klausel. Als Beispiel betrachte man die Datenbanken in Abbildung 4.6. Die Komponentendatenbanken enthalten jeweils eine Tabelle mit räumlichen Objekten. In der Arbeitsdatenbank enthält die Tabelle ObjektLinkAB Zuordnungen der einzelnen räumlichen Objekte. Die Tabellen AggregationA und AggregationB 48 4.4 Integrationsoperatoren enthalten Repräsentationen für die beim Matching gebildeten aggregierten Objekte in der Datenbank A bzw. B und ordnen diesen aggregierten Objekte die zugehörigen Einzelobjekte zu. Die Tabelle LinkAB enthält die Zuordnungen der aggregierten Objekte. Datenbank A: oid 321 322 323 324 Datenbank B: Objekt objektart geometrie Straße Siedlung Straße Straße oid 561 562 563 Objekt objektart geometrie Siedlung Straße Siedlung Arbeitsdatenbank: AggregationA oid aggID 321 81 322 82 323 81 324 83 AggregationB oid aggID 561 11 562 12 563 11 ObjektLinkAB aid bid 321 562 322 561 322 563 323 562 LinkAB aid bid 81 12 82 11 Abbildung 4.6: Komponentendatenbanken und abgespeicherte Zuordnungen 4.4.1 Der erweiterte Verbundoperator Zunächst wird ein erweiterter Operator zur Berechnung von Verbunden eingeführt. Hat man einmal die notwendigen Daten zur Zuordnung von Objekten aus unterschiedlichen Komponentendatenbanken in der Arbeitsdatenbank hinterlegt und einen entsprechenden Komponentendatenbanklink eingerichtet, kann dieser Link in der Anfrage referenziert werden, um einen Verbund der über diesen Link zugeordneten Objekte zu berechnen. Dazu ist es erforderlich, dass die zu verbindenden Relationen die Identifikatoren aus der jeweiligen Komponentendatenbank enthalten. In der Anfrage in Beispiel 4.7 werden zugeordnete Objekte, die jeweils durch das Attribut oid identifiziert sind, aus den Datenbanken A und B verbunden. Dazu wird die Using-Link-Klausel in Verbindung mit der Join-Klausel eingesetzt um anzugeben, dass die Zuordnungen des Komponentendatenbanklinks A B, also in diesem Fall die Tabelle ObjektLinkAB, benutzt werden sollen. Das Ergebnis dieser Anfrage enthält für jede in der Tabelle ObjektLinkAB abgespeicherte Zuordnung ein Tupel, das die Attributwerte der einander zugeordneten Objekte enthält. 49 Entwurf der SQL-Erweiterung SELECT o1.oid, o1.objektart, o1.geometrie, o2.oid, o2.objektart, o2.geometrie FROM A.Objekt o1 JOIN B.Objekt o2 USING LINK A_B oid 321 322 322 323 objektart Straße Siedlung Siedlung Straße geometrie oid 562 561 563 562 objektart Straße Siedlung Siedlung Straße geometrie Beispiel 4.7: Berechnung des Verbunds zugeordneter Objekte Der erweiterte Verbundoperator kann auch verwendet werden, um Verbunde von Relationen mit aggregierten Objekten zu berechnen. Dazu betrachte man die Relationen Agg ObjektA und Agg ObjektB in Abbildung 4.7 die aggregierte Objekte aus den Datenbanken A bzw. B enthalten. Solche Relationen kann man beispielsweise mit den in Abschnitt 4.3 beschriebenen Spracherweiterungen herstellen. aggID 81 82 83 Agg ObjektA objektart geometrie Straße Siedlung Straße aggID 11 12 Agg ObjektB objektart geometrie Siedlung Straße Abbildung 4.7: Tabellen mit aggregierten Objekten Um Tabellen mit aggregierten Objekten mittels des erweiterten Verbundoperators zu verknüpfen, müssen diese Tabellen die Identifikatoren der aggregierten Objekte aus den Aggregierungstabellen enthalten. Innerhalb der Using-LinkKlausel gibt man durch das Schlüsselwort AGGREGATED an, dass die zu verbindenden Relationen aggregierte Objekte enthalten, was dazu führt, dass implizit die Linktabelle zur Verknüpfung der Relationen verwendet wird. Daher werden die Relationen mit aggregierten Objekten aus Abbildung 4.7 in der Anfrage aus Beispiel 4.8 implizit mit der Tabelle LinkAB verbunden. Schließlich kann es auch wünschenswert sein, aggregierte Objekte aus einer Komponentendatenbank mit den zugehörigen einzelnen Objekten aus der anderen Komponentendatenbank zu verbinden. Dazu muss man in der Anfrage spezifizieren, welche der zu verbindenden Relationen die aggregierten und welche die einzelnen Objekte enthält. Dazu wird hier das Schlüsselwort LEFT bzw. RIGHT verwendet, das angibt, dass die Relation auf der linken bzw. rechten Seite des Komponentendatenbanklinks aggregierte Objekte enthält. Die Relationen 50 4.4 Integrationsoperatoren SELECT o1.aggID, o1.objektart, o1.geometrie, o2.aggID, o2.objektart, o2.geometrie FROM Agg_Objekt_A o1 JOIN Agg_Objekt_B o2 USING AGGREGATED LINK A_B aggID 81 82 objektart Straße Siedlung geometrie aggID 12 11 objektart Straße Siedlung geometrie Beispiel 4.8: Berechnung eines Verbunds aggregierter Objekte werden dann über die Aggregierungstabelle, die der Seite mit den einzelnen Objekten entspricht, und die Linktabelle verbunden. Beispiel 4.9 zeigt eine Anfrage, die einen Verbund der aggregierten Objekte aus der Datenbank A mit den einzelnen Objekten aus B berechnet. Für jede Zuordnung in der Relation, die man erhält, wenn man die Tabellen LinkAB und AggregationB verbindet, enthält das Ergebnis ein Tupel mit den Attributwerten der zugeordneten Objekte. SELECT o1.aggID, o1.objektart, o1.geometrie, o2.oid, o2.objektart, o2.geometrie FROM Agg_Objekt_A o1 JOIN B.Objekt o2 USING LEFT AGGREGATED LINK A_B aggID 81 82 82 objektart Straße Siedlung Siedlung geometrie oid 562 561 563 objektart Straße Siedlung Siedlung geometrie Beispiel 4.9: Berechnung eines Verbunds aggregierter und zugeordneter einzelner Objekte 4.4.2 Der erweiterte Vereinigungsoperator Eine andere Operation, die zur Integration eingesetzt werden kann, ist die Vereinigung, die in SQL mit der Union-Klausel angewendet werden kann. Um auch bei der Vereinigung Zuordnungen zwischen Objekten aus unterschiedlichen Komponentendatenbanken auszunutzen, kann die Union-Klausel in SQLSF ebenfalls mit der Using-Link-Klausel kombiniert werden. Dieser erweiterte Vereinigungsoperator wird im Gegensatz zu dem normalen Vereinigungsoperator jedoch nicht zur Vereinigung kompletter Unteranfragen eingetzt, sondern analog zu dem erweiterten Verbundoperator im Anschluss an die From-Klausel verwendet. Weiterhin wird der erweiterte Vereinigungsoperator ebenfalls in drei Varianten eingeführt, um es zu ermöglichen, einzelne 51 Entwurf der SQL-Erweiterung Objekte, aggregierte Objekte oder einzelne mit aggregierten Objekten zusammenzufassen, und wie beim erweiterten Verbundoperator müssen die zu vereinigenden Relationen die entsprechenden Identifikatoren enthalten. Es ist für die Anwendung dieses Operators nicht zwingend erforderlich, dass die Schemata der zu vereinigenden Relationen übereinstimmen, allerdings müssen alle in der Select-Klausel referenzierten Attribute in beiden Ausgangsrelationen vorhanden sein. Seien R1 und R2 Relationen mit den Identifikatorattributen I1 bzw. I2 . Weiterhin besitze jede dieser Relationen mindestens die Attribute A1 , . . . , An . Sei T eine Objektlinktabelle mit den Identifikatorattributen B1 und B2 , die dem Komponentendatenbanklink L zugewiesen ist, der die Komponentendatenbanken, in denen sich die Relationen R1 und R2 befinden, verbindet. Die Anweisung SELECT A1 ,. . . ,An FROM R1 UNION R2 USING LINK L definiert eine Relation S mit n mehrwertigen Attributen A01 , . . . , A0n , die Arrays von Elementen des Datentyps der ursprünglichen Attribute A1 , . . . , An enthalten. attributes(S) = {A01 , . . . , A0n } type(A0i ) = Array[type(Ai )] für 1 ≤ i ≤ n Die Relation S enthält ein Tupel s(t1 , t2 ) für jedes Paar (t1 , t2 ) von durch die Tabelle T zugeordneten Tupeln aus den Relationen R1 und R2 , ein Tupel s(t01 ) für jedes Tupel t01 aus R1 , das keinem Tupel aus R2 zugeordnet ist, und ein Tupel s(t02 ) für jedes Tupel t02 aus R2 , das keinem Tupel aus R1 zugeordnet ist. S = {s(t1 , t2 ) | (t1 , t2 ) ∈ R1 × R2 ∧ ∃z ∈ T (t1 .I1 = z.B1 ∧ z.B2 = t2 .B2 )} ∪ {s(t01 ) | t01 ∈ R1 ∧ ∀z ∈ T (t01 .I1 6= z.B1 )} ∪ {s(t02 ) | t02 ∈ R2 ∧ ∀z ∈ T (t02 .I2 6= z.B2 )} Dabei enthalten die Attribute der Tupel in S jeweils die zwei Werte der zu52 4.4 Integrationsoperatoren gehörigen Attribute der Tupel aus R1 und R2 . Fehlende Attributwerte aufgrund nicht zugeordneter Tupel werden durch Nullwerte repräsentiert. s(t1 , t2 ).Ai [1] s(t1 , t2 ).Ai [2] s(t01 ).Ai [1] s(t01 ).Ai [2] s(t02 ).Ai [1] s(t02 ).Ai [2] = = = = = = t1 .Ai t2 .Ai t01 .Ai null null t02 .Ai Die Semantik der Operatoren, die aggregierte Objekte bzw. aggregierte und einzelne Objekte vereinigen, ist äquivalent, außer dass analog zu den erweiterten Verbundoperatoren eine andere Relation T zur Definition der Zuordnungen verwendet werden muss. Beispiel 4.10 zeigt die Vereinigung der Relationen mit aggregierten Objekten in Abbildung 4.7. Dabei werden zwei Objekte immer dann zusammengefasst, wenn sie über die Tabelle LinkAB einander zugeordnet sind. Das aggregierte Objekt mit der ID 83 ist keinem Objekt zugeordnet, so dass nur die ersten Elemente der mehrwertigen Attributwerte einen Wert besitzen. SELECT aggID, objektart, geometrie FROM Agg_ObjektA UNION Agg_ObjektB USING AGGREGATED LINK A_B aggID [1] 81 [2] 12 objektart [1] Straße [2] Straße geometrie [1] [2] [1] 82 [2] 11 [1] Siedlung [2] Siedlung [1] [2] [1] 83 [1] Straße [1] Beispiel 4.10: Berechnung der Vereinigung zugeordneter aggregierter Objekte 4.4.3 Bemerkungen Welche Variante des erweiterten Verbund- oder Vereinigunsoperators man zur Integration von bestimmten Daten einsetzt, hängt von diesen Daten ab. Es wird hier empfohlen, bei 1:1-Zuordnungen zwischen den einzelnen Objekten die Operatoren mit impliziter Ausnutzung der Zuordnungen zwischen einzelnen Objekten zu verwenden. 53 Entwurf der SQL-Erweiterung Die Operatoren, die die Zuordnungen zwischen den aggregierten Objekten ausnutzen, bieten sich für die Integration von über n:m-Zuordnungen verlinkten Objekten an. Die Varianten der Integrationsoperatoren, die aggregierte Objekte aus einer und einzelne Objekte aus der anderen Komponentendatenbank integrieren, werden am sinnvollsten zur Integration von 1:m-zugeordneten Objekten eingesetzt. Jedoch sei hier nicht ausgeschlossen, dass für bestimmte Situationen auch eine Verwendung außerhalb dieser Empfehlungen geeignet sein kann. 4.5 Substitution Um Transformationen zwischen Daten und Metadaten zu realisieren, wird SQL um ein Konzept zur Substitution von Relationen- und Attributnamen erweitert. Dieses entspricht im Wesentlichen dem aus der Multidatenbanksprache FraQL, allerdings in der Art erweitert, dass es möglich wird, Anfragen mit dynamischem Ausgabeschema zu formulieren. Als Quelle für Metadaten können beliebige Relationen verwendet werden, beispielsweise auch der bereits vorhandene Schemakatalog des verwendeten Datenbanksystems. Mit solchen Transformationen lassen sich strukturelle Konflikte, die beispielsweise bei den Datenbanken in Abbildung 4.8 vorliegen, auflösen. 4.5.1 Transformation von Relationennamen in Daten Zunächst sei die Transformation von Relationennamen in Daten, die durch Verwendung des Substitutionsoperators anstelle eines Relationennamens in der From-Klausel realisiert wird, beschrieben. Die Relation T ables besitze mindestens das Attribut N ame und enthalte die Namen aller Relationen R1 , . . . , Rn einer Datenbank. Jede dieser Relationen enthalte mindestens das Attribut A. Die Anweisung SELECT A, T ables.N ame AS B FROM T ables, $(T ables.N ame) definiert eine neue Relation S mit den Attributen A und B. Diese enthält für jedes Tupel t aus einer der Ursprungsrelationen R1 , . . . , Rn ein Tupel s(t), 54 4.5 Substitution Datenbank A: Verkehr oid objektart geometrie 1 Straße 2 Schienenbahn 3 Flughafen oid 1 1 2 2 3 Datenbank B: Straße oid geometrie 1 Schienenbahn oid geometrie 2 Flughafen oid geometrie 3 Attribut name wert Breite 15m Zustand in Betrieb Kategorie S-Bahn Breite 2m Zustand im Bau oid 1 2 3 Breite 15m 2m - Beschreibung Zustand in Betrieb im Bau Kategorie S-Bahn - Arbeitsdatenbank: Tables name Verkehr Attribut Straße Schienenbahn Flughafen Beschreibung db A A B B B B Columns name table oid Attribut Breite Attribut Zustand Attribut Kategorie Attribut oid Straße ... ... Abbildung 4.8: Beispieldatenbanken mit strukturellen Konflikten das den Wert des Attributs A unverändert übernimmt und den Namen der Ursprungsrelation als Wert des Attributs B enthält. attributes(S) = {A, B} n [ S = {s(ti ) | ti ∈ Ri } i=1 Dabei gilt für alle i mit 1 ≤ i ≤ n : s(ti ).A = ti .A s(ti ).B = name(Ri ) Dieses Konzept kann beispielsweise angewendet werden, um die Relationen aus der Datenbank B, die geographische Objekte beschreiben, zu einer Relation zusammenzufassen (siehe Beispiel 4.11) und somit die Darstellung aus der Datenbank A zu erhalten. Die dabei erzeugte Sichtrelation enthält ein zusätzliches Attribut, das die Ursprungsrelation eines Tupels als Wert enthält. 55 Entwurf der SQL-Erweiterung CREATE VIEW Verkehr AS SELECT t.oid, Tables.name AS objektart, t.geometrie FROM Tables, B.$(Tables.name) t WHERE Tables.db = ’B’ AND Tables.name <> ’Attribut’ Beispiel 4.11: Anwendung des Substitutionsoperators in der From-Klausel 4.5.2 Transformation von Attributnamen in Daten Die Transformation von Attributnamen in Daten geschieht hier durch Verwendung des Substitutionsoperators anstelle eines Attributnamens in der SelectKlausel. Sei Columns eine Relation mit mindestens den Attributen N ame und T able. Diese Relation enthalte die Namen aller Attribute in einer Datenbank sowie die Namen der zugehörigen Relationen. Die Datenbank enthalte mindestens die Relation R mit den Attributen A1 , . . . , An . Die Anweisung SELECT Columns.N ame AS B, R.$(Columns.N ame) AS C FROM Colums R WHERE Columns.T able = name(R) definiert eine neue Relation S mit den Attributen B und C. Diese enthält für jedes Tupel t aus der Relation R die n Tupel s1 (t), . . . , sn (t). Die Werte der Attribute B und C entsprechen dem Namen und dem Wert jeweils eines Attributs von t. attributes(S) = {B, C} [ {si (t) | 1 ≤ i ≤ n} S = t∈Rel Dabei gilt für alle i mit 1 ≤ i ≤ n : si (t).B = name(Ai ) si (t).C = t.Ai Mit Hilfe dieses Konzepts kann beispielsweise die Relation Beschreibung in der Datenbank B in Abbildung 4.8 in die Darstellung in der Datenbank A umgewandelt werden (siehe Beispiel 4.12). Dazu werden alle Werte der Attribute außer oid in die Spalte wert eingetragen. Zu jedem Wert enthalten die Spalten oid und name die ID des zugehörigen Tupels bzw. den Namen des zugehörigen Attributs. 56 4.5 Substitution CREATE VIEW Attribut AS SELECT t.oid, Columns.name AS name, t.$(Columns.name) AS wert FROM Columns B.Beschreibung t WHERE Columns.table = ’Attribut’ AND Columns.name <> ’oid’ Beispiel 4.12: Anwendung des Substitutionsoperators in der Select-Klausel 4.5.3 Transformation von Daten in Relationennamen Zur Transformation von Daten in Relationennamen verwendet man den Substitutionsoperator anstelle eines Relationennamens in der Create-View-Klausel. Sei R eine Relation mit mindestens zwei Attributen A und B, und seien a1 , ..., an alle paarweise verschiedenen Werte, die das Attribut A in der Relation R annimmt. Die Anweisung CREATE VIEW $(t.A) AS SELECT t.B FROM R t definiert n neue Relationen S1 , . . . , Sn , deren Namen den Werten a1 , ..., an entsprechen. Diese Relationen besitzen genau ein Attribut B und enthalten für jedes Tupel t aus R, dessen Wert des Attributs A mit dem Namen der Relation übereinstimmt, ein Tupel s(t). Dabei wird der Wert des Attributs B unverändert übernommen. Es gilt also für alle i mit 1 ≤ i ≤ n: name(Si ) = ai attributes(Si ) = {B} Si = {s(t) | t ∈ R ∧ t.A = ai } Dabei gilt: s(t).B = t.B Dieses Konzept kann verwendet werden, um die Relation Verkehr in der Datenbank A in Abbildung 4.8 so zu partitionieren, dass die in der Datenbank B dargestellten Relationen entstehen (siehe Beispiel 4.13). Dabei werden die Objektarten als Namen der zu erzeugenden Sichten und als Kriterium zur Partitionierung verwendet. 57 Entwurf der SQL-Erweiterung CREATE VIEW $(t.objektart) AS SELECT t.oid, t.geometrie FROM Verkehr t Beispiel 4.13: Verwendung des Substitutionsoperators in der Create-View-Klausel 4.5.4 Transformation von Daten in Attributnamen Die Transformation von Daten in Attributnamen erreicht man durch Verwendung des Substitutionsoperators anstelle eines Alias in der Select-Klausel. Sei R eine Relation mit mindestens zwei Attributen A und B und seien b1 , . . . , bn alle paarweise verschiedenen Werte, die das Attribut B in der Relation R annimt. Die Anweisung SELECT t.A AS $(t.B) FROM R t definiert eine neue Relation S mit genau n Attributen B1 , . . . , Bn , deren Namen den Werten b1 , . . . , bn entsprechen. S enthält für jedes Tupel t aus der Relation R ein Tupel s(t). Dieses enthält den Wert des Attributs A von t als Wert des Attributs, dessen Name mit dem Wert des Attributs B von t übereinstimmt. Die Werte aller übrigen Attribute sind Nullwerte. attributes(S) = {B1 , . . . , Bn } S = {s(t) | t ∈ R} Dabei gilt für alle i mit 1 ≤ i ≤ n : name(Bi ) = bi ( t.A falls t.B = bi , s(t).Bi = null sonst. Im Beispiel 4.14 wird diese Art der Umstrukturierung auf die Attribut-Relation der Datenbank A in Abbildung 4.8 angewendet. Die Werte des Name-Attributs werden in Attribute transformiert. Für jedes Tupel wird der Wert in der Spalte oid übernommen und der in der Spalte wert dem Attribut zugewiesen, dessen Name dem Wert in der Spalte name entspricht. Das Ergebnis der Anfrage in Beispiel 4.14 entspricht noch nicht dem gewünschten Ergebnis, der Attribut-Relation der Datenbank B in Abbildung 4.8, da hier keine implizite Aggregation der Tupel mit demselben Wert des Attributs oid erfolgt. Um doch das gewünschte Ergebnis zu erhalten, kann die Aggregation 58 4.5 Substitution CREATE VIEW Beschreibung_A AS SELECT t.oid, t.wert AS $(t.name) FROM A.Attribut t oid 1 1 2 2 3 Beschreibung A breite zustand kategorie 15m in Betrieb S-Bahn 2m im Bau Beispiel 4.14: Verwendung des Substitutionsoperators in der Alias-Definition explizit mit der in Abschnitt 4.3.1 vorgestellten Spracherweiterung erfolgen. Weil dabei die Attribute breite, zustand und kategorie zu mehrwertigen Attributen umgewandelt werden, muss man hier noch eine Konfliktauflösungsfunktion (im Beispiel 4.15 als firstOf bezeichnet) anwenden, die ein Array, das außer Nullwerten höchstens einen wirklichen Wert enthält, in genau diesen Wert umwandelt. CREATE VIEW Beschreibung AS SELECT oid, firstOf(breite) AS breite, firstOf(zustand) AS zustand, firstOf(kategorie) AS kategorie FROM Beschreibung_A AGGREGATE BY oid Beispiel 4.15: Aggregation der Attribut-Relation 4.5.5 Bemerkungen Eine von den oben beschriebenen Fällen abweichende Verwendung von Substitutionsoperatoren (denkbar wären beispielsweise Substitutionsoperatoren in der Where-Klausel oder anstelle von Funktionsnamen) wird in dieser Erweiterung zunächst nicht unterstützt. Man kann sich den Substitutionsoperator $ als eine Art Makro vorstellen. In einem ersten Schritt zur Ausführung der Anfrage werden alle möglichen Werte des zu substituierenden Ausdrucks bestimmt. Für jeden Wert wird die Anfrage umgeschrieben, indem das Makro durch den Wert ersetzt wird. Das Endergebnis erhält man durch geeignetes Zusammensetzen der Ergebnisse der substituierten Anfragen. Diese mehr operationale Sichtweise eignet sich auch gut für 59 Entwurf der SQL-Erweiterung den Entwurf von Algorithmen zur Bearbeitung von Anfragen mit Substitutionsoperatoren in Abschnitt 5.3.4. Es ist möglich, mehrere Substitutionsoperatoren in einer Anfrage zu verwenden. Durch geschickte Kombination lassen sich damit beispielsweise Anweisungen konstruieren, die noch mächtigere strukturelle Transformationen ausführen. Die Anweisung in Beispiel 4.16 führt zwei Metadatentransformationen gleichzeitig aus. Angewendet auf die Datenbank A in Abbildung 4.8 erstellt sie eine Sichtrelation für jede in der Relation Verkehr auftretende Objektart. Dabei erhält jede Sichtrelation genau die Attribute, deren Name bei Ojekten der zugehörigen Objektart in der Relation Attribut auftritt. CREATE VIEW $(v.objektart) AS SELECT v.oid, v.geometrie, a.wert AS $(a.name) FROM Verkehr v, Attribut a WHERE v.oid = a.oid oid 1 oid 2 geometrie Straße breite 15m zustand in Betrieb Schienenbahn geometrie kategorie S-Bahn oid 3 breite 2m Flughafen geometrie zustand im Bau Beispiel 4.16: Anfrage mit mehreren Substitutionsoperatoren 60 Kapitel 5 Entwurf des Anfragesystems In den folgenden Abschnitten wird ein Anfragesystem zur prototypischen Umsetzung der in Kapitel 4 entwickelten SQL-Erweiterung entworfen. Dabei wird versucht, die benötigten Konzepte möglichst unabhängig von einem konkreten Datenbankmanagementsystem vorzustellen. An einigen Stellen lässt es sich jedoch nicht vermeiden, auf systemspezifische Funktionalität zurückzugreifen, worauf durch Bemerkungen hingewiesen wird. Abschnitt 5.1 stellt zunächst eine geeignete Software-Architektur vor. Abschnitt 5.2 beschreibt die für die Ausführung von SQLSF-Anweisungen benötigten Metadaten und wie diese im Anfragesystem registriert werden können. In Abschnitt 5.3 werden schließlich Algorithmen zur Übersetzung von SQLSF- in Standard-SQL-Anweisungen angegeben. 5.1 Architektur Zur Bearbeitung von Anfragen, die die in Kapitel 4 vorgestellten Erweiterungen enthalten, wird die in Abbildung 5.1 gezeigte Software-Architektur vorgeschlagen. Das Anfragesystem setzt auf einem objekt-relationalen Datenbankmanagementsystem auf. Es wird angenommen, dass alle an der Föderation beteiligten Komponentendatenbanken entweder direkt von diesem Datenbankmanagementsystem verwaltet werden oder über sogenannte Datenbankwrapper 1 an dieses angeschlossen sind. 1 Diese heißen bei Oracle Datenbanklinks, werden jedoch in dieser Arbeit Wrapper genannt, um Verwechslungen mit den Komponentendatenbanklinks zu vermeiden. 61 Entwurf des Anfragesystems Frontend Parser Ausführungskomponente DBMS KDBkatalog SQL-Anweisung SQL-Anweisung SQL-Anweisung Zugriff über Wrapper ... Arbeitsdatenbank KDB ... KDB KDB KDB Abbildung 5.1: Architektur des Anfragesystems Der Zweck eines solchen Datenbankwrappers ist es, dem Benutzer zu ermöglichen, auf eine Datenbank zuzugreifen, die von einem anderen Datenbankmanagementsystem verwaltet wird. Dabei sorgt das System dafür, dass sich der Zugriff auf eine derartig angeschlossene Datenbank nicht von dem Zugriff auf eine lokale Datenbank unterscheidet, indem es den für den externen Zugriff benötigten Overhead (z.B. Kommunikation, Authentifizierung usw.) übernimmt. Die Eingabe von Anweisungen und das Anzeigen von Ergebnissen geschieht über ein Frontend, das als Schnittstelle zum Benutzer oder anderen Anwendungen fungiert. Anweisungen werden von einem Parser analysiert und bei erfolgreicher Überprüfung der Syntax in eine interne Repräsentation umgewandelt. Diese wird an die Ausführungskomponente zur Auswertung der Anweisung übergeben. Die Ausführungskomponente erzeugt Anweisungen in dem SQL-Dialekt des zugrundeliegenden Datenbankmanagementsystems. Mit diesen wird auf Informationen aus den verfügbaren Komponentendatenbanken und der Arbeitsdatenbank zugegriffen, Metadaten aus einem sogenannten Komponentendatenbankkatalog (siehe Abschnitt 5.2) abgefragt oder neue Datenbankobjekte wie Tabellen, Sichten und Prozeduren erzeugt. Aus den erhaltenen Ergebnissen muss die Ausführungskomponente eventuell weitere Anweisungen generieren um die über die Benutzerschnittstelle eingegebene Anweisung vollständig auszuführen. Die Ergebnisse der Anweisung werden an das Frontend übergeben, das diese geeignet darstellt. 62 5.2 Der Komponentendatenbankkatalog 5.2 Der Komponentendatenbankkatalog Die Beantwortung von SQLSF-Anfragen erfordert die implizite Verwendung von in der Arbeitsdatenbank gespeicherten Informationen, wie beispielsweise Umrechnungstabellen für Attributwerte oder Zuordnungen von Datenobjekten. Da diese zusätzlichen Daten nicht direkt in der Anfrage referenziert werden, benötigt der Anfrageprozessor Metadaten, die derartige Informationen zur Integration der Komponentendatenbanken beschreiben. Diese Metadaten werden in der Arbeitsdatenbank strukturiert nach dem Schema in Abbildung 5.2 vor- ComponentDB 1 1 +Name {pk} +Schema +Wrapper +ObjectIDColumn +ObjectGeometryColumn isLeftCDB isRightCDB * * ComponentDBLink leftAggregatedObjects 1 rightAggregatedObjects 1 +Name {pk} 1 1 1 1 0..1 0..1 LinkTable Links ObjectLinks +Name {pk} +LeftAggregatedIDColumn +RightAggregatedIDColumn ObjectLinkTable +Name {pk} +LeftObjectIDColumn +RightObjectIDColumn belongsToLink referencePoints * 0..1 AttributeTransitionTable ReferencePointsTable +Name {pk} +LeftValueColumn +RightValueColumn +LeftReferencedColumn +RightReferencedColumn +LeftDefaultValue +RightDefaultValue +Name {pk} +RSParameter +LeftXColumn +LeftYColumn +RightXColumn +RightYColumn AggregatedObjectTable 0..1 0..1 +Name {pk} +AggregatedIDColumn +ObjectIDColumn Abbildung 5.2: Das Schema des Komponentendatenbankkatalogs 63 Entwurf des Anfragesystems gehalten und als Komponentendatenbankkatalog bezeichnet. Dieser Katalog muss beim Erstellen einer Föderation mit Informationen gefüllt werden, wozu SQLSF entsprechende Anweisungen zur Verfügung stellt, die im Folgenden anhand von Beispielen vorgestellt werden. In der Relation ComponentDB werden die an der Föderation beteiligten Komponentendatenbanken verzeichnet. Die Beschreibung enthält den Namen der Komponentendatenbank, über den diese eindeutig identifiziert ist, das Schema, in dem die Tabellen der Komponentendatenbank liegen, und den Namen eines Datenbankwrappers, sofern sich die Komponentendatenbank in einem anderen System befindet. Es wird hier vorausgesetzt, dass für Objekte in einer Komponentendatenbank eindeutige Identifikatoren existieren. Der Name des entsprechenden Identifikator- und des Geometrieattributs können ebenfalls im Katalog gespeichert werden. Dabei dürfen die Objekte auf mehrere Relationen aufgeteilt sein, wobei allerdings das Identifikator- und das Geometrieattribut in allen Relationen gleich benannt sein muss. Beispiel 5.1 zeigt, wie eine Komponentendatenbank unter dem Namen cdbA mit der entsprechenden Register-Anweisung im Komponentendatenbankkatalog registriert und mit der Unregister-Anweisung dieser Eintrag entfernt wird. Schema A: REGISTER ComponentDB cdbA AS Schema = A, ObjectIDColumn = oid, ObjectGeometryColumn = geometrie UNREGISTER ComponentDB cdbA oid 321 322 323 324 Objekt objektart geometrie Straße Siedlung Straße Straße Beispiel 5.1: Registrierung einer Komponentendatenbank Die Komponentendatenbanklinks zur Integration von jeweils zwei Komponentendatenbanken werden in der Relation ComponentDBLink gespeichert. Ein solcher Link wird eindeutig über einen Namen identifiziert und besitzt implizit eine Richtung, die dadurch gegeben ist, dass eine linke und eine rechte Komponentendatenbank verbunden wird. Einem Komponentendatenbanklink können verschiedene Tabellen mit Informationen zur Integration der Komponentendatenbanken zugeordnet sein. Im einzelnen sind dies jeweils eine Aggregierungstabelle für die linke und rechte Komponentendatenbank, eine Linktabelle, eine Objektlinktabelle, eine Tabelle mit Passpunkten und beliebig viele Ersetzungstabellen für Standardattribute. 64 5.2 Der Komponentendatenbankkatalog Beispiel 5.2 zeigt das Einrichten eines Komponentendatenbanklinks mit dem Namen cdbA cdbB zum Verbinden der Komponentendatenbanken cdbA und cdbB. Mit der zugehörigen Unregister-Anweisung kann dieser Link wieder entfernt werden. REGISTER ComponentDBLink cdbA_cdbB FOR cdbA AND cdbB UNREGISTER ComponentDBLink cdbA_cdbB Beispiel 5.2: Registrierung eines Komponentendatenbanklinks Die Relation AggregatedObjectTable beschreibt Aggregierungstabellen in der Arbeitsdatenbank der Föderation, wobei diese über den Tabellennamen identifiziert werden. Weiterhin werden die Namen des Aggregierungsidentifikatorund des Identifikatorattributs als Werte der Attribute AggregatedIDColumn und ObjectIDColumn abgespeichert. In Beispiel 5.3 wird beispielhaft eine Aggregierungstabelle registriert und der Eintrag wieder entfernt. REGISTER AggregatedObjectTable AggregationA FOR LEFT LINK cdbA_cdbB AS AggregatedIDColumn = aggID, ObjectIDColumn = oid UNREGISTER AggregatedObjectTable AggregationA AggregationA oid aggID 321 81 322 82 323 81 324 81 Beispiel 5.3: Registrierung einer Aggregierungstabelle In der Relation LinkTable sind Linktabellen in der Arbeitsdatenbank der Föderation verzeichnet. Neben dem Namen der Tabelle umfasst die Beschreibung die Namen der Aggregierungsidentifikatorattribute als Werte des Attributs LeftAggregatedIDColumn bzw. RightAggregatedIDColumn. Beispiel 5.4 zeigt die Registrierung einer Linktabelle für den Komponentendatenbanklink cdbA cdbB und die Entfernung des Eintrags. REGISTER LinkTable LinkAB FOR LINK cdbA_cdbB AS LeftAggregatedIDColumn = aid, RightAggregatedIDColumn = bid LinkAB aid bid 81 12 82 11 UNREGISTER LinkTable LinkAB Beispiel 5.4: Registrierung einer Zuordnungstabelle für aggregierte Objekte Die Relation ObjectLinkTable beschreibt Objektlinktabellen in der Arbeitsdatenbank der Föderation. Dazu ist der Name der jeweiligen Tabelle sowie die 65 Entwurf des Anfragesystems Namen der Identifikatorattribute als Werte der Attribute LeftObjectIDColumn und RightObjectIDColumn abgespeichert. Die Registrierung einer Objektlinktabelle für den Komponentendatenbanklink cdbA cdbB und das Entfernen dieses Eintrags wird in Beispiel 5.5 vorgeführt. REGISTER ObjectLinkTable ObjectLinkAB FOR LINK cdbA_cdbB AS LeftObjectIDColumn = aid, RightObjectIDColumn = bid UNREGISTER ObjectLinkTable ObjectLinkAB ObjektLinkAB aid bid 321 562 322 561 322 563 323 562 Beispiel 5.5: Registrierung einer Zuordnungstabelle für einzelne Objekte Tabellen mit Passpunkten sind in der Relation ReferencePointsTable verzeichnet und ebenfalls über den Namen identifiziert. Solche Tabellen müssen mindestens vier Spalten für die x- und y-Koordinaten eines Punktepaars besitzen. Die Attribute LeftXColumn, LeftYColumn, RightXColumn und RightYColumn enthalten die Namen dieser Spalten. Das Attribut RSParameter gibt den Wert für die Stärke der Verzerrung an, mit dem das Rubber-SheetingVerfahren bei Verwendung der jeweiligen Passpunktabelle parametrisiert wird. In Beispiel 5.6 wird gezeigt, wie eine Passpunktabelle im Komponentendatenbankkatalog registriert und der Eintrag entfernt wird. REGISTER ReferencePointsTable ReferencePointsAB FOR LINK cdbA_cdbB AS RSParameter = 2, ReferencePointsAB LeftXColumn = xA, xA yA xB yB 52.32 44.21 50.79 43.25 LeftYColumn = yA, 364.22 15.37 389.36 15.68 RightXColumn = xB, 81.32 103.28 72.74 96.05 RightYColumn = yB UNREGISTER ReferencePointsTable ReferencePointsAB Beispiel 5.6: Registrierung einer Zuordnungstabelle für einzelne Objekte Die Relation AttributeTransitionTable beschreibt Ersetzungstabellen für Attributwerte. Primärschlüssel dieser Relation ist der Name der Ersetzungstabelle. Die Attribute LeftReferencedColumn und RightReferencedColumn enthalten den Namen des umzurechnenden Attributs in der linken bzw. rechten Komponentendatenbank und die Attribute LeftValueColumn und RightValueColumn die Namen der Werteattribute. Defaultwerte in der linken bzw. rechten Komponentendatenbank werden durch die Attribute LeftDefaultValue und RightDefaultValue vorgegeben. Die Registrierung einer Ersetzungstabelle für Attributwerte ist in Beispiel 5.7 dargestellt. 66 5.3 Übersetzen von SQLSF-Anweisungen REGISTER AttributeTransitionTable ObjektartTransitionAB FOR LINK cdbA_cdbB AS LeftValueColumn = objektartA, ObjektartTransitionAB RightValueColumn = objektartB, objektartA objektartB LeftReferencedColumn = objektart, Landstraße 3105 RightReferencedColumn = objektart, Gewerbegebiet 2013 LeftDefaultValue = ’sonstiges’, Siedlung 2203 RightDefaultValue = 9999 UNREGISTER AttributeTransitionTable ObjektartTransitionAB Beispiel 5.7: Registrierung einer Ersetzungstabelle für Attributwerte 5.3 Übersetzen von SQLSF-Anweisungen Eine Anforderung beim Entwurf der Anfragesprache ist, dass sich die SQLSFAnweisungen in Standard-SQL-Anweisungen umwandeln lassen. Dies erlaubt eine einfache Realisierung des Anfragesystems und ermöglicht es dem Optimierer des verwendeten Datenbanksystems effiziente Zugriffspfade für die in der Anfrage referenzierten Daten zu bestimmen. Außerdem können auf diese Weise durch SQLSF-Anweisungen SQL-Sichten erzeugt werden. Wie die in Kapitel 4 eingeführten Erweiterungen in gewöhnliche SQL-Anfragen übersetzt werden können, ist in den folgenden Unterabschnitten beschrieben. Die vorgestellten Verfahren sind als Anleitung zur Implementierung von Algorithmen zu verstehen, die auf geeigneten Datenstrukturen zur systeminternen Repräsentation der Anfragen die einzelnen Schritte umsetzen. Weiterhin sind Bedingungen angegeben, die man bei der Formulierung von Anweisungen beachten muss, damit diese Verfahren korrekte Ergebnisse liefern. 5.3.1 Attributtransformation Die Übersetzung von Anfragen mit Transform-Klausel hängt davon ab, ob diese Klausel auf ein Standard- oder geometrisches Attribut angewendet wird. Im ersten Fall muss die zu verwendende Ersetzungstabelle bestimmt und in der Anfrage eingesetzt werden, im zweiten Fall ist eine Rubber-Sheeting-Implementierung mit entsprechender Passpunktabelle und Parameter aufzurufen. Anwendung von Ersetzungstabellen 1. Bestimme für den in der Using-Link-Klausel angegebenen Komponentendatenbanklink die Ersetzungstabelle, durch die das zu transformierende 67 Entwurf des Anfragesystems Attribut auf der in der Anfrage angegebenen Seite des Links referenziert wird. Bestimme zu dieser Ersetzungstabelle weiterhin die Namen ihrer Werteattribute und den für die andere Komponentendatenbank angegebenen Default-Wert. Diese Daten erhält man durch eine entsprechende Anfrage an den Komponentendatenbankkatalog. 2. Füge hinter der From-Klausel eine Left-Outer-Join-Klausel mit dem Namen der Ersetzungstabelle ein. Konstruiere zu dieser Klausel eine JoinBedingung, die das zu transformierende Attribut mit dem Werteattribut, das der in der Using-Link-Klausel angegebenen Seite des Komponentendatenbanklinks entspricht, vergleicht. Stelle dabei den Attributnamen den Namen oder Tupelalias der zu transformierenden Relation bzw. den Namen der Ersetzungstabelle voran. 3. Ersetze die gesamte Transform-Klausel durch den Aufruf einer NVLFunktion2 . Die Parameter sind der Name des Werteattributs, das nicht der in der Using-Link-Klausel angegebenen Seite entspricht, wobei diesem der Name der Ersetzungstabelle vorangestellt werden muss, und der zugehörige Default-Wert. Anwendung von Passpunkttabellen 1. Bestimme für den in der Using-Link-Klausel angegebenen Komponentendatenbanklink die zugehörige Passpunkttabelle, die Namen ihrer Spalten und den zugehörigen Parameter durch eine Anfrage an den Komponentendatenbankkatalog. 2. Ersetze die Transform-Klausel durch den Aufruf einer Funktion, die das Rubber Sheeting implementiert. Als Parameter sind dieser Funktion das zu transformierende Attribut, der Name der Passpunkttabelle, die Namen ihrer Spalten sowie der zu verwendende Parameterwert zu übergeben. Enthält die Transform-Klausel das Schlüsselwort RIGHT, muss die Reihenfolge der Spalten vertauscht werden, um das Rubber Sheeting in die entgegengesetzte Richtung anzuwenden. Bemerkungen • Enthält die From-Klausel bei der Umrechnung eines Standardattributs mehrere Einträge, so muss dem in der Transform-Klausel referenzierten Attribut der Tabellenname oder Tupelalias vorangestellt werden. Das 2 Diese Oracle-spezifische Funktion erhält zwei Parameter und gibt als Ergebnis den Wert des ersten zurück, falls dieser kein Nullwert ist. Ansonsten wird der Wert des zweiten Parameters zurückgegeben. 68 5.3 Übersetzen von SQLSF-Anweisungen Anfragesystem kann sonst beim Konstruieren der Vergleichsbedingung nicht entscheiden, aus welcher Relation das Attribut stammt. • Das Hinzufügen des Tabellennamens oder Tupelalias zu den Attributen ist notwendig, da eine Spalte in der umzurechnenden Relation und ein Werteattribut gleich benannt sein könnten. • Durch die Verwendung eines Outer-Joins in Schritt 3 werden nicht in der Ersetzungstabelle auftretende Werte zunächst in einen Nullwert transformiert. Die NVL-Funktion ersetzt diesen durch den Default-Wert. Beispiel Datenbank A: oid 321 322 323 324 Arbeitsdatenbank: ObjektartTransitionAB objektartA objektartB Landstraße 3105 Gewerbegebiet 2013 Siedlung 2203 Objekt objektart geometrie Straße Siedlung Straße Straße xA 52.32 364.22 81.32 ReferencePointsAB yA xB yB 44.21 50.79 43.25 15.37 389.36 15.68 103.28 72.74 96.05 Abbildung 5.3: Beispieldatenbanken zur Attributtransformation Die Anfrage in Beispiel 5.8 transformiert die Attribute objektart und geometrie der Relation Objekt in der Datenbank A in Abbildung 5.3 mittels der Ersetzungstabelle AttributTransitionAB und der Passpunkte in der Tabelle ReferencePointsAB. Dabei wird ausgenutzt, dass diese Tabellen als Bestandteile des Komponentendatenbanklinks cdbA cdbB registriert sind und folglich nicht explizit in der Anfrage referenziert werden müssen. SELECT oid, TRANSFORM objektart USING LEFT LINK cdbA_cdbB, TRANSFORM geometrie USING LEFT LINK cdbA_cdbB FROM A.Objekt Beispiel 5.8: Beispiel zur Übersetzung von Transform-Klauseln Zur Übersetzung der ersten Transform-Klausel muss zunächst die Anfrage in Beispiel 5.9 an den Komponentendatenbankkatalog gestellt werden. Diese liefert den Namen der für das zu transformierende Attribut registrierten Ersetzungstabelle, den Namen des linken und rechten Werteattributs sowie den 69 Entwurf des Anfragesystems Default-Wert des zu transformierenden Attributs in der rechten Komponentendatenbank. SELECT AttributeTransitionTable.Name, AttributeTransitionTable.LeftValueColumn, AttributeTransitionTable.RightValueColumn, AttributeTransitionTable.RightDefaultValue FROM AttributeTransitionTable WHERE AttributeTransitionTable.Link = ’cdbA_cdbB’ AND AttributeTransitionTable.LeftReferencedColumn = ’objektart’ Beispiel 5.9: Anfrage an den Komponentendatenbankkatalog Um die zweite Transform-Klausel zu übersetzen werden durch eine Anfrage an den Komponentendatenbankkatalog (siehe Beispiel 5.10) die Namen der zu benutzenden Passpunktabelle und ihrer Spalten sowie der Wert des für diese Transformation registrierten Parameters bestimmt. SELECT ReferencePointsTable.Name, ReferencePointsTable.RSParameter, ReferencePointsTable.LeftXColumn, ReferencePointsTable.LeftYColumn, ReferencePointsTable.RightXColumn, ReferencePointsTable.RightYColumn FROM ReferencePointsTable, ComponentDBLink WHERE ReferencePointsTable.Name = ComponentDBLink.ReferencePoints AND ComponentDBLink.Name = ’cdbA_cdbB’ Beispiel 5.10: Anfrage an den Komponentendatenbankkatalog Mit den oben bestimmten Werten kann jetzt die ursprüngliche Anfrage übersetzt werden, was zu dem in Beispiel 5.11 gezeigten Ergebnis führt. Dazu wird zunächst eine Vergleichsbedingung mit dem Attribut objektartA der Ersetzungstabelle ObjektartTransitionAB und dem Attribut objektart aus der Relation Objekt gebildet. Anschließend wird der ursprünglichen Anfrage eine Left-Outer-Join-Klausel mit der Ersetzungstabelle und der soeben konstruierten Bedingung hinzugefügt. An dieser Stelle würde man durch Ersetzen der ersten Tranform-Klausel durch das Attribut objektartB der Ersetzungstabelle die ersetzten Attributwerte sowie Nullwerte, falls bestimmte Attributwerte nicht ersetzt werden können, erhalten. Die NVL-Funktion ersetzt diese Nullwerte durch den für diese Transformation spezifizierten Default-Wert. 70 5.3 Übersetzen von SQLSF-Anweisungen Die zweite Transform-Klausel wird durch eine Funktion ersetzt, die das Rubber Sheeting implementiert. Diese wird auf das Geometrie-Attribut der ObjektRelation angewendet und mit den oben bestimmten Namen der Passpunkttabelle und ihrer Spalten sowie dem oben bestimmten Wert parametrisiert. Wäre die ersetzte Transform-Klausel mit dem Schlüsselwort RIGHT gebildet worden, so hätte die Reihenfolge der A- und B-Spalten vertauscht werden müssen, um eine Transformation der Geometrien aus B zu realisieren. Die übersetzte Anfrage wird in Beispiel 5.11 gezeigt. SELECT oid, NVL(ObjektartTransitionAB.objektartB, 9999), RubberSheeting(geometrie, ’RerefencePointsAB’, ’xA’, ’yA’, ’xB’, ’yB’, 2) FROM A.Objekt LEFT OUTER JOIN ObjektartTransitionAB ON ObjektartTransitionAB.objektartA = Objekt.objektart Beispiel 5.11: Übersetzte Anfrage 5.3.2 Aggregation Das Zusammenfassen von Attributwerten zu einem Array, das diese Werte als Elemente enthält, wird erreicht, indem die SQLSF-Anfrage mit AggregateKlausel in eine äquivalente SQL-Anfrage mit Group-By-Klausel umgeformt wird. Dabei müssen in der Select-Klausel passende Aggregierungsfunktionen eingesetzt werden, die ein entsprechendes Array aus den gruppierten Werten eines bestimmten Datentyps erzeugen. Ist in der SQLSF-Anfrage die AggregateKlausel mit einer Using-Link-Klausel kombiniert, so muss die Anfrage zunächst um eine Join-Klausel ergänzt werden, die einen Verbund mit der passenden Aggregierungstabelle herstellt. Somit läuft die Übersetzung einer Anfrage mit Aggregate-Klausel in zwei Phasen ab, wobei die erste übersprungen wird, falls in der Aggregate-Klausel bereits die Liste der Attribute angegeben ist, nach denen gruppiert werden muss (siehe Abschnitt 4.3.1). Phase I: Einfügen der Aggregierungstabelle 1. Bestimme für den in der Using-Link-Klausel angegebenen Komponentendatenbanklink und die angegebene Seite (links oder rechts) den Namen der entsprechenden Aggregierungstabelle, die Namen ihres Aggregierungsidentifikator- und Identifikatorattributs sowie den Namen des Identifikatorattributs in der Komponentendatenbank, die die zu aggregierende 71 Entwurf des Anfragesystems Relation enthält, durch eine Anfrage an den Komponentendatenbankkatalog. 2. Füge vor der Aggregate-Klausel eine Join-Klausel mit dem Namen der Aggregierungstabelle ein. Konstruiere zu dieser Klausel eine Join-Bedingung, die die Identifikatorattribute der zu aggregierenden Relation und der Aggregierungstabelle vergleicht. Dabei muss den Attributnamen der Tabellenname oder Tupelalias vorangestellt werden. 3. Ersetze in der Aggregate-Klausel die Using-Link-Klausel durch das Schlüsselwort BY gefolgt von dem Namen des Aggregierungsidentifikatorattributs mit vorangestelltem Namen der Aggregierungstabelle. 4. Füge das in Schritt 3 eingesetzte Attribut mit dem Tabellennamen auch als zusätzlichen Eintrag in die Select-Klausel ein. Phase II: Einfügen der Gruppierung 1. Bestimme die Attribute, die in der Select-Klausel aber nicht in der Aggregate-Klausel der ursprünglichen Anfrage referenziert werden, sowie die Datentypen dieser Attribute. 2. Ersetze in der Select-Klausel der ursprünglichen Anfrage jedes in Schritt 1 erhaltene Attribut durch den Aufruf einer Aggregierungsfunktion, die Elemente des Datentyps dieses Attributs zu einem Array zusammenfasst, mit diesem Attribut als Argument. 3. Ersetze die Aggregate-Klausel durch eine Group-By-Klausel mit derselben Attributliste. Bemerkungen • Bei mehreren Einträgen in der From-Klausel muss die Relation, die das Identifikatorattribut enthält, als letztes angegeben sein. Es könnten theoretisch mehrere dieser Relationen ein Attribut mit demselben Namen wie das Identifikatorattribut enthalten. In diesem Fall muss trotzdem eine Relation festgelegt sein, mit der die Aggregierungstabelle verbunden wird. Daher wird standardmäßig die letzte Relation für den Verbund verwendet. • Das Hinzufügen des Tabellennamens oder Tupelalias zu den Attributen ist notwendig, da eine Spalte in der zu aggregierenden Relation und ein Attribut der Aggregierungstabelle gleich benannt sein könnten. Wird ein solches Attribut in der Select-Klausel referenziert, muss diesem bereits bei der Formulierung der Anfrage der Name der Relation vorangestellt werden. 72 5.3 Übersetzen von SQLSF-Anweisungen Beispiel Datenbank A: oid 321 322 323 324 Arbeitsdatenbank: Objekt objektart geometrie Straße Siedlung Straße Straße AggregationA oid aggID 321 81 322 82 323 81 324 81 Abbildung 5.4: Beispieldatenbanken zur Aggregation Die Anfrage in Beispiel 5.12 aggregiert die Objekte in der Datenbank A in Abbildung 5.4. Die Aggregierungstabelle AggregationA wurde für den Komponentendatenbanklink cdbA cdbB registriert, der diese Datenbank mit einer anderen verbindet. SELECT objektart, geometrie FROM A.Objekt AGGREGATE USING LEFT LINK cdbA_cdbB Beispiel 5.12: Beispielanfrage mit Aggregate-Klausel Zunächst werden aus dem Komponentendatenbankkatalog Informationen über die der linken Datenbank zugeordnete Aggregierungstabelle abgefragt. Die dazu verwendete SQL-Anfrage ist in Beispiel 5.13 abgebildet. Diese liefert den Namen der linken Aggregierungstabelle, den Namen des Aggregierungsidentifikator- und Identifikatorattributs der Aggregierungstabelle und den Namen des Identifikatorattributs in der linken Komponentendatenbank. SELECT AggregatedObjectTable.Name, AggregatedObjectTable.AggregatedIDColumn, AggregatedObjectTable.ObjectIDColumn, LeftCDB.ObjectIDColumn FROM AggregatedObjectTable, ComponentDBLink, ComponentDB LeftCDB WHERE ComponentDBLink.LeftAggregatedObjects = AggregatedObjectTable.Name AND ComponentDBLink.LeftCDB = LeftCDB.Name AND ComponentDBLink.Name = ’cdbA_cdbB’ Beispiel 5.13: Anfrage an den Komponentendatenbankkatalog Diese Informationen werden in Phase I ausgenutzt, um eine Join-Klausel einzufügen, die die Relation Objekt mit der Aggregierungstabelle AggregationA 73 Entwurf des Anfragesystems über die oid-Spalten verbindet. Weiterhin wird die Aggregate-Klausel ersetzt, so dass anstelle der Using-Link-Klausel das Attribut aggID, nach dem gruppiert werden soll, direkt angegeben ist. Dieses Attribut wird auch in die SelectKlausel eingefügt. Das Zwischenergebnis nach Phase I ist in Beispiel 5.14 abgebildet. SELECT AggregationA.aggID, objektart, geometrie FROM A.Objekt JOIN AggregationA ON AggregationA.oid = Objekt.oid AGGREGATE BY AggregationA.aggID Beispiel 5.14: Übersetzte Anfrage nach Phase I In Phase II müssen die Attribute objektart und geometrie durch Aufrufe einer geeigneten Aggregierungsfunktion ersetzt werden. Außerdem wird die Aggregate- durch eine Group-By-Klausel ausgetauscht, in der weiterhin das Attribut aggID steht. Somit erhält man schließlich die übersetzte Anfrage in Beispiel 5.15. SELECT AggregationA.aggID, aggregateString(objektart), aggregateGeometry(geometrie) FROM A.Objekt JOIN AggregationA ON AggregationA.oid = Objekt.oid GROUP BY AggregationA.aggID Beispiel 5.15: Übersetzte Anfrage 5.3.3 Integrationsoperatoren Zur Übersetzung von Anfragen mit erweiterter Join- bzw. Union-Klausel muss man zunächst die Tabellen in der Arbeitsdatenbank durch eine Anfrage an den Komponentendatenbankkatalog bestimmen, über die die zu integrierenden Relationen verknüpft werden. Welche Tabellen verwendet werden, hängt davon ab, welcher der folgenden vier Fälle eintritt. In Abhängigkeit davon, ob man einen Verbund oder eine Vereinigung berechnen will, muss eine Verknüpfung der Objekte über die Tabellen der Arbeitsdatenbank durch Hinzufügen entsprechender Join- bzw. Outer-Join-Klauseln hergestellt werden. Bei der Vereinigung müssen die zwei Attribute gleichen Namens aus den unterschiedlichen Komponentendatenbanken noch zu einem mehrwertigen Attribut zusammengefasst werden. 74 5.3 Übersetzen von SQLSF-Anweisungen Fall 1 Es sollen einzelne Objekte aus beiden Komponentendatenbanken verknüpft werden. Man benötigt die Objektlinktabelle ihre Identifikatorattribute und die Identifikatorattribute in den zu verbindenden Komponentendatenbanken zum angegebenen Komponentendatenbanklink. 1. Füge vor der erweiterten Operatorklausel eine Join-Klausel ein, die den Namen der Objektlinktabelle enthält. Konstruiere zu dieser Klausel eine Join-Bedingung, die die Identifikatorattribute der linken Komponentendatenbank und der Objektlinktabelle vergleicht. 2. Ersetze die Using-Link-Klausel durch eine On-Klausel. Konstruiere dazu eine Join-Bedingung, die die Identifikatorattribute der Objektlinktabelle und der rechten Komponentendatenbank vergleicht. Fall 2 Es sollen aggregierte Objekte aus beiden Komponentendatenbanken verknüpft werden. Man benötigt die Linktabelle, ihre Aggregierungsidentifikatorattribute und die Aggregierungsidentifikatorattribute der Komponentendatenbanken zum angegebenen Komponentendatenbanklink. 1. Füge vor der erweiterten Operatorklausel eine Join-Klausel ein, die den Namen der Linktabelle enthält. Konstruiere zu dieser Klausel eine JoinBedingung, die die Aggregierungsidentifikatorattribute der linken Komponentendatenbank und der Linktabelle vergleicht. 2. Ersetze die Using-Link-Klausel durch eine On-Klausel. Konstruiere dazu eine Join-Bedingung, die die Aggregierungsidentifikatorattribute der Linktabelle und der rechten Komponentendatenbank vergleicht. Fall 3 Es sollen aggregierte Objekte aus der linken mit einzelnen Objekten aus der rechten Komponentendatenbank verknüpft werden. Man benötigt die Linktabelle, ihre Aggregierungsidentifikatorattribute, das Aggregierungsidentifikatorattribut der linken Komponentendatenbank, die linke Aggregationstabelle, ihr Aggregierungsidentifikator- und Identifikatorattribut und das Identifikatorattribut der rechten Komponentendatenbank zum angegebenen Komponentendatenbanklink. 1. Füge vor der erweiterten Operatorklausel eine Join-Klausel ein, die den Namen der Linktabelle enthält. Konstruiere zu dieser Klausel eine JoinBedingung, die die Aggregierungsidentifikatorattribute der linken Komponentendatenbank und der Linktabelle vergleicht. 75 Entwurf des Anfragesystems 2. Füge vor der erweiterten Operatorklausel eine Join-Klausel ein, die den Namen der rechten Aggregierungstabelle enthält. Konstruiere zu dieser Klausel eine Join-Bedingung, die die Aggregierungsidentifikatorattribute der Linktabelle und der rechten Aggregierungstabelle vergleicht. 3. Ersetze die Using-Link-Klausel durch eine On-Klausel. Konstruiere dazu eine Join-Bedingung, die die Identifikatorattribute der rechten Aggregationstabelle und der rechten Komponentendatenbank vergleicht. Fall 4 Es sollen einzelne Objekte aus der linken mit aggregierten Objekten aus der rechten Komponentendatenbank verknüpft werden. Man benötigt die linke Aggregierungstabelle, ihre Aggregierungsidentifikator- und Identifikatorattribute, das Identifikatorattribut der linken Komponentendatenbank, die Linktabelle sowie die Aggregierungsidentifikatorattribute der Linktabelle und der rechten Komponentendatenbank zum angegebenen Komponentendatenbanklink. 1. Füge vor der erweiterten Operatorklausel eine Join-Klausel ein, die den Namen der linken Aggregierungstabelle enthält. Konstruiere zu dieser Klausel eine Join-Bedingung, die die Identifikatorattribute der linken Komponentendatenbank und der linken Aggregierungstabelle vergleicht. 2. Füge vor der erweiterten Operatorklausel eine Join-Klausel ein, die den Namen der Linktabelle enthält. Konstruiere zu dieser Klausel eine JoinBedingung, die die Aggregierungsidentifikatorattribute der linken Aggregierungstabelle und der Linktabelle vergleicht. 3. Ersetze die Using-Link-Klausel durch eine On-Klausel. Konstruiere dazu eine Join-Bedingung, die die Aggregierungsidentifikatorattribute der Linktabelle und der rechten Komponentendatenbank vergleicht. Übersetzen der erweiterten Vereinigung In den oben angegebenen Schritten für den jeweils eintretenden Fall müssen Left-Outer-Join-Klauseln anstelle von Join-Klauseln eingefügt werden. Zusätzlich sind die folgenden Schritte auszuführen: 1. Ersetze den Union-Operator durch einen Outer-Join-Operator. 2. Ersetze jedes in der Select-Klausel referenzierte Attribut durch den Aufruf eines Array-Konstruktors3 für den Datentyp dieses Attributs. Setze für beide zu vereinigenden Relationen das Attribut mit dem vorange3 Auf diese Art werden bei Oracle Arrays erstellt. 76 5.3 Übersetzen von SQLSF-Anweisungen stellten Namen oder Tupelalias der Relation in die Parameterliste dieses Konstruktors ein. Bemerkungen • Bei der Konstruktion der Join-Bedingungen muss den Attributen jeweils der Name oder Tupelalias der Relation vorangestellt werden, um Mehrdeutigkeiten zu vermeiden, da Attribute in den zu verbindenden Relationen und den Tabellen in der Arbeitdatenbank gleich benannt sein könnten. Referenziert man ein solches Attribut in der Select-Klausel, muss bei der Formulierung der Anfrage der Name der Relation vorangestellt werden. • Bei mehreren Einträgen in der From-Klausel muss die Relation, die das Aggregierungsidentifikator- bzw. Identifikatorattribut enthält als letztes angegeben sein. Das (Aggregierungs-)Identifikatorattribut dieser Relation wird standardmäßig für den Verbund mit den Tabellen der Arbeitsdatenbank verwendet. • Bei der Verknüpfung einer Relation mit aggregierten Objekten muss das Aggregierungsidentifikatorattribut dieser Relation den selben Namen besitzen, wie das der entsprechenden Aggregierungstabelle, da sonst kein Verbund mit der Linktabelle hergestellt werden kann. Bildet man diese Relationen mit der in Abschnitt 4.3.2 vorgestellten Erweiterung ist dies immer der Fall. Daher müssen auch die Namen der Aggregierungsidentifikatorattribute für die Komponentendatenbanken nicht registriert werden. Beispiel aggID 81 82 83 Agg ObjektA objektart geometrie Straße Siedlung Straße aggID 11 12 Agg ObjektB objektart geometrie Siedlung Straße Arbeitsdatenbank: AggregationA oid aggID 321 81 322 82 323 81 324 83 AggregationB oid aggID 561 11 562 12 563 11 LinkAB aid bid 81 12 82 11 Abbildung 5.5: Beispielrelationen zu Integrationsoperatoren 77 Entwurf des Anfragesystems Die Anfrage in Beispiel 5.16 berechnet eine Vereinigung der Relationen aus Abbildung 5.5, die aggregierte Objekte aus zwei über den Komponentendatenbanklink cdbA cdbB verbundenen Datenbanken enthalten. Für den Komponentendatenbanklink wurden die Aggregierungstabellen AggregationA und AggregationB sowie die Linktabelle LinkAB registriert. SELECT aggID, objektart, geometrie FROM Agg_ObjektA UNION Agg_ObjektB USING AGGREGATED LINK cdbA_cdbB Beispiel 5.16: Anfrage mit erweitertem Union-Operator Zunächst wird mittels der Anfrage an den Komponentendatenbankkatalog in Beispiel 5.17 der Name der Linktabelle und die Namen der Aggregierungsidentifikatorattribute der Linktabelle und der Aggregierungstabellen bestimmt. Letztere entsprechen den Aggregierungsidentifikatorattributen der zu vereinigenden Relationen. SELECT LinkTable.Name, LinkTable.LeftAggregatedIDColumn, LinkTable.RightAggregatedIDColumn, LeftAggregatedObjects.AggregatedIDColumn, RightAggregatedObjects.AggregatedIDColumn FROM LinkTable, ComponentDBLink AggregatedObjectsTable LeftAggregatedObjects, AggregatedObjectsTable RightAggregatedObjects WHERE LinkTable.Name = ComponentDBLink.Links AND ComponentDBLink.LeftAggregatedObjects = LeftAggregatedObjects.Name AND ComponentDBLink.RightAggregatedObjects = RightAggregatedObjects.Name AND ComponentDBLink.Name = ’cdbA_cdbB’ Beispiel 5.17: Anfrage an den Komponentendatenbankkatalog In die ursprüngliche Anfrage in Beispiel 5.16 wird eine Left-Outer-Join-Klausel mit der Relation LinkAB und passender Join-Bedingung eingefügt. Der UnionOperator wird durch einen Outer-Join-Operator und die Using-Link-Klausel durch eine On-Klausel mit geeigneter Join-Bedingung ersetzt. Es werden die Attribute in der Select-Klausel verdoppelt und jeweils der Tupelalias von einer der Ursprungsrelationen vorangestellt. Auf jedes gleichnamige Attributpaar wird dann ein zu dem Typ dieser Attribute passender Array-Konstruktor angewendet. Beispiel 5.18 zeigt die übersetzte Anfrage. 78 5.3 Übersetzen von SQLSF-Anweisungen SELECT ArrayOfNumber(o1.aggID, o2.aggID), ArrayOfString(o1.objektart, o2.objektart), ArrayOfGeometry(o1.geometrie, o2.geometrie) FROM A.Objekt o1 LEFT OUTER JOIN LinkAB ON o1.oid = LinkAB.aid OUTER JOIN B.Objekt o2 ON ObjektLinkAB.bid = o2.oid Beispiel 5.18: Übersetzte Anfrage 5.3.4 Substitution Da in den Veröffentlichungen zu FraQL kein Algorithmus zum Bearbeiten von Substitutionsoperatoren gefunden wurde, wird hier ein selbst entwickeltes Verfahren vorgestellt, das sich an den Algortihmen zum Bearbeiten von SchemaSQL-Anweisungen orientiert. Dieses Verfahren läuft in zwei Phasen ab. In der ersten Phase wird zu der ursprünglichen Anfrage eine weitere Anfrage konstruiert, deren Ergebnisse die Werte darstellen, die für die zu substituierenden Ausdrücke einzusetzen sind. Diese Anfrage wird im Folgenden als Instanzierungsanfrage und das zugehörige Ergebnis als Instanzierungstabelle bezeichnet. In der zweiten Phase wird für jede Zeile der Instanzierungstabelle aus der ursprünglichen Anfrage eine substituierte Anfrage konstruiert, indem die zu substituierenden Ausdrücke durch die Werte in dieser Zeile ersetzt werden. Anschließend werden alle diese Anfragen zu einer Anfrage zusammengesetzt, die das Ergebnis der ursprünglichen SQLSF-Anfrage berechnet. Eventuell können bei einem Durchlauf der zwei Phasen nicht alle Substitutionsoperatoren aufgelöst werden. In diesem Fall muss der Algorithmus rekursiv auf die substituierten Anfragen angewendet werden. Phase I: Konstruktion der Instanzierungsanfrage 1. Bestimme alle Einträge in der From-Klausel der ursprünglichen Anfrage, in denen kein Substitutionsoperator auftritt. Konstruiere mit diesen Einträgen die From-Klausel der Instanzierungsanfrage. 2. Bestimme alle Ausdrücke, die in der ursprünglichen Anfrage innerhalb eines Substitutionsoperators auftreten und nur die Relationen aus Schritt 1 referenzieren. Konstruiere mit dem Schlüsselwort Distinct und diesen Ausdrücken die Select-Klausel der Instanzierungsanfrage. 3. Bestimme alle mit dem And-Operator verbundenen Teilbedingungen in der Where-Klausel der ursprünglichen Anfrage, die nur die Relationen aus Schritt 1 referenzieren. Konstruiere mit diesen Teilbedingungen die Where-Klausel der Instanzierungsanfrage. 79 Entwurf des Anfragesystems 4. Stelle die Instanzierungsanfrage an das Datenbanksystem. Phase II: Substitution und Zusammensetzung Für jede Zeile der Instanzierungstabelle: 1. Erstelle eine Kopie der ursprünglichen Anfrage. 2. Ersetze in der kopierten Anfrage die zu substituierenden Ausdrücke durch die zugehörigen Werte in der aktuellen Zeile der Instanzierungstabelle. 3. Ergänze die Where-Klausel der substituierten Anfrage mit dem AndOperator um eine Bedingung der Form Ausdruck = ’Wert’ für jeden substituierten Ausdruck. 4. Ergänze die Select-Klausel der substituierten Anfrage um einen Eintrag der Form NULL AS Wert für jeden Wert in einer Spalte der Instanzierungstabelle, die zu einem substituierten Spaltenalias gehört. Die Werte in der aktuellen Zeile sind davon allerdings ausgenommen. 5. Falls die substituierte Anfrage noch weitere Substitutionsoperatoren enthält, wende den Algorithmus rekursiv auf diese Anfrage an. Setze alle substituierten Anfragen mit dem Union-Operator zusammen. Bemerkungen • Substitutionsoperatoren in der Create-View-Klausel müssen vor den anderen Substitutionsoperatoren in einem eigenen Durchlauf des Verfahrens ersetzt werden. In diesem Fall darf man die substituierten Create-ViewAnweisungen nicht zusammensetzten sondern muss diese einzeln bearbeiten. • Innerhalb der Substitutionsoperatoren muss allen Verweisen auf ein Attribut der Name einer Tupelvariable oder Tabelle vorangestellt sein. Dieser wird benötigt, um in Phase I zu bestimmen, welche Einträge in der From-Klausel innerhalb des Substitutionsoperators referenziert werden. • Innerhalb der Where-Klausel ist allen Verweisen auf ein Attribut der Name einer Tupelvariable oder Tabelle voranzustellen. Dieser wird ebenfalls benötigt, um in Phase I die referenzierten Relationen einer Teilbedingung zu bestimmen. • Die Bedingung in der Where-Klausel muss in konjunktiver Normalform formuliert werden. Diese Voraussetzung muss erfüllt sein, damit die Bedingung innerhalb von Phase I in Teilbedingungen zerlegt werden kann. 80 5.3 Übersetzen von SQLSF-Anweisungen • Jeder Ausdruck innerhalb eines Substitutionsoperators muss vom Datentyp Zeichenkette sein, damit aus den Ergebnissen die substituierte Anfrage gebildet werden kann. • Das zusätzliche Einfügen von Einträgen in der Select-Klausel bei der Substitution eines Spaltenalias ist notwendig, damit die Schemata der substituierten Anfragen kompatibel sind und diese mit dem Union-Operator zusammengesetzt werden können. • Der rekursive Aufruf des Verfahren in Schritt 5 von Phase II wird nur benötigt, wenn ein Substitutionsoperator in der Create-View-Klausel mit weiteren Substitutionsoperatoren kombiniert wird (siehe Beispiel 5.22) oder wenn sich ein Attribut innerhalb eines Substitutionsoperators auf einen Eintrag in der From-Klausel bezieht, der selbst noch einen Substitutionsoperator enthält. Die Formulierung von sinnvollen Anfragen zu dem zweitem Fall ist allerdings schwierig und wird bei der in dieser Arbeit beschriebene Verwendung auch nicht benötigt. Daher wird hier nicht weiter darauf eingegangen. Beispiele Im folgenden wird die Übersetzung von SQLSF-Anfragen mit Substitutionsoperatoren anhand zweier Beispiele verdeutlicht. Die Anfragen werden jeweils an die Datenbanken in Abbildung 5.6 gestellt. Die Anfrage in Beispiel 5.19 wandelt die Relationen in der Datenbank A in die Darstellung in der Datenbank B um. Dazu müssen die Attributwerte aller Attribute außer oid bestimmt und gemeinsam mit der Identifikationsnummer und dem Attribut- sowie Tabellennamen in einer Zeile der Ergebnisrelation dargestellt werden. SELECT oid, t.name, c.name, $(c.name) AS wert FROM Tables t, Columns c, A.$(t.name) WHERE c.table = t.name AND t.schema = ’A’ AND c.name <> ’oid’ Beispiel 5.19: Beispielanfrage zur Transformation von Metadaten in Daten Zunächst muss die zu dieser Anfrage passende Instanzierungsanfrage bestimmt werden. Da der dritte Eintrag in der From-Klausel einen Substitutionsoperator enthält, werden nur die ersten beiden Einträge in die From-Klausel der Instanzierungsanfrage übernommen. Die Ausdrücke innerhalb der Substitutionsoperatoren beziehen sich auf die Relationen Columns und Tables und bilden 81 Entwurf des Anfragesystems Datenbank A: Straße oid breite zustand 1 15m in Betrieb oid 2 Schienenbahn kategorie breite S-Bahn 2m Datenbank B: oid 1 1 2 2 3 Attribut tabelle attribut Straße breite Straße zustand Schienenbahn katagorie Schienenbahn breite Flughafen zustand wert 15m in Betrieb S-Bahn 2m im Bau Flughafen oid zustand 3 im Bau Schemakatalog: Tables name schema Straße A Schienenbahn A Flughafen A Attribut B Columns name table breite Straße zustand Straße kategorie Schienenbahn ... ... Abbildung 5.6: Beispieldatenbanken daher die Einträge in der Select-Klausel der Instanzierungsanfrage. Da auch in beiden Teilbedingungen, die die Where-Klausel bilden, nur die selben zwei Relationen referenziert werden, kann die gesamte Where-Klausel unverändert übernommen werden. Beispiel 5.20 zeigt die fertige Instanzierungsanfrage und das berechnete Ergebnis, die Instanzierungstabelle. t.name Straße Straße Schienenbahn Schienenbahn Flughafen SELECT DISTINCT t.name, c.name FROM tables t, columns c WHERE c.table = t.name AND t.schema = ’A’ AND c.name <> ’oid’ c.name breite zustand kategorie breite zustand Beispiel 5.20: Instanzierungsanfrage und zugehörige Instanzierungstabelle Da die Instanzierungstabelle fünf Zeilen enthält, müssen fünf Kopien der ursprünglichen Anfrage erzeugt werden, wobei in jeder die Substitutionsoperatoren durch die Werte in einer Zeile ersetzt werden. In der ersten kopierten Anfrage wird beispielsweise der Substitutionsoperator in der Select-Klausel durch breite und der in der From-Klausel durch Straße ersetzt. Außerdem werden die entsprechenden Bedingungen in der Where-Klausel hinzugefügt. Alle substituierten Anfragen werden schließlich mit Union-Operatoren zusammengesetzt. Ein Teil der übersetzten Anfrage ist in Beispiel 5.21 gezeigt, wobei die bei der Substitution eingesetzten Teile rot hervorgehoben sind. 82 5.3 Übersetzen von SQLSF-Anweisungen SELECT oid, t.name, c.name, breite AS wert FROM tables t, columns c A.Straße WHERE c.table = t.name AND t.schema = ’A’ c.name <> ’oid’ AND c.name = ’breite’ AND t.name = ’Straße’ UNION SELECT oid, t.name, c.name, zustand AS wert FROM tables t, columns c A.Straße WHERE c.table = t.name AND t.schema = ’A’ c.name <> ’oid’ AND c.name = ’zustand’ AND t.name = ’Straße’ UNION ... Beispiel 5.21: Übersetzte Anfrage Die Anfrage in Beispiel 5.22 erzeugt bei Anwendung auf die Datenbank B in Abbildung 5.6 Sichtrelationen, die mit den Werten des Attributs tabelle benannt sind. Aufgrund der Verwendung des Substitutionsoperators anstelle eines Spaltenalias erhält jede Sicht Attribute, deren Namen den Werten in der Spalte attribut entsprechen. Somit wird annähernd4 die Darstellung der Datenbank A erzeugt. CREATE VIEW $(a.tabelle) AS SELECT oid, wert AS $(a.attribut) FROM B.Attribut a Beispiel 5.22: Beispielanfrage zur Transformation von Daten in Metadaten Bei der Bearbeitung dieser Anfrage muss zunächst der Substitutionsoperator in der Create-View-Klausel ersetzt werden. Dazu werden mit der Instanzierungsanfrage in Beispiel 5.23 die Werte des Attributs tabelle der Relation Attribut bestimmt, so dass man die ebenfalls abgebildete Instanzierungstabelle erhält. Da die Instanzierungstabelle drei Zeilen enthält, werden drei substituierte Anweisungen erzeugt. In jeder Anweisung wird der Substitutionsoperator in der Create-View-Klausel durch einen Wert in der Instanzierungstabelle ersetzt und 4 Um die genaue Darstellung der Datenbank A zu erhalten, müssen noch Tupel mit gleichem Identifikator zusammengefasst werden (siehe Abschnitt 4.5.4). 83 Entwurf des Anfragesystems tabelle Straße Schienenbahn Flughafen SELECT DISTINCT a.tabelle FROM B.Attribut a Beispiel 5.23: Instanzierungsanfrage zum Substitutionsoperator in der Create-View-Klausel eine entsprechende Bedingung hinzugefügt (siehe Beispiel 5.24). Da es sich um DDL-Anweisungen handelt, dürfen diese nicht mittels des Union-Operators zusammengesetzt werden. Die Substitutionsoperatoren in der Select-Klausel müssen durch rekursive Anwendung des Verfahrens auf die einzelnen Anweisungen bearbeitet werden. CREATE VIEW Straße AS SELECT oid, wert AS $(a.attribut) FROM B.Attribut a WHERE a.tabelle = ’Straße’ CREATE VIEW Schienenbahn AS SELECT oid, wert AS $(a.attribut) FROM B.Attribut a WHERE a.tabelle = ’Schienenbahn’ CREATE VIEW Flughafen AS SELECT oid, wert AS $(a.attribut) FROM B.Attribut a WHERE a.tabelle = ’Flughafen’ Beispiel 5.24: Anweisungen nach Ersetzung des Substitutionsoperators in der Create-ViewKlausel Im Folgenden wird nur die rekursive Bearbeitung der ersten Anweisung in Beispiel 5.24 beschrieben. Diese enthält eine einschränkende Where-Klausel, die für die Instanzierungsanfrage in Beispiel 5.25 übernommen wird. Somit taucht ein Wert aus der Spalte attribut nur dann in der Instanzierungstabelle auf, wenn der Wert des Attributs tabelle in der zugehörigen Zeile dem Wert ’Straße’ entspricht. SELECT DISTINCT a.attribut FROM B.Attribut a WHERE a.tabelle = ’Straße’ attribut breite zustand Beispiel 5.25: Instanzierungsanfrage zum Substitutionsoperator in der Select-Klausel Für jeden Wert in der Instanzierungstabelle wird die Anfrage, mit der die Sicht Straße gebildet wird, kopiert, wobei der Substitutionsoperator durch einen 84 5.3 Übersetzen von SQLSF-Anweisungen Wert in der Instanzierungstabelle ersetzt und eine entsprechende Bedingung hinzugefügt wird. Weiterhin muss beispielsweise beim Einsetzen des Wertes breite für jeden weieteren Wert in der Instanzierungstabelle (hier nur der Wert zustand, ein entsprechend benanntes Attribut mit dem Wert NULL in die Select-Klausel eingefügt werden. Dadurch werden die Schemata der substituierten Anfragen angeglichen, so dass diese anschließend mit dem Union-Operator zusammengesetzt werden können und man die übersetzte Anweisung in Beispiel 5.26 erhält. CREATE VIEW Straße AS SELECT oid, wert AS breite, NULL AS zustand FROM B.Attribut a WHERE a.tabelle = ’Straße’ AND a.attribut = ’breite’ UNION SELECT oid, NULL AS breite, wert AS zustand FROM B.Attribut a WHERE a.tabelle = ’Straße’ AND a.attribut = ’zustand’ Beispiel 5.26: Übersetzte Anweisung 85 Kapitel 6 Methodik der Föderierung räumlicher Daten Der Anwendungsbereich der in Kapitel 4 entworfenen Sprache SQLSF ist es, den Benutzer dabei zu unterstützen aus unterschiedlichen räumlichen Datenbeständen, die dasselbe geographische Gebiet beschreiben, einen föderierten Datenbestand aufzubauen. Es wird hier angenommen, dass die Datenbestände als Sammlungen von Relationen gegeben sind, auf die einheitlich über ein Datenbanksystem zugegriffen werden kann. Wie bereits in Kapitel 3 erläutert wurde, können sich solche Datenbestände trotzdem stark unterscheiden. Der folgende Abschnitt 6.1 schlägt eine Vorgehensweise zum Aufbau eines föderierten räumlichen Datenbestandes vor. Das Ziel dabei ist es, durch die Erstellung geeigneter Sichten ein globales Schema zu konstruieren, so dass man durch Anfragen an diese Sichten Informationen in integrierter Form erhalten kann. Es wird dabei schrittweise vorgegangen, wobei jeder Schritt durch die Sprache SQLSF unterstützt wird. Je nach der Beschaffenheit der zu integrierenden Datenbanken kann es sinnvoll sein, die Reihenfolge dieser Schritte etwas zu verändern, so dass die hier angegebene Abfolge nicht in jedem Fall optimal ist. In Abschnitt 6.2 wird die hier vorgeschlagene Vorgehensweise zum Erstellen einer Föderation mit Hilfe von SQLSF am Beispiel von zwei relativ einfachen Datenbanken vorgeführt, für die durch Sichten ein globales Schema aufgebaut wird, über das man mit gewöhnlichen SQL-Anfragen auf die integrierten Informationen aus den Datenbanken zugreifen kann. 86 6.1 Ablauf 6.1 Ablauf 1. Transformation in einheitliche Struktur Zunächst löst man strukturelle Konflikte zwischen den Komponentendatenbanken auf, indem man mit den Möglichkeiten von SQLSF für beide Datenbanken Sichten konstruiert, die eine strukturell einheitliche Darstellung der enthaltenen Informationen anbieten. Geschickterweise geht man dabei derart vor, dass möglichst wenige Sichtrelationen erzeugt werden, die dennoch alle zu integrierenden Objekte enthalten. Eine starke Fragmentierung hat den Nachteil, dass man in den folgenden Schritten jede Relation einzeln transformieren muss. Selbst wenn keine strukturellen Konflikte zwischen den Komponentendatenbankschemata bestehen, kann es zur Föderierung der Datenbestände notwendig sein, deren Struktur zu verändern. Beispielsweise erfordert es das in [ML04] beschriebene Verfahren zum Matching von Objekten, dass in jeder Komponentendatenbank eine Relation existiert, die zumindest einen Schlüssel, die Objektart und die Geometrie aller modellierten Objekte enthält. Gewissermaßen besteht also auch in diesem Fall ein struktureller Konflikt, sofern die zu föderierenden Daten nicht bereits wie gefordert strukturiert sind. 2. Einrichten eines Komponentendatenbanklinks Bevor man Anfragen an die integrierten Datenbestände stellen kann, müssen die Komponentendatenbanken im Komponentendatenbankkatalog registriert und Komponentendatenbanklinks zum Verknüpfen der Daten eingerichtet werden. Dies erreicht man über die entsprechenden SQLSF-Anweisungen zur Manipulation des Komponentendatenbankkatalogs (siehe Abschnitt 5.2). Um diese Links tatsächlich verwenden zu können, müssen die benötigten Zusatzinformationen, wie Matching- oder Ersetzungstabellen, generiert und dem entsprechenden Link zugeordnet werden. Sobald diese Daten in der Arbeitsdatenbank vorliegen, z.B. nach einem Import oder der erfolgreichen Durchführung eines Matching-Verfahrens, können wiederum geeignete Manipulationsanweisungen verwendet werden, um die Tabellen als Bestandteile eines Komponentendatenbanklinks im Komponentendatenbankkatalog zu registrieren. 3. Umrechnen von Attributen Zur Auflösung von Beschreibungskonflikten muss man sich zunächst für eine einheitliche Darstellung entscheiden. Hier ist es sinnvoll, die Darstellung aus einer der Komponentendatenbanken zu übernehmen, um sich die Umrechnung von Objekten aus dieser Komponentendatenbank zu sparen. Für Umrechnungen, die sich nicht mit Hilfe der in Schritt 2 im Komponentendatenbankkatalog 87 Methodik der Föderierung räumlicher Daten registrierten Tabellen durchführen lassen, müssen Umrechnungsfunktionen programmiert werden, sofern diese nicht bereits bei der Föderierung anderer Komponentendatenbanken angelegt wurden und wiederverwendet werden können. 4. Aggregieren von Objekten Will man auf globaler Ebene mit aggregierten Objekten arbeiten, so empfielt es sich, entsprechende Sichten vorzubereiten, die die Objekte in aggregierter Form anbieten. Dabei kann man bereits Datenkonflikte auflösen, die dadurch entstehen, dass einzelne Objekte mit unterschiedlichen Attributwerten zusammengefasst werden. Hat man sich für eine Strategie zum Auflösen dieser Datenkonflikte entschieden, muss man, sofern diese nicht bereits existieren, geeignete Konfliktauflösungsfunktionen programmieren, die aus den mehrwertigen Attributwerten der aggregierten Objekte eindeutige Attributwerte berechnen. Falls es die Anwendung erfordert, dass für unterschiedliche Anfragen Datenkonflikte auf unterschiedliche Art gelöst werden müssen, kann man auch mehrere Sichten mit denselben aggregierten Objekten aber unterschiedlich berechneten Attributwerten erstellen oder die Auflösung auf spätere Schritte verschieben. 5. Verknüpfen von Daten In diesem Schritt verknüpft man die Objekte aus den Komponentendatenbanken mit den geeigneten Integrationsoperatoren. Hierbei muss man sich zunächst entscheiden, ob man die Objekte im globalen Schema in verbundener oder vereinigter Form benötigt. Will man beispielsweise Objekte aus einer Komponentendatenbank um Informationen ergänzen, die zugeordnete Objekte in der anderen Komponentendatenbank beschreiben, bietet sich der Einsatz eines erweiterten Verbundoperators an. Möchte man lieber eine Sicht auf die Gesamtheit der in den Komponentendatenbanken vorhandenen Objekte, setzt man erweiterte Vereinigungsoperatoren ein. Weiterhin ist für jede Komponentendatenbank zu entscheiden, ob man auf der Föderierungsebene mit aggregierten oder einzelnen Objekten aus der Komponentendatenbank arbeiten will. In Abhängigkeit von dieser Entscheidung setzt man zur Integration der Objekte aus jeweils zwei Komponentendatenbanken die passende Variante des gewünschten Integrationsoperators ein. Benutzt man einen Vereinigungsoperator zur Integration von Objekten aus zwei Komponentendatenbanken, sind noch Datenkonflikte aufzulösen, was man wie in Schritt 4 durch Anwendung passender Konfliktauflösungsfunktionen erreicht. 6. Erzeugen des globalen Schemas Falls die in Schritt 5 erzeugten Sichten noch nicht bereits dem gewünschten 88 6.2 Anwendungsbeispiel globalen Schema entsprechen, können noch weitere Transformationen darauf angewendet werden. Beispielsweise kann es wünschenswert sein, zur besseren Übersichtlichkeit die in Schritt 1 zusammengefassten Informationen durch eine weitere strukturelle Transformation nach der Integration wieder zu fragmentieren, also ein globales Schema zu erzeugen, dass wieder aus mehr Relationen besteht. 6.2 Anwendungsbeispiel Im Folgenden wird der in Abschnitt 6.1 beschriebene Ablauf zum Erstellen eines globalen Schemas an einem Beispiel vorgeführt. Es sollen die Datenbanken in Abbildung 6.1, in denen Siedlungen modelliert sind, föderiert werden. Durch Anfragen an das globale Schema soll man Informationen über alle in mindestens einer der beiden Komponentendatenbanken modellierten Siedlungen erhalten können. Dabei darf eine Siedlung im föderierten Datenbestand allerdings nur durch ein Datenobjekt beschrieben sein. Das globale Schema soll strukturell dem Schema der Datenbank A entsprechen, also aus jeweils einer Sichtrelation für jede Siedlungsart bestehen. Datenbank A: Datenbank B: ID 51 52 Wohngebiet Einwohner Geometrie 312 228 ID 63 Industriegebiet Einwohner Geometrie 26 ID 82 Gewerbegebiet Einwohner Geometrie 102 ID 204 205 212 238 239 Funktion 2101 2101 2103 2108 2108 Siedlung Einwohner 402 144 15 54 52 Geometrie Abbildung 6.1: Beispieldatenbanken Zunächst werden die Relationen aus der Datenbank A zu einer Relation zusammengefasst. Damit wird der strukturelle Unterschied, der zwischen den Komponentendatenbanken besteht, beseitigt. Außerdem hat dieses Vorgehen den Vorteil, dass nach der Transformation nur noch jeweils eine Relation pro Komponentendatenbank zu integrieren ist. Als Metadatenquelle für die Namen der Tabellen in der Datenbank A kann beispielsweise der Schemakatalog des Da89 Methodik der Föderierung räumlicher Daten tenbanksystems verwendet werden, was im Beispiel 6.1 vereinfacht durch die Relation Tables dargestellt ist. CREATE VIEW SiedlungA AS SELECT t.id, Tables.name AS funktion, einwohner, t.geometrie FROM Tables, A.$(Tables.name) t WHERE Tables.db = ’A’ ID 51 52 63 82 SiedlungA Funktion Einwohner Wohngebiet 312 Wohngebiet 228 Industriegebiet 26 Gewerbegebiet 102 Geometrie Beispiel 6.1: Zusammenfassen von Relationen Anschließend können durch ein Matching der räumlichen Objekte Zuordnungen zwischen diesen berechnet werden. Die Ergebnisse werden in den Tabellen AggregationA, AggregationB und LinkAB in der Arbeitsdatenbank abgespeichert. Weiterhin werden noch die Tabelle FunktionTransition zur Umrechnung des Funktion-Attributs und eine Passpunkttabelle in der Arbeitsdatenbank abgelegt (siehe Abbildung 6.2). Mit den in Abschnitt 5.2 vorgestellten Anweisungen kann nun ein Komponentendatenbanklink, der hier mit A B benannt wird, erzeugt werden, dem man dann diese Tabellen zuordnet. Arbeitsdatenbank: FunktionTransition funktionA funktionB Wohngebiet 2101 Industriegebiet 2103 Gewerbegebiet 2108 xA 52.32 64.22 81.32 Passpunkte yA xB 44.21 50.79 15.37 89.36 13.28 72.74 yB 43.25 15.68 14.05 AggregationA oid aggID 51 15 52 15 63 21 82 24 AggregationB oid aggID 204 3 205 3 212 8 238 11 239 11 LinkAB aid bid 15 3 24 11 Abbildung 6.2: Tabellen mit Informationen zum Verlinken der Komponentendatenbanken Als nächstes werden Beschreibungskonflikte aufgelöst. Es wird entschieden, die Darstellung der Attributwerte aus der Komponentendatenbank A auf globaler Ebene zu übernehmen, so dass nur die Attributwerte aus der Komponentendatenbank B umgerechnet werden müssen. Für das Attribut funktion kann die Ersetzungstabelle FunktionTransition und zur Transformation der Geometrien die Passpunkte benutzt werden. Diese Umrechnungen werden in der 90 6.2 Anwendungsbeispiel Sichtdefinition in Beispiel 6.2 durch Anwendung der Transform-Klausel auf die entsprechenden Attribute realisiert. Da sich die Darstellung der Einwohnerzahl in den beiden Komponentendatenbanken nicht unterscheidet, muss das Attribut einwohner nicht umgerechnet werden. CREATE VIEW SiedlungB AS SELECT id, TRANSFORM funktion USING LINK A_B, einwohner, TRANSFORM geometrie USING LINK A_B FROM B.Siedlung ID 204 205 212 238 239 SiedlungB Funktion Einwohner Wohngebiet 402 Wohngebiet 144 Industriegebiet 15 Gewerbegebiet 54 Gewerbegebiet 52 Geometrie Beispiel 6.2: Auflösung von Beschreibungskonflikten Hätte man eindeutige Zuordnungen zwischen den räumlichen Objekten zur Verfügung, könnte man an dieser Stelle die Objekte vereinigen. Da dies allerdings nicht zutrifft, werden zunächst für beide Komponentendatenbanken Sichten mit aggregierten Objekten gebildet. Dabei muss man sich überlegen, wie man mit Datenkonflikten umgeht, wenn man mehrere Objekte mit jeweils eigenen Attributwerten zu einem aggregierten Objekt zusammenfasst. In Beispiel 6.3 werden diese Konflikte bereits bei der Aggregation durch Anwendung geeigneter Funktionen aufgelöst. Zunächst sei angenommen, dass nur solche einzelnen Objekte zu einem aggregierten Objekt zusammengefasst werden, die denselben Wert für das Attribut funktion besitzen1 . Daher kann ein bei der Aggregation gebildeter mehrwertiger Attributwert für dieses Attribut in einen eindeutigen Wert transformiert werden, indem einfach das erste definierte Element des Arrays selektiert wird. Die Datenkonflikte des Einwohner-Attributs werden sinnvollerweise durch Berechnung der Summe der Elemente eines mehrwertigen Attributwerts beseitigt. Die Geometrien der einzelnen Objekte werden durch geometrische Vereinigung zu Geometrien für aggregierte Objekte zusammengefasst. 1 Diese Annahme ist durchaus realistisch, wenn man sich vorstellt, dass während des Matchingprozesses das Attribut funktion als partitionierendes Kriterium zur Einteilung der Objekte in Vergleichsmengen verwendet wird und nur Zuordnungen von Objekten aus korrespondierenden Mengen erzeugt werden. Ausführlicher sind solche Techniken beispielsweise in [Man02] beschrieben. 91 Methodik der Föderierung räumlicher Daten CREATE VIEW Agg_SiedlungA AS SELECT firstOf(funktion) AS funktion, sumOf(einwohner) AS einwohner, spatialUnionOf(geometrie) AS geometrie FROM SiedlungA AGGREGATE USING LEFT LINK A_B aggID 15 21 24 Agg SiedlungA Funktion Einwohner Wohngebiet 540 Industriegebiet 26 102 Gewerbegebiet Geometrie CREATE VIEW Agg_SiedlungB AS SELECT firstOf(funktion) AS funktion, sumOf(einwohner) AS einwohner, spatialUnionOf(geometrie) AS geometrie FROM SiedlungB AGGREGATE USING RIGHT LINK A_B aggID 3 8 11 Agg SiedlungB Funktion Einwohner Wohngebiet 546 Industriegebiet 15 Gewerbegebiet 106 Geometrie Beispiel 6.3: Aggregieren von Objekten und Konfliktauflösung Im nächsten Schritt können, wie in Beispiel 6.4 dargestellt wird, die aggregierten Objekte aus den unterschiedlichen Komponentendatenbanken zusammengefasst werden. Dabei treten wiederum Datenkonflikte auf, die durch mehrwertige Attribute repräsentiert sind und für die man sich geeignete Auflösungsstragien einfallen lassen muss. Für das Attribut funktion wird entschieden, dass die Werte aus der Datenbank A verlässlicher, und daher zu bevorzugen sind. Der Attributwert eines Objekts aus der Datenbank B wird nur dann übernommen, wenn dieses Objekt keinem Objekt aus A zugeordnet ist. Datenkonflikte auf dem Einwohner-Attribut werden beseitigt, indem der Durchschnitt der konkurrierenden Werte berechnet wird. Der aufgelöste Geometrie-Attributwert wird durch die geometrische Durchschnittsoperation berechnet. Schließlich muss aus der in Beispiel 6.4 gebildeten Sicht noch die für das globale Schema gewünschte Darstellung erzeugt werden. Dazu werden die Objekte anhand des Attributs funktion auf unterschiedliche Sichtrelationen aufgeteilt. 92 6.2 Anwendungsbeispiel CREATE VIEW SiedlungAB AS SELECT preferLeftOf(funktion) AS funktion, avgOf(einwohner) AS einwohner, spatialIntersectionOf(geometrie) AS geometrie FROM Agg_SiedlungA UNION Agg_SiedlungB USING AGGREGATED LINK A_B SiedlungAB Funktion Einwohner Wohngebiet 543 Industriebegiet 26 Industriegebiet 15 Gewerbegebiet 104 Geometrie Beispiel 6.4: Vereinigung der aggregierten Objekte und Auflösung von Datenkonflikten Dabei wird an den Namen jeder gebildeten Sicht das Suffix AB angehängt, um kenntlich zu machen, dass diese Relation aus der Integration der Datenbanken A und B entstanden ist. Die entsprechende Anweisung und das fertige globale Schema werden in Beispiel 6.5 gezeigt. CREATE VIEW $(SiedlungAB.funktion || ’AB’) AS SELECT einwohner, geometrie FROM SiedlungAB WohngebietAB Einwohner Geometrie 543 IndustriegebietAB Einwohner Geometrie 26 15 GewerbegebietAB Einwohner Geometrie 104 Beispiel 6.5: Das globale Schema 93 Kapitel 7 Implementierung des Prototypen Das in Kapitel 5 entworfene System zur Realisierung von SQLSF wurde im Rahmen dieser Arbeit prototypisch umgesetzt. Dazu wurden im wesentlichen die Programmiersprache Java und Oracle 10g als Datenbankmanagementsystem verwendet. Diese Implementierung ist im Folgenden beschrieben. Abschnitt 7.1 erläutert zunächst den allgemeinen Aufbau des Programms. In Abschnitt 7.2 wird die Erzeugung eines SQLSF-Parsers und die programmintern benutzte Datenstruktur zur Darstellung der Anweisungen erläutert. Die Implementierung des Komponentendatenbankkatalogs ist in Abschnitt 7.3 beschrieben und die der mehrwertigen Attribute durch Arrays in Abschnitt 7.4. Schließlich erklärt Abschnitt 7.5 die Realisierung von Konfliktauflösungsfunktionen und gibt an, wie das System durch eigene Auflösungsmethoden erweitert werden kann. 7.1 SQLSF*Plus Um SQLSF-Anweisungen auf dem föderierten Datenbanksystem ausführen zu können, wurde eine kommandozeilenbasierte Benutzerschnittstelle mit dem Namen SQLSF*Plus implementiert1 . Man startet das Programm mit dem Befehl: sqlsfplus [ -debug ] <Benutzername> 1 Die Benennung orientiert sich an dem bekannten textbasierten Datenbankfrontend SQL*Plus von Oracle, das als Vorbild für die in dieser Arbeit realisierte Schnittstelle verwendet wurde. 94 7.1 SQLSF*Plus Nach erfolgreicher Authentifikation kann man SQLSF-Anweisungen, die jeweils mit einem Semikolon abzuschließen sind, eingeben, woraufhin das Ergebnis der Anweisung angezeigt wird. Wurde das Programm im Debug-Modus gestartet, so werden zusätzlich die übersetzten SQL-Anweisungen angezeigt. Mit dem Kommando exit beendet man das Programm. Die Übersetzung von eingegebenen Anweisungen ist komplett in Java realisiert, wobei für Zugriffe auf die Datenbank die Schnittstelle JDBC verwendet wird. Diese Anweisungen werden von einem Parser syntaktisch analysiert und in Syntaxbäume umgewandelt, auf denen dann die Transformationen zur Erzeugung von SQL-Anweisungen ausgeführt werden. Zusätzlich zu diesem Parser, dessen Implementierung im Paket parser vorliegt, wurden die folgenden Module in Form von Java-Klassen erstellt: Frontend nimmt Anweisungen von der Kommandozeile entgegen, formatiert die Ergebnisse von Anfragen und gibt diese ebenfalls auf der Kommandozeile aus. CommandTranslator koordiniert die Übersetzung von SQLSF-Anweisungen in Standard-SQL, indem je nach Bedarf die folgenden Untermodule, die Implementierungen der in Abschnitt 5.3 entwickelten Verfahren enthalten, aufgerufen werden. TransformationTranslator enthält die Routinen zur Übersetzung von Anweisungen mit Transform-Klausel. AggregationTranslator realisiert die Verfahren zur Übersetzung von Anweisungen mit Aggregate-Klausel. IntegrationTranslator bearbeitet Anweisungen, die erweiterte Integrationsoperatoren enthalten. SubstitutionTranslator übersetzt Anweisungen, in denen Substitutionsoperatoren auftreten. RegistrationTranslator führt Anweisungen zur Registrierung von Informationen im Komponentendatenbankkatalog aus. ParseTreeModification enthält statische Methoden für die Modifizierung von Syntaxbäumen. 95 Implementierung des Prototypen 7.2 Parser Zum Erzeugen des Parsers wurde der Parsergenerator JavaCC2 4.0 verwendet. Dieser erzeugt aus einer syntaktischen Spezifikation einer Sprache die JavaQuellen für eine Programmkomponente zur syntaktischen Analyse einer Eingabe. In der Distribution von JavaCC enthalten ist der Preprozessor JJTree. Dieser kann verwendet werden, um einen Parser zu erzeugen, der aus einer Eingabe eine interne Repräsentation in Form eines Syntaxbaums aufbaut. Diese Funktionalität wird benötigt um die Eingabe nach der syntaktischen Analyse zu verarbeiten. Ein weiteres mitgeliefertes Werkzeug ist JJDoc. Dieses kann verwendet werden, um zu Dokumentationszwecken eine Darstellung der zum Erzeugen des Parsers verwendeten Grammatik in Backus-Naur-Form zu erzeugen. JJDoc sqlsfparser.txt JJTree sqlsfparser.jjt JavaCC sqlsfparser.jj Java-Quelldateien für Parser Java-Quelldateien für Syntaxbaum Abbildung 7.1: Prozess der Erzeugung der Quellen für den Parser Abbildung 7.1 zeigt schematisch den Prozess zur Erzeugung der Java-Quelldateien für den Parser. Zunächst wird eine syntaktische Spezifikation der Sprache SQLSF erstellt, die sowohl die Grammatik als auch Aktionen beschreibt, die der Parser bei der syntaktischen Analyse ausführen soll. Diese syntaktische Spezifikation in der Datei sqlsfparser.jjt wird zunächst an den Preprozessor JJTree übergeben. Dieser erzeugt eine neue syntaktische Spezifikation, die mit Java-Codeblöcken zur Erzeugung eines Syntaxbaumes angereichert ist. Außerdem werden dabei bereits die Java-Quelldateien mit den Klassen zur programminternen Repräsentation des Syntaxbaums generiert. Die erweiterte syntaktische Spezifikation in der Datei sqlsfparser.jj wird anschließend an den eigentlichen Parsergenerator JavaCC übergeben, der dar2 Java Compiler Compiler : https://javacc.dev.java.net/ 96 7.2 Parser aus die fertigen Java-Quelldateien des SQLSF-Parsers erzeugt. Schließlich wird mit dieser Spezifikation noch das Programm JJDoc aufgerufen, das die Datei sqlsfparser.txt mit der gesamten Grammatik in Backus-Naur-Form zu Dokumentationszwecken generiert. Abbildung 7.2 gibt einen Überblick über die von JJTree erzeugte Datenstruktur zur programminternen Repräsentation eines SQLSF-Syntaxbaums. Bei der Analyse einer eingegebenen Anweisung wird zu jeder angewendeten Produktion der SQLSF-Grammatik eine Instanz der Klasse SimpleNode erstellt. Diese Instanz wird dem Knoten, der die übergeordnete Produktion repräsentiert, als Kind zugewiesen. Das Attribut ID gibt an, um welche Produktion es sich handelt. Eine Programmkomponente, die mit Syntaxbäumen arbeitet, kann das Interface SQLSFParserTreeConstants implementieren, das eine Konstante für jede Produktion der Grammatik definiert, so dass durch Vergleich der ID eines Knotens mit diesen Konstanten festgestellt werden kann, welches syntaktische Konstrukt der Knoten repräsentiert. Zum Zugriff auf Eltern- oder Kindknoten und zur Transformation von Syntaxbäumen können die im Interface Node spezifizierten Methoden verwendet werden. <<Interface>> SQLSFParserTreeConstants +JJTCOMMAND: int = 0 +JJTQUERY: int = 1 +JJTDDL_STATEMENT: int = 2 +... * children <<Class>> SimpleNode <<Interface>> 1 Node parent +jjtOpen(): void +jjtClose(): void +jjtSetParent(Node n): void +jjtGetParent(): Node +jjtAddChild(Node n, int i): void +jjtGetChild(int i): Node +jjtGetNumChildren(): int #ID: int #Content: String Abbildung 7.2: Datenstruktur der Syntaxbäume im Überblick Die von JJTree erzeugte Datenstruktur wurde für den SQLSF-Parser um ein Attribut Content erweitert. Durch Einfügen entsprechender Aktionen in die syntaktische Spezifikation wurde dafür gesorgt, dass bei der Anwendung von Produktionen, die Literale oder Namen von Datenbankobjekten repräsentieren, die geparste Zeichenkette in diesem Attribut gespeichert wird. Diese Informationen werden nach der Transformation des Syntaxbaumes benötigt, um daraus eine SQL-Anfrage zu erzeugen. 97 Implementierung des Prototypen Da der Aufwand für eine vollständige Umsetzung des SQL-Standards hier nicht vertretbar wäre, wurde nur eine ausgewählte Teilmenge des Sprachumfangs von SQL als Basis für die mit diesem Prototypen realisierte Erweiterung verwendet. Die vollständige Grammatik der mit diesem Prototypen verwendbaren Sprache ist in Anhang A enthalten. 7.3 Komponentendatenbankkatalog Zur Realisierung des Komponentendatenbankkatalogs wurde das in Abschnitt 5.2 entworfene Schema durch Erstellung entsprechender Relationen in der Datenbank umgesetzt. Dabei wurden zu der Deklaration der Tabellen noch CheckConstraints hinzugefügt, die die Einhaltung einiger einfacher Integritätsbedingungen überwachen. Zur Veranschaulichung wird in Beispiel 7.1 die Implementierung der Relation mit den Metadaten der Aggregierungstabellen angegeben. Das Check-Constraint überprüft für jede registrierte Tabelle, ob das Aggregierungsidentifikator- und Identifikatorattribut unterschiedliche Namen besitzen. CREATE TABLE AggregatedObjectTable ( Name VARCHAR2(30) PRIMARY KEY, AggregatedIDColumn VARCHAR2(30) NOT NULL, ObjectIDColumn VARCHAR2(30) NOT NULL, CONSTRAINT ck_aot_dis_cols CHECK (AggregatedIDColumn <> ObjectIDColumn) ); Beispiel 7.1: Realisierung einer Relation des Komponentendatenbankkatalogs 7.4 Aggregation Die für das Anfragesystem benötigte Repräsentation von Arrays innerhalb der Datenbank wurde durch die propietären Varying Arrays von Oracle realisiert (siehe [Lon04]), die es ermöglichen, Arrays von Werten desselben Datentyps als Attributwerte in einer Relation zu speichern. Bevor man Werte eines Datentyps aggregieren kann, müssen der zugehörige Array-Typ und die zugehörige Aggregierungsfunktion erstellt werden. Für die im Verlauf dieser Arbeit am häufigsten verwendeten Datentypen NUMBER, VARCHAR2 und SDO GEOMETRY wurden diese bereits vorbereitet. 98 7.5 Konfliktauflösung Um auch mit weiteren Datentypen arbeiten zu können wurde eine generische Implementierung in Form von Templates der für die Aggregation erforderlichen Komponenten vorgenommen, aus der man durch Ersetzen eines Platzhalters durch den gewünschten Datentyp eine konkrete Implementierung erhält. Da es erforderlich ist, bei der Definition des Array-Typs die maximale Anzahl von Elementen zu spezifizieren, wurde diese in der Implementierung auf 256 festgesetzt, was sich nach einer Analyse der zur Verfügung stehenden geographischen Daten als bei weitem ausreichend erwies. Sollten größere Arrays benötigt werden, kann dies durch einfaches Ändern der Konstante in der jeweiligen Array-Typ-Definition erreicht werden. Leider erlaubt es Oracle nicht, Vergleichsoperatoren auf Attribute vom Datentyp Array anzuwenden3 . Damit können beispielsweise nicht ohne weiteres Verbunde über solche Spalten berechnet werden. Um dieses Problem zu umgehen, wurde die generische Implementierung um die folgenden Funktionen ergänzt. • ArrayOfT ypeEquals : Array[T ype] × Array[T ype] → Number Vergleicht die Elemente der zwei Arrays eines Typs und liefert 1, falls alle Elemente übereinstimmen, 0 sonst. • ArrayOfT ypeContains : Array[T ype] × T ype → Number Liefert 1, falls das Array von Elementen eines Typs den spezifizierten Wert enthält, 0 sonst. Konkrete Ausprägungen dieser Funktionen wurden für die Datentypen NUMBER, VARCHAR2 und SDO GEOMETRY implementiert, womit beispielsweise auf die in Beispiel 7.2 angegebene Art ein Verbund über mehrwertige Attribute berechnet werden kann. SELECT * FROM Agg_Objekt_A, Agg_Objekt_B WHERE ArrayOfNumberEquals(Agg_Objekt_A.oid, Agg_Objekt_B.oid) = 1 Beispiel 7.2: Berechnung eines Verbunds über mehrwertige Attribute 7.5 Konfliktauflösung Zur Auflösung von Datenkonflikten wurden die in Abschnitt 4.3.3 vorgestellten Funktionen implementiert. Beispiel 7.3 zeigt die Implementierung einer Kon3 Da Arrays seit 1999 Bestandteil des SQL-Standards sind, darf man hoffen, dass Oracle deren Unterstützung zukünftig noch verbessert. 99 Implementierung des Prototypen fliktauflösungsfunktion in PL/SQL, die bei einem mehrwertigen Attributwert, der zwei Geometrien enthält, den ersten Wert bevorzugt. CREATE FUNCTION preferLeftGeometryOf(mvGeometry ArrayOfGeometry) RETURN MDSYS.SDO_GEOMETRY AS BEGIN IF mvGeometry(1) IS NOT NULL THEN RETURN mvGeometry(1); ELSE RETURN mvGeometry(2); END IF; END; Beispiel 7.3: Beispiel für die Implementierung einer Konfliktauflösungsfunktion Durch Programmierung solcher Funktionen kann das System um weitere Konfliktauflösungsmöglichkeiten erweitert werden. Da sich das Konzept einiger der in Abschnitt 4.3.3 vorgestellten Methoden auf weitere Datentypen übertragen lässt, wurden entsprechende generische Implementierungen erstellt, aus denen man durch Ersetzen eines Platzhalters durch einen konkreten Datentyp eine konkrete Implementierung der Konfliktauflösungsfunktion für diesen Datentyp erhält. Funktionen zur Auflösung von Beschreibungskonflikten durch Umrechnung von Attributwerten wurden hier nicht vorbereitet, da es in diesem Fall schwerer ist, sich allgemein verwendbare Funktionen auszudenken. Für konkrete Anwendungen kann das System ebenfalls leicht um passende Umrechnungsfunktionen erweitert werden, wie Beispiel 7.4 zeigt. CREATE FUNCTION DMtoEUR(dm NUMBER) RETURN NUMBER AS BEGIN RETURN 0.511291881 * dm; END; Beispiel 7.4: Funktion zur Umrechnung von DM in Euro Für die Realisierung des Rubber Sheeting wurde die Implementierung aus [Kre04] übernommen und an die Anforderungen in dem in dieser Arbeit entworfenen System angepasst. 100 Kapitel 8 Ausblick Die in dieser Arbeit als Erweiterung von SQL realisierte Anfragesprache kann eingesetzt werden, um innerhalb eines Datenbanksystems mit unterschiedlichen Sammlungen von räumlichen Daten zu arbeiten. Insbesondere wird man dabei unterstützt, ein globales Schema zu definieren, das eine integrierte Sichtweise auf die Daten anbietet und es ermöglicht, Anfragen an den integrierten Datenbestand zu stellen. Damit wird das räumliche Datenbanksystem durch die Verwendung eines Systems zur Bearbeitung von SQLSF-Anweisungen um eine für die Föderierung der Datenbestände wichtige Funktionalität ergänzt. Durch die im Folgenden angesprochenen Punkte werden Möglichkeiten für eine weitere Ergänzung dieser Funktionalität vorgeschlagen. Erweiterung des Sprachumfangs von SQLSF Es wurde bereits an anderer Stelle erwähnt, dass als Grundlage für die in dieser Arbeit realisierte Spracherweiterung nur eine ausgewählte Teilmenge des Sprachumfangs von SQL verwendet wurde. Der erste Ansatzpunkt für eine Erweiterung ist es daher, den vollen Sprachumfang von SQL in Verbindung mit SQLSF-Anweisungen nutzbar zu machen. Ziel dabei ist es, eine einheitliche Schnittstelle anzubieten über die sowohl SQLSF-Anweisungen abgesetzt als auch beliebige SQL-Anweisungen auf dem föderierten Datenbanksystem ausgeführt werden können. Für eine solche Aufgabenstellung wäre ein erweiterbarer SQL-Parser wünschenswert, der es erlaubt, die SQL-Syntax durch eigene Sprachkonstrukte zu ergänzen und Verfahren zum Bearbeiten dieser Konstrukte hinzuzufügen. Geometrische Konfliktauflösung Ein Problem, das in dieser Arbeit leider nicht zufriedenstellend gelöst wer101 Ausblick den konnte, ist die Auflösung von Datenkonflikten auf geometrischen Attributen. Unterscheiden sich die Geometrien zweier zugeordneter Objekte aus unterschiedlichen Komponentendatenbanken, möchte man zur Integration der Objekte eventuell eine Art ”Mittelwert” der Geometrien berechnen. Dabei beginnt die Schwierigkeit bereits damit, zu definieren, was man unter dem Mittelwert zweier Geometrien versteht. Eine erste Idee bestand darin, einen der in Konflikt stehenden Werte mit einem ”halben” Rubber Sheeting zu transformieren, also die Stützpunkte der Geometrie um die Hälfte des durch das Rubber Sheeting berechneten Vektors zu verschieben. Allerdings sieht man leicht ein, dass dies nicht dem Konzept eines Mittelwerts entspricht. Wendet man die Transformation beispielsweise auf eine Geometrie aus der ersten Komponentendatenbank an, so geht die zugehörige Geometrie aus der zweiten Komponentendatenbank überhaupt nicht in die Berechnung ein, da lediglich die Passpunkte verwendet werden. Dieser Ansatz wurde daher verworfen. Optimierung von SQLSF-Anfragen Um die Effizienz von SQLSF-Anfragen oder Anfragen an mit SQLSF-gebildete Sichten zu verbessern, könnte es sich lohnen, Alternativen zu den Übersetzungsverfahren aus Abschnitt 5.3 zu untersuchen. Insbesondere die Bearbeitung von Substitutionsoperatoren erzeugt recht lange SQL-Anfragen, die viele Unteranfragen enthalten. Im Extremfall enthält eine übersetzte Anfrage eine Unteranfrage für jedes Ergebnistupel. Intelligentere Verfahren könnten hier bessere Übersetzungen liefern. Eventuell erhält man auch durch den Einsatz von Optimierungsverfahren für Multidatenbanksysteme (siehe z.B. [YM98]) einen Performanzgewinn. Weitere Aufgaben bei der Föderierung Zur vollständigen Verwirklichung eines föderierten räumlichen Datenbanksystems wird mehr als die in dieser Arbeit realisierte Funktionalität benötigt. In [Con97] werden beispielsweise auch Konzepte zur globalen Integritätssicherung oder globalen Transaktionsverwaltung in föderierten Datenbanksystemen mit Standarddaten untersucht. Für diese Konzepte ist noch zu untersuchen, welche zusätzlichen Anforderungen sich durch die Hinzunahme räumlicher Daten ergeben und ob sich bereits existierende Lösungsansätze übertragen lassen. Gegebenenfalls müssen für räumliche Daten spezialisierte Techniken eingesetzt werden. 102 Anhang A Die Grammatik von SQLSF Im Folgenden ist die vollständige Grammatik, die zur Implementierung des SQLSF-Prototypen verwendet wurde, in erweiterter Backus-Naur-Form dargestellt. Command ::= "EXIT" | ( Query | DDL_Statement | Register_Statement ) ";" Query ::= Simple_Query ( Set_Operator Simple_Query )* Simple_Query ::= Select_Clause From_Clause ( Where_Clause )? ( Join_Clause | Union_Clause )* ( ( Aggregation_Clause | Grouping_Clause ) ( Having_Clause )? )? Select_Clause ::= "SELECT" ( "DISTINCT" )? ( "*" | Select_List_Entry ( "," Select_List_Entry )* ) Select_List_Entry ::= ( Expression | Transform_Clause ) ( "AS" Column_Alias )? Expression ::= Simple_Expression ( Operator Simple_Expression )* 103 Die Grammatik von SQLSF Simple_Expression ::= Literal | Function_Expression | ( Tuple_Alias "." )? Attribute_Name Literal ::= Number | String Number ::= (["0"-"9"])+ ("." (["0"-"9"])+ )? String ::= "’" ( ~["’"] )* "’" Function_Expression ::= Function_Name "(" Expression ( "," Expression )* ")" Function_Name ::= Identifier Identifier ::= ["A"-"Z","_"] ( ["A"-"Z","_","0"-"9"] )* Tuple_Alias ::= Identifier Attribute_Name ::= Identifier | Substituted_Expression Substituted_Expression ::= "$" "(" Expression ")" Operator ::= "+" | "-" | "*" | "/" | "||" Transform_Clause ::= "TRANSFORM" ( Tuple_Alias "." )? Attribute_Name Using_Directed_Link_Clause Using_Directed_Link_Clause ::= "USING" ( "LEFT" | "RIGHT" ) "LINK" Link_Name Link_Name ::= Identifier Column_Alias ::= Identifier | Substituted_Expression From_Clause ::= "FROM" From_List_Entry ( "," From_List_Entry )* From_List_Entry ::= ( Subquery | ( Schema_Name "." )? Table_Name ) ( Tuple_Alias )? 104 Subquery ::= "(" Query ")" Schema_Name ::= Identifier Table_Name ::= Identifier | Substituted_Expression Where_Clause ::= "WHERE" Condition Condition ::= Disjunctive_Condition ( "AND" Disjunctive_Condition )* Disjunctive_Condition ::= Simple_Condition ( "OR" Simple_Condition )* Simple_Condition ::= ( "NOT" )? Expression Predicate Expression Predicate ::= "<" | ">" | "=" | "<>" | "<=" | ">=" | "LIKE" Join_Clause ::= "JOIN" From_List_Entry ( Tuple_Alias )? ( "ON" Condition | Using_Link_Clause ) Using_Link_Clause ::= "USING" ( ( "LEFT" | "RIGHT" )? "AGGREGATED" )? "LINK" Link_Name Union_Clause ::= "UNION" From_List_Entry ( Tuple_Alias )? Using_Link_Clause Aggregation_Clause ::= "AGGREGATE" ( "BY" Expression ( "," Expression )* | Using_Directed_Link_Clause ) Grouping_Clause ::= "GROUP" "BY" Expression ( "," Expression )* Having_Clause ::= "HAVING" Condition Set_Operator ::= ( "UNION" | "INTERSECT" | "MINUS" ) 105 Die Grammatik von SQLSF DDL_Statement ::= "CREATE" ( "TABLE" | "VIEW" ) New_Relation_Name "AS" Query New_Relation_Name ::= Identifier | Substituted_Expression Register_Statement ::= Register_Link_Clause | Unregister_Link_Clause | Register_CDB_Clause | Unregister_CDB_Clause | Register_Table_Clause | Unregister_Table_Clause Register_Link_Clause ::= "REGISTER" "COMPONENTDBLINK" Link_Name "FOR" CDB_Name "AND" CDB_Name CDB_Name ::= Identifier Unregister_Link_Clause ::= "UNREGISTER" "COMPONENTDBLINK" Link_Name Register_CDB_Clause ::= "COMPONENTDB" CDB_Name "AS" Column_Value_Pair ( "," Column_Value_Pair )* Column_Value_Pair ::= Attribute_Name "=" Identifier Unregister_CDB_Clause ::= "UNREGISTER" "COMPONENTDB" CDB_Name Register_Table_Clause ::= "REGISTER" Table_Type Table_Name "FOR" ( "LEFT" | "RIGHT" ) Link_Name "AS" Column_Value_Pair ( "," Column_Value_Pair )* Table_Type ::= "AGGREGATEDOBJECTTABLE" | "LINKTABLE" | "OBJECTLINKTABLE" | "REFERENCEPOINTSTABLE" | "ATTRIBUTETRANSITIONTABLE" Unregister_Table_Clause ::= "UNREGISTER" Table_Type Table_Name 106 Literaturverzeichnis [Con97] S. Conrad: Föderierte Datenbanksysteme: Konzepte der Datenintegration. Springer-Verlag, 1997. [DPS98] T. Devogele, C. Parent, S. Spaccapietra: On Spatial Database Integration. International Journal of Geographical Information Science 12:4 (1998), 335–352. [EM99] A. Eisenberg, J. Melton: SQL: 1999, formerly known as SQL 3. SIGMOD Record 28:1 (1999), 131–138. [EN00] R. Elmasri, S. B. Navathe: Fundamentals of Database Systems, third edition. Addison-Wesley, 2000. [GMS94] M. Goossens, F. Mittelbach, A. Samarin: The LATEXCompanion. Addison-Wesley Publishing Company, 1994. [JS82] G. Jaeschke, H.-J. Schek: Remarks on the Algebra of Non First Normal Form Relations. In Proceedings of the ACM Symposium on Principles of Database Systems, 1982, 124–138. [KCGS95] W. Kim, I. Choi, S. Gala, M. Scheevel: On Resolving Schematic Heterogeneity in Multidatabase Systems. In Kim [Kim95], 521–550. [Kim95] W. Kim (ed.): Modern Database Systems: The Object Model, Interoperability, and Beyond. ACM Press/Addison-Wesley Publishing Company, 1995. [KLK91] R. Krishnamurthy, W. Litwin, W. Kent: Language Features for Interoperability of Databases with Schematic Discrepancies. In Proceedings of the 1991 ACM SIGMOD International Conference on Management of Data, 1991, 40–49. [Kre04] F. Kreutz: Zuordnung von flächenhaften Objekten bei der Föderierung kartographischer Datenbanken. Diplomarbeit, Universität Hannover, 2004. 107 LITERATURVERZEICHNIS [KS91] W. Kim, J. Seo: Classifying Schematic and Data Heterogeneity in Multidatabase Systems. IEEE Computer 24:12 (1991), 12–18. [Lam94] L. Lamport: LATEX: A Document Preparation System, second edition. Addison-Wesley Publishing Company, 1994. [LAN+ 89] W. Litwin, A. Abdellatif, B. Nicolas, P. Vigier, A. Zeroual: MSQL: A Multidatabase Language. Information Sciences 49:1-3 (1989), 59–101. [Lau98] R. Laurini: Spatial Multi-Database Topological Continuity and Indexing: A Step Towards Seamless GIS Data Interoperability. International Journal of Geographical Information Science 12:4 (1998), 373–402. [LMT04] U. W. Lipeck, D. Mantel, M. Tiedge: Identifikation kartographischer Objekte in föderierten räumlichen Datenbanken. Informatik Berichte DB 01/2004, Institut für Informationssysteme, Universität Hannover, 2004. [Lon04] K. Loney: Oracle Database 10g: The Complete Reference. McGrawHill/Osborne, 2004. [LSS96] L. V. S. Lakshmanan, F. Sadri, I. N. Subramanian: SchemaSQL A Language for Interoperability in Relational Multi-Database Systems. In Proceedings of 22th International Conference on Very Large Data Bases, 1996, 239–250. [LSS99] L. V. S. Lakshmanan, F. Sadri, I. N. Subramanian: On Efficiently Implementing SchemaSQL on an SQL Database System. In Proceedings of 25th International Conference on Very Large Data Bases, 1999, 471–482. [LSS01] L. V. S. Lakshmanan, F. Sadri, I. N. Subramanian: SchemaSQL - An Extension to SQL for Multidatabase Interoperability. ACM Transactions on Database Systems 26:4 (2001), 476–519. [Man02] D. Mantel: Konzeption eines Föderierungsdienstes für geographische Datenbanken. Diplomarbeit, Universität Hannover, 2002. [ML04] D. Mantel, U. W. Lipeck: Datenbankgestütztes Matching von Kartenobjekten. Mitteilungen des Bundesamtes für Kartographie und Geodäsie 31, 2004. [MY95] W. Meng, C. Yu: Query Processing in Multidatabase Systems. In Kim [Kim95], 551–572. 108 LITERATURVERZEICHNIS [OOM87] G. Özsoyoglu, Z. M. Özsoyoglu, V. Matos: Extending Relational Algebra and Relational Calculus with Set-Valued Attributes and Aggregate Functions. ACM Transactions on Database Systems 12:4 (1987), 566–592. [RSV02] P. Rigaux, M. Scholl, A. Voisard: Spatial Databases: With Application to GIS. Morgan Kaufmann Publishers, 2002. [SAW98] M. Sester, K.-H. Anders, V. Walter: Linking Objects of Different Spatial Data Sets by Integration and Aggregation. GeoInformatica 2:4 (1998), 335–358. [SC99] K.-U. Sattler, S. Conrad: Konfliktbehandlung in einer Anfragesprache für Datenbankföderationen. In Workshop Föderierte Datenbanken, 1999, 144–157. [SCS00] K.-U. Sattler, S. Conrad, G. Saake: Adding Conflict Resolution Features to a Query Language for Database Federations. In Proceedings of the 3rd Workshop EFIS, 2000, 41–52. [SCS03] K.-U. Sattler, S. Conrad, G. Saake: Interactive Example-Driven Integration and Reconciliation for Accessing Database Federations. Information Systems 28:5 (2003), 393–414. [SL90] A. P. Sheth, J. A. Larson: Federated Database Systems for Managing Distributed, Heterogeneous, and Autonomous Databases. ACM Computing Surveys 22:3 (1990), 183–236. [SMW04] M. Skulschus, S. Michaelis, M. Wiederstein: Oracle 10g Programmierhandbuch. Galileo Press, 2004. [SPD92] S. Spaccapietra, C. Parent, Y. Dupont: Model Independent Assertions for Integration of Heterogeneous Schemas. The VLDB Journal 1 (1992), 81–126. [WG01] C. M. Wyss, D. V. Gucht: A Relational Algebra for Data/Metadata Integration in a Federated Database System. In Proceedings of the 2001 ACM International Conference on Information and Knowledge Management, 2001, 65–72. [WR05] C. M. Wyss, E. L. Robertson: Relational Languages for Metadata Integration. ACM Transactions on Database Systems 30:2 (2005), 624–660. [YM98] C. T. Yu, W. Meng: Principles of Database Query Processing for Advanced Applications. Morgan Kaufmann Publishers, 1998. 109 Erklärung Hiermit versichere ich, Hendrik Warneke, die vorliegende Masterarbeit ohne fremde Hilfe und nur unter Verwendung der von mir aufgeführten Quellen und Hilfsmittel angefertigt zu haben. Hannover, 26. April 2006.