DBIS - Humboldt-Universität zu Berlin

Werbung
Humboldt-Universität zu Berlin
Institut für Informatik
Datenbankentwurf für kartographische Informationen
mit Unterstützung verschiedener Anwendungsfelder
Studienarbeit von Ralf Heese
Juni 2001
Betreuer: Dr. Rainer Conrad
Inhaltsverzeichnis
1 Einleitung
1
2 Einführung in das GDF-Format
2.1 Allgemeines Referenzmodell . . . .
2.2 Das GDF-Dateiformat . . . . . . .
2.2.1 Logische Struktur . . . . . .
2.2.2 Physische Struktur . . . . .
2.2.3 Verlinken von Datenrekords
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Entwicklung des Datenbankschemas
3.1 Anforderungsanalyse . . . . . . . . . . .
3.2 Konzeptioneller Datenbankentwurf . . .
3.3 Logischer Datenbankentwurf . . . . . . .
3.3.1 Strukturierung der Datenbank . .
3.3.2 Data Definition Language . . . .
3.4 Physischer Datenbankentwurf . . . . . .
3.4.1 Tabellenbereiche und Pufferpools
3.4.2 Räumlicher Index . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4 Einlesen einer GDF-Datei in die Datenbank
4.1 Vorbereiten der Datenbank . . . . . . . . . . .
4.2 Konzepte zum Füllen von Datenbanktabellen .
4.3 Verarbeitung einer GDF-Datei . . . . . . . . .
4.3.1 Struktur . . . . . . . . . . . . . . . . .
4.3.2 Funktionsweise des Scanners . . . . . .
4.3.3 Funktionsweise des Parsers . . . . . . .
4.4 Vorgehen beim Einlesen der Koordinaten . . .
4.5 Laden der DEL-Dateien . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
5
8
10
14
15
.
.
.
.
.
.
.
.
16
16
19
22
23
23
29
29
31
.
.
.
.
.
.
.
.
34
34
37
39
39
40
42
43
47
5 Zusammenfassung und Auswertung
49
5.1 Fortführung der Studienarbeit . . . . . . . . . . . . . . . . . . 50
i
ii
INHALTSVERZEICHNIS
A Das
A.1
A.2
A.3
Entity Relationship Modell
Entity und Entity-Typ . . . . . . .
Attribut und Attributtyp . . . . . .
Beziehung und Beziehungstyp . . .
A.3.1 Grad . . . . . . . . . . . . .
A.3.2 Kardinalität . . . . . . . . .
A.3.3 Totalität . . . . . . . . . . .
A.4 Spezialisierung und Generalisierung
B Data Definition Language
B.1 Einzigartige Datentypen .
B.2 Tabellen . . . . . . . . . .
B.2.1 Metadatentabellen
B.2.2 Datentabellen . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
52
52
52
53
53
53
53
54
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
55
55
55
56
57
Tabellenverzeichnis
2.1 Rekordtypen (Auszug) . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Spezifikation Koordinaten-Rekord . . . . . . . . . . . . . . . . 11
2.3 Struktur des GDF-Dateiformats . . . . . . . . . . . . . . . . . 13
3.1
Definierte eizigartige Datentypen . . . . . . . . . . . . . . . . 26
4.1
Werte für die Systemvariablen . . . . . . . . . . . . . . . . . . 35
A.1 Interpretation der Kardinalitäten . . . . . . . . . . . . . . . . 54
iii
Abbildungsverzeichnis
1.1
Kontext des Systems . . . . . . . . . . . . . . . . . . . . . . .
3
2.1
Allgemeines Referenzmodell (vereinfacht) . . . . . . . . . . . .
9
3.1
3.2
3.3
3.4
3.5
Datenbankschema (Teil 1) . . . . . . . . . . .
Datenbankschema (Teil 2) . . . . . . . . . . .
Aufteilung der Datenbank . . . . . . . . . . .
Datentypen des Spatial Extender (Ausschnitt)
Gitterindex . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
21
22
23
28
32
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
Vorbereitung der Datenbank (vereinfacht) . . . . . .
Datenfluss beim IMPORT-Befehl/LOAD-Hilfsprogramms
Komponenten des Einleseprogramms . . . . . . . . .
Einlesen einer logischen Zeilen . . . . . . . . . . . . .
Auslesen von Datenfeldern aus einer logischen Zeile .
Parsen eines Knotenrekords . . . . . . . . . . . . . .
Polygon in der GDF-Datei . . . . . . . . . . . . . . .
resultierendes Polygon in der Datenbank . . . . . . .
Einlesen der DEL-Dateien . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
36
38
40
41
42
44
47
47
48
A.1
A.2
A.3
A.4
Entity-Typ . . . . . . . . . . . . .
Attributtypen . . . . . . . . . . . .
Beziehungstyp . . . . . . . . . . . .
Spezialisierung und Generalisierung
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
52
53
53
54
iv
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Kapitel 1
Einleitung
Ein computergestütztes Geo-Informationssystem (GIS) bezeichnet ein Computersystem zur Erfassung, Verwaltung, Manipulation, Analyse und Visualisierung von kartographischen Daten [Kin01]. Wichtige Komponenten eines
GIS sind Hardware, Software und Daten. Hardware bezeichnet in diesem Zusammenhang den Computer, auf dem das GIS operiert. Die Software umfasst
die Werkzeuge, mit denen kartographische Daten verarbeitet werden. Hierzu
zählen unter anderem Datenbankmanagementsysteme (DBMS), Visualisierungswerkzeuge sowie Werkzeuge zur Analyse und Manipulation. Die wohl
wichtigste Komponente in einem GIS sind die Daten. GIS beschränken sich
nicht nur auf die Koordinaten räumlicher Objekte, sondern integrieren auch
zusätzliche mit den Orten verbundene Daten.[ESR98]
GIS bilden eine Grundlage unter anderem für Planungs- und Verwaltungsaufgaben und ermöglichen die Analyse des Zusammenspiels unterschiedlicher
Arten von Informationen basierend auf deren geographischen Position. Wie
bereits oben angedeutet, gehören zu den Aufgaben eines GIS
• die Konvertierung der Daten von Karten in ein digitales Format.
• die Transformation bzw. Manipulation der Daten. Dies kann zum Beispiel eine kurzzeitige Transformation zur Darstellung eines Kartenausschnitts sein.
• die Speicherung der Daten in Dateien (flat file) oder mit Hilfe eines
Datenbankmanagementsystems in einer Datenbank.
• die Analyse von Daten und die Beantwortung von Anfragen. Hauptziele dabei sind das Finden von passenden Gebieten zu gegebenen Fakten (z. B. zur Planung von Flughäfen) und das Erfragen spezieller Eigenschaften einer geographischen Lokalität (z. B. Verkehrsdichte einer
Straße).
1
2
KAPITEL 1. EINLEITUNG
• die Visualisierung als Karte oder Graph.
DBMS sind auf die Speicherung und Verwaltung großer Datenbestände
optimiert und werden darum immer häufiger als Datenquelle für die unterschiedlichen Werkzeuge eingesetzt. Nicht zuletzt die Entwicklung spezieller
Erweiterungen für die Verarbeitung räumlicher Daten unterstützt diese Tendenz. Da im Allgemeinen die zu verarbeitenden Daten in unterschiedlichen
Datenformaten vorliegen, ermöglicht die Verwendung eines DBMS nicht nur
eine einfache Speicherung und Organisation der Daten, sondern es wird durch
eine Integration dieser verschiedenen Datenquellen in eine Datenbank ein
datenformatunabhängiger Zugriff erreicht. Weiterhin unterscheiden sich die
Datenquellen im Transportmedium; statische1 Daten werden meistens mittels Datenträger wie zum Beispiel CD oder Band transportiert, wohingegen
dynamische Daten einfacher via Internet bezogen werden. Ein Datenbanksystem gestattet als lokaler Zwischenspeicher den Zugriff auf alle Datenquellen
unabhängig vom Transportmedium.
Diese Studienarbeit entstand im Rahmen eines Kooperationsabkommens
zwischen dem Lehrstuhl für Datenbanken und Informationssysteme am Institut für Informatik der Humboldt-Universität zu Berlin und der Firma Vivatech Software Berlin GmbH, die unter anderem Software zur Visualisierung
von kartographischen Daten konzipiert. Das Ziel ist die Entwicklung eines
datenbankgestützten Geo-Informationssystem zur performanten Verwaltung
kartographischer Daten sowie die effiziente Beantwortung von Anfragen. Dabei steht eine Integration unterschiedlicher Datenquellen im Vordergrund.
Der schematische Aufbau eines solchen Systems ist in Abbildung 1.1 veranschaulicht. Die Grundlage dieses System bilden statische (GDF, Höhendaten, Satellitenbilder usw.) und dynamische Daten (Verkehrsdaten, Wetterdaten usw.), die durch Datenbanken bereitgestellt werden. Vorhandene
Applikationen zur Visualisierung wie zum Beispiel 2D- und 3D-Renderer fordern zur Verarbeitung Daten für Kartenausschnitte aus der Datenbank an.
Hierbei ist eine Zusammenführung unterschiedlicher Datenquellen notwendig, um die vom Nutzer gewünschten Informationen als Ganzes präsentieren
zu können.
Die Grundlage dieser datenbankgestützten Lösung bildet der konzeptionelle Entwurf eines Datenbankschemas zur Verwaltung der im GDF-Format
vorliegenden kartographischen Daten. Dabei soll der Entwurf die effiziente
Beantwortung typischer Anfragen gewährleisten. Neben dem eigentlichen Datenbankentwurf steht auch die Entwicklung und Implementierung eines effizi1
Hierbei beziehen sich die Begriffe statisch“ und dynamisch“ auf die Häufigkeit der
”
”
durchgeführten Aktualisierungen.
3
Applikationen
statische
Daten
GDF
Höhen− sonstige
daten
Bilder
integriertes
Datenbankschema
Satelliten− Points of
bilder
Interest
dynamische
Daten
Verkehrs−
daten
Wetter−
daten
Points of
Interest
Abbildung 1.1: Kontext des Systems
enten Tools zum Einlesen einer GDF-Datei in eine Datenbank im Mittelpunkt
der Betrachtungen. Im Anschluss wird das entwickelte Modell bezüglich eines
konkreten Datenbankmanagementsystems physisch umgesetzt, mit kartographischen Daten gefüllt und das bis dahin entstandene System bewertet.
Im folgenden Abschnitt werden die bisherigen Vorgehensweisen für die
Verarbeitung der Daten skizziert. Die Firma Vivatech Software Berlin GmbH
verwendet für die Berechnung von 2D- und 3D-Darstellungen eines Kartenausschnittes unter anderem geographische Daten, die als Dateien im GDF
Format vorliegen. Für die Verarbeitung und den Zugriff der Daten wurden
bisher eigene Routinen in Java implementiert, die zunächst die GDF-Dateien
entsprechend der unterschiedlichen Daten sortiert in den Hauptspeicher einlasen. Die Nachbildung gewisser Funktionalitäten eines Datenbankmanagementsystems — zum Beispiel wurden Joins manuell durchgeführt — erlaubte
eine schnelle Filterung der Daten unter bestimmten Gesichtspunkten.
Durch diese individuelle Lösung ist jedoch eine Integration anderer Datenquellen oder Datenformate nur durch Erweiterung des bestehenden oder
Hinzufügen neuen Quellcodes möglich. Gerade die Integration zusätzlicher
Datenquellen wie zum Beispiel Wetter- oder Verkehrsdaten erhöht die Attraktivität und den Mehrwert einer Visualisierung von Kartenausschnitten.
Weiterhin sind Anfragen an die Datenbasis nur in dem Umfang möglich,
wie sie durch die Implementation der Zugriffsroutinen vorgegeben sind. Die
Verwendung des Hauptspeichers als Medium zum Vorhalten der kartographi-
4
KAPITEL 1. EINLEITUNG
schen Daten beschränkt aufgrund des großen Speicherbedarfs die Nutzbarkeit eines solchen Systems. Letztendlich konnte somit nur auf einem kleinen
Ausschnitt der Daten operiert werden.
Der Inhalt der einzelnen Kapitel dieser Studienarbeit wird im Folgenden kurz erläutert. Kapitel zwei gibt zunächst eine Einführung in das GDFFormat, in dem die zu verarbeitenden Daten vorliegen. Zum Verständnis des
Formats und der inneren Zusammenhänge wichtige Begriffe werden zusammenfassend erklärt und anhand von Beispielen illustriert. Des Weiteren wird
auf den konzeptionellen Aufbau und die physische Speicherung einer GDFDatei eingegangen.
Das dritte Kapitel konzentriert sich vor allem auf den Entwicklungsprozess des Datenbankschemas. Nach der Abgrenzung des Problemraumes wird
das entwickelte Datenbankschema vorgestellt und die Realisierung bezüglich
des Datenbankmanagementsystems DB2 Universal Database Version 7.1 mit
der Erweiterung DB2 Spatial Extender diskutiert. Neuerungen dieses DBMS
sind die strukturierten Datentypen und typisierten Tabellen. Eine Realisierung unter Einbeziehung der Neuerungen wird der üblichen relationalen Vorgehensweise gegenübergestellt.
Im Kapitel vier werden prinzipielle Konzepte zur Übertragung der Daten
aus einer GDF-Datei in eine Datenbank beschrieben. Diese Konzepte befassen sich hauptsächlich mit DB2 UDB V7.1, sind jedoch auch in den meisten
anderen DBMS umsetzbar. Zu diesem Zweck wurden Werkzeuge entworfen
und implementiert, die den Transfer der Daten aus GDF-Dateien in die Datenbank unterstützen. Nachdem die Komponenten und die Funktionsweise
der Werkzeuge erläutert wurde, werden spezielle Probleme der vorliegenden
räumlichen Daten und deren Lösung veranschaulicht.
Kapitel 2
Einführung in das Geographic
Data File Format
Der Geographic Data File Standard [GDF95] wurde 1995 dem European
Committee for Standardization zur Begutachtung vorgelegt. Entwickelt wurde der Standard für Firmen und Organisationen, die effizient Daten eines
Straßenverkehrsnetz sammeln, verwalten und produzieren müssen. Der Standard bietet ein allgemeines Referenzmodell, auf das sich sowohl Produzent
als auch Nutzer bei der Entwicklung ihrer Applikation stützen können. Auf
Grundlage dieses Modells wurde auch ein Datenaustauschformat definiert,
um Kompatibilitätsprobleme zu minimieren. Weiterhin beschreibt der Standard, wie darin gespeicherte Daten dargestellt und Metainformationen (z. B.
Qualität der Daten) definiert werden.
In diesem Kapitel werden alle zum Verständnis notwendigen Aspekte des
GDF-Standards näher betrachtet.
2.1
Allgemeines Referenzmodell
Zum Verständnis des Modells werden zunächst einige Begriffe, die im Zusammenhang mit dem GDF-Standard stehen, definiert und soweit möglich
anhand von Beispielen veranschaulicht. Die folgenden Definitionen basieren
auf denen in [GDF95].
Definition 2.1 (Feature) Ein Feature (feature1 ) ist die Datenbankdarstellung eines Objektes der realen Welt.
1
In Klammern steht immer die Bezeichnung, wie sie im Englischen verwendet wird.
5
6
KAPITEL 2. EINFÜHRUNG IN DAS GDF-FORMAT
Der Begriff Feature ist dabei nicht wie im Deutschen üblich als Eigenschaft
oder Merkmal zu verstehen, sondern vielmehr als eine Sammlung (i.S. von
Tupel) von Eigenschaften eines Objektes der realen Welt.
Ein Feature kann zum Beispiel die (bestimmte) Berliner Straße, das Sony
Center oder der Bezirk Wedding in Berlin sein. Jedes Feature gehört einer
Feature-Klasse an.
Definition 2.2 (Feature-Klasse) Eine Feature-Klasse (feature class) bezeichnet den Oberbegriff von Feature. Jeder Feature-Klasse ist ein eineindeutiger vierstelliger numerischer Code zugeordnet.
Zum Beispiel können die Berliner Straße, die Frankfurter Allee und die
Rudower Chaussee dem allgemeinen Begriff Straße oder die Bezirke Wedding,
Reinickendorf und Mitte dem Begriff Bezirk zugeordnet werden.
Eine weitere Gruppierung stellen die Feature-Themen dar.
Definition 2.3 (Feature-Thema) In einem Feature-Thema (feature theme) werden gleichartige Feature-Klassen zusammengefasst. Jedem FeatureThema wird ein eineindeutiger zweistelliger numerischer Code zugeordnet.
Betrachtet man beispielsweise Straßen, Kreuzungen oder Fährverbindungen, so werden diese zu dem Feature-Thema Straßen und Fährverbindungen (Roads and Ferries) zusammengefasst. Als ein weiteres Beispiel werden
Länder, Bezirke, Gemeinden, usw. dem Feature-Thema Verwaltungsgebiete
(Administrative Areas) zugeordnet.
Mit Hilfe des GDF-Standard kann, wie oben angedeutet, auch die graphische Repräsentation eines Features verwaltet und gespeichert werden.
Definition 2.4 (Feature-Kategorie) Eine Feature-Kategorie (feature category) ist die Darstellungsform eines Features. Jeder Feature-Kategorie wird
ein eineindeutiger einstelliger numerischer Code zugeordnet.
Es gibt insgesamt vier verschiedene Repräsentationsformen: Punkt, Linienzug, Gebiet und komplex (point, line, area und complex). In diese vier
Gruppen lassen sich auch die Feature unterteilen (vgl. S. 9, Abb. 2.1), d.h.
es gibt Punkt-, Linienzug- und Gebiet-Feature, dies sind die so genannten
simplen Feature, und es gibt die komplexen Feature. Komplexe Feature sind
dabei entweder aus simplen Feature oder aus komplexen Feature selbst zusammengesetzt. Eine Kombination von simplen und komplexen Feature zu
einem komplexen Feature ist nicht erlaubt.
Ein Feature besitzt im Allgemeinen noch weitere Eigenschaften.
2.1. ALLGEMEINES REFERENZMODELL
7
Definition 2.5 (Attribut) Ein Attribut (Attribute) ist eine Eigenschaft
eines Features. Jedem Attribut wird ein eineindeutiger zweistelliger alphanumerischer Code zugeordnet.
Eine Eigenschaft kann zum Beispiel die Bezeichnung eines Features in der
realen Welt sein, die Anzahl der Spuren einer Straße oder die Telefonnummer
einer Tankstelle.
Wenn eine Eigenschaft eines Features weitere Features einbezieht, so wird
dies mit Hilfe von semantischen Beziehungen realisiert.
Definition 2.6 (semantische Beziehung) Eine semantische Beziehung
(semantic relationship) ist eine Eigenschaft eines Features in der andere Features involviert sind. Jeder semantischen Beziehung wird ein eineindeutiger
vierstelliger numerischer Code zugeordnet.
Eine solche semantische Beziehung (kurz Beziehung) könnte zum Beispiel
beschreiben, dass sich das Sony Center auf dem Potsdamer Platz befindet,
wobei das Sony Center und der Potsdamer Platz als Features anzusehen sind.
Die folgenden Definitionen beschreiben die Basiselemente für die Repräsentation von Punkt-, Linienzug- und Gebiet-Feature.
Definition 2.7 (Knoten) Ein Knoten (node) ist ein null-dimensionales
Element, das der Schnittpunkt von zwei oder mehr Linien, der Endpunkt
einer Linie oder ein einzelner isolierter Punkt ist.
Definition 2.8 (Linie) Eine Linie (edge) ist eine Folge von sich nicht
schneidenden Kanten. An jedem Ende einer Linie befindet sich ein Knoten.
Das Wort edge bedeutet eigentlich Kante; dieser Begriff wird in der Informatik überwiegend als geradlinige Verbindung zweier Knoten im Zusammenhang mit Graphen verwendet. Aber im GDF-Standard handelt es sich
eigentlich um mehrere Kanten die zu einer edge zusammengesetzt werden,
d.h., es ist ein Linienzug. Da der Begriff Linienzug bereits für eine FeatureKategorie vergeben wurde, erscheint die Bezeichnung Linie als angemessen.
Definition 2.9 (Fläche) Eine Fläche (face) ist ein (abgeschlossenes) zweidimensionales Element, das durch eine Menge von Linien begrenzt wird. Innerhalb einer Fläche dürfen sich null oder mehr sich nicht schneidende, geschlossene Mengen von Linien befinden.
Diese inneren Flächen werden als Ringe oder Löcher bezeichnet.
8
KAPITEL 2. EINFÜHRUNG IN DAS GDF-FORMAT
Die eigentliche Fläche berechnet sich also aus der Grundfläche abzüglich
ihrer Löcher. Bei der Beschreibung der Fläche werden die Koordinaten der
Grundfläche im Uhrzeigersinn und die Koordinaten der Löcher entgegen dem
Uhrzeigersinn notiert.
Die Zusammenhänge zwischen den oben definierten Begriffen werden in
Abbildung 2.1 veranschaulicht. Um die Übersichtlichkeit zu erhalten, sind in
diesem Bild keine Attribute eingetragen. Hinweise zur Interpretation eines
ER-Schemas finden sich im Anhang A.
Der Entity-Typ Feature steht im Zentrum des allgemeinen Referenzmodells. Dem Feature werden dabei Attribute, Beziehungen, genau eine FeatureKlasse und genau eine Feature-Kategorie zugeordnet.
Der GDF-Standard lässt für die Kardinalität bei der Beziehung zwischen Feature-Klasse und Feature-Kategorie die zwei Möglichkeiten ’1’ und
’N’ zu (vgl. Abb. 2.1). Die Wahl der Variante bleibt dem Produzenten der
GDF-Datei überlassen. Zum einen kann festgelegt werden, dass Feature einer Feature-Klasse genau auf eine Art und Weise dargestellt werden, zum
anderen können Feature einer Feature-Klasse unterschiedliche Darstellungsformen annehmen. Ein Beispiel für die erste Variante ist, dass alle Feature
der Feature-Klasse Service durch einen Punkt dargestellt werden müssen.
Unter Benutzung der zweiten Variante könnte die Darstellung einer Brücke
als Punkt- oder auch als Gebiet-Feature erlaubt sein. Eine Feature-Klasse ist
wiederum genau einem Feature-Thema zugeordnet.
In der Abbildung 2.1 ist zu erkennen, dass ein Punkt-Feature durch genau einen Knoten, Linienzug-Feature durch Linien und Gebiet-Feature durch
Flächen repräsentiert werden. Zur Vereinfachung der Darstellung wurden
einige Beziehungen zwischen Knoten, Linie und Fläche weggelassen. Diese
Beziehungen geben die in den Definitionen 2.8 und 2.9 gemachten Zusammenhänge wieder: an jedem Ende einer Linie befindet sich ein Knoten und
eine Fläche wird von einer Menge von Linien begrenzt.
2.2
Das GDF-Dateiformat
In einer GDF-Datei werden alle für die Repräsentation eines Kartenausschnitts notwendigen Daten wie Koordinaten, Attribute, Qualität gespeichert. Das Format reflektiert das allgemeine Referenzmodell und dient vor
allem dem Austausch der Daten zwischen unterschiedlichen Anwendungen,
z. B. zwischen Produzent und Nutzer.
Bei der Beschreibung der Struktur einer GDF-Datei wird zwischen logischer und physischer Struktur unterschieden. Die logische Struktur beschreibt
den grundsätzlichen Aufbau einer GDF-Datei, d.h. aus welchen Bestandteilen
2.2. DAS GDF-DATEIFORMAT
9
Feature
Thema
1
besteht
aus
M
M
Feature
Klasse
dargest.
durch
gehört
zu
besteht
aus
M
beteiligt
an
M
M
N
semantische
Beziehung
M
M
komplexes
Feature
Feature
Kategorie
1
1
Feature
1/N
M
N
besitzt
besteht
aus
N
N
Attribut
simples
Feature
besteht
aus
Punkt
Feature
M
repräsent
durch
Linienzug
Feature
M
repräsent
durch
Gebiet
Feature
M
repräsent
durch
1
N
N
Knoten
Linie
Fläche
Abbildung 2.1: Allgemeines Referenzmodell (vereinfacht)
10
KAPITEL 2. EINFÜHRUNG IN DAS GDF-FORMAT
eine Datei zusammengesetzt ist. Bei der physischen Struktur handelt es sich
um die Spezifikation, wie die logischen Strukturelemente in einer Datei physisch abgespeichert werden. Dieser Abschnitt dient dem besseren Verständnis
des Programms zum Einlesen einer GDF-Datei in die Datenbank.
2.2.1
Logische Struktur
Im Folgenden soll zunächst nur der grundsätzlich Aufbau einer GDF-Datei
besprochen werden, ohne dabei auf die Belange einer adäquaten Speicherung
auf einem Sekundärspeicher einzugehen.
Eine GDF-Datei besteht aus einer Folge von logischen Rekords2 , die alle
im GDF-Standard vorgesehenen Daten beinhalten können. Ein logischer Rekord wird in Datenfelder aufgeteilt, die durch Position und Länge bestimmt
sind. Das wichtigste Datenfeld bilden die ersten beiden Zeichen, das den Rekordtyp bestimmt und damit erst eine Interpretation der folgenden Zeichen
als Datenfelder ermöglicht.
In Tabelle 2.1 sind die wichtigsten Rekordtypen aufgelistet. Die übrigen
sind für das Verständnis dieser Studienarbeit nicht notwendig und können
gegebenenfalls in [GDF95] nachgeschlagen werden. Die erste Spalte in der
Tabelle gibt hierbei die Kodierung des Rekordtyps an, die darauffolgende
enthält die Bezeichnung des Rekords wie sie im GDF-Standard verwendet
wird und die letzte beschreibt den Zweck in einer GDF-Datei.
Anhand des Beispiels des Koordinaten-Rekords soll die Definition eines
logischen Rekords verdeutlicht werden. In Tabelle 2.2 ist auszugsweise die
Spezifikation des Koordinaten-Rekords dargestellt.
Wie bereits oben beschrieben, kodieren die ersten beiden Zeichen (hier
’23’) den Rekordtyp. Die nächsten zehn Zeichen gehören zur KoordinatenID, das darauf folgende Zeichen bezeichnet den Geometrietypcode usw. Ist
an der Stelle für die Größe ein ’*’ eingetragen, so darf dieses Datenfeld theoretisch3 unbegrenzt lang sein. Daneben in der Spalte Typ ist der zugehörige
Datentyp spezifiziert, z. B. ’N’ für numerisch. Die nächste Spalte entscheidet
darüber, ob das Datenfeld leer (NULL-Wert) gelassen werden darf, wobei
’Obl’ für obligatorisch und ’<S>’ für optional steht. Handelt es sich um ein
ungenutztes optionales Datenfeld, so muss dieses mit Leerzeichen aufgefüllt
werden. Im GDF-Standard ist festgelegt, dass numerische Werte rechtsbündig
und Text linksbündig einzutragen sind.
Eine besondere Bedeutung hat das Datenfeld ’NUM COORD’. Dieses
Feld gibt an, wie oft die darauf folgenden Datenfelder, die mit einem senk2
3
Im Gegensatz zu physischen Rekords, die weiter unten erläutert werden.
In der Realität gibt es natürlich Grenzen, z. B. durch das Speichermedium.
2.2. DAS GDF-DATEIFORMAT
Code
00
01
02
16
17
90
99
23
24
25
29
41
44
50
51
52
53
54
Name
Bedeutung
allgemeine Rekordtypen
Continuation Record
Fortsetzungsrekord
Volume Header Record
Leitet Volume ein
Dataset Header Record
Leitet Dataset ein
Section Header Record
Leitet Section ein
Layer Header Record
Leitet Layer ein
Comment Record
Ermöglicht Kommentare
Volume Termination Record Beendet Volume
Datenrekords
Coordinates Record
für Koordinaten
Edge Record
für eine Linie
New Node Record
für einen Knoten
Face Record
für eine Fläche
Name Record
für einen Namen
Segmented Attribute Record für Attribute
Relationship Record
für eine Beziehung
Point Feature Record
für einen Punkt
Line Feature Record
für einen Linienzug
Area Feature Record
für ein Gebiet
Complex Feature Record
für ein komplexes Feature
Tabelle 2.1: Rekordtypen (Auszug) [GDF95]
Datenfeld
Größe Typ NULL Beschreibung
REC DESCR
2
N
Obl
Rekordtypcode (23)
XYZ ID
10
N
<S>
Koordinaten ID
G TYPE
1
N
<S>
Geometrietypcode
Q PLAN
2
I
<S>
Qualitätscode
DESC ID
5
N
<S>
Quellen ID
NUM COORD
5
N
Obl
Datenfeldzähler
| X COORD
10
I
<S>
X-Koordinate
| Y COORD
10
I
<S>
Y-Koordinate
| Z COORD
10
I
<S>
Z-Koordinate
Tabelle 2.2: Spezifikation Koordinaten-Rekord
11
12
KAPITEL 2. EINFÜHRUNG IN DAS GDF-FORMAT
rechten Strich gekennzeichnet sind, wiederholt werden. Wenn zum Beispiel
im Koordinaten-Rekord im Datenfeld ’NUM COORD’ eine drei steht, so
bedeutet dies, dass drei Koordinatentripel bestehend aus den Datenfelder
’X COORD’, ’Y COORD’ und ’Z COORD’ vorhanden sind.
Das Beispiel 2.1 zeigt eine Instanziierung eines Koordinaten-Rekords mit
der ID ’8000151’ und zwei Koordinatentripeln. Insbesondere sind hier die mit
Leerzeichen ( ) aufgefüllten Z-Koordinaten zu erkennen. Wegen der besseren
Lesbarkeit wurde der Rekord auf zwei Zeilen verteilt, es handelt sich jedoch
um eine einzelne.
Beispiel 2.1 (logischer Rekord)
23
8000151
3 13318186 52520401
13326591 52526318
13318760 52522824
Nachdem nun der Aufbau der einzelnen Rekords erläutert wurde, wird die
Anordnung der Rekords in der GDF-Datei selbst besprochen. Der generelle
Aufbau einer GDF-Datei ist in Tabelle 2.3 veranschaulicht. Dabei bedeuten
die geschweiften Klammern, dass diese Teile Null oder mehr Mal auftreten
dürfen.
Eine GDF-Datei beginnt grundsätzlich mit einem Volume Header, in
dem allgemeine Informationen wie Hersteller, Erstellungsdatum, verwendeter Standard gespeichert werden. Ein Volume bildet die kleinste physisch
speicherbare Einheit, d.h., ein Volume darf nicht auf mehrere Datenträger
verteilt werden. Mehrere zusammengehörige Volumes werden zu einem Album zusammengefasst. Ein Volume wird explizit mit dem Volume Termination-Rekord beendet.
Das Dataset Level bildet die nächste Ebene in der logischen Struktur. Ein
Dataset ist eine große Menge Daten, die ein geographisches Gebiet abdecken
[GDF95]. Ein Volume kann in Abhängigkeit von der Größe der Datasets mehrere enthalten. Ein Dataset Level wird durch Dataset Header-Rekords eingeleitet, die unter anderem einen eindeutigen Identifikator des Datasets aufnehmen. Darauf können die Definitionen für eigene Datenfelder, Rekords, Features und Attribute folgen. Weiterhin sind Qualitäts- und Quellenangaben
sowie geographische Spezifikationen, z. B. Erdmagnetfeld, möglich. Ein Dataset endet mit dem Beginn des nächsten oder mit dem Volume TerminationRekord.
Auf Grundlage der Koordinaten werden aus einem Dataset Untermengen
gebildet, die Section genannt werden, und bilden die nächste Ebene. Eine
Section beginnt mit Section Header-Rekords, die einen eindeutigen Identifikator der Section enthält. Weitere für die Verarbeitung wichtige Informationen
wie Faktoren, Offsets oder Maximal- und Minimal-Koordinatenwerte werden
2.2. DAS GDF-DATEIFORMAT
Volume Level Dataset Level
Volume Header
{
Dataset Header
Definitionen
Qualitätangaben
Quellenangaben
geogr. Infos
13
Section Level
Layer Level
{
Section Header
{
Layer Header
Koordinaten
Knoten
Linien
Flächen
Punkt-Features
Linienzug-Features
Gebiet-Features
komplexe Features
Attribute
}
Beziehungen
Namen
Attribute
}
}
Volume Term.
Tabelle 2.3: Struktur des GDF-Dateiformats (vereinfacht)[GDF95]
14
KAPITEL 2. EINFÜHRUNG IN DAS GDF-FORMAT
durch den Section Header zur Verfügung gestellt. In diesem Level stehen auch
Rekords für die Namen, Beziehungen und Attribute. Das Ende einer Section ist durch den Beginn der nächsten Section (neue Section-ID) bzw. dem
nächsten Dataset oder dem Volume Termination-Rekord gekennzeichnet.
Die unterste Ebene bildet das Layer Level. Ein Layer ist eine auf Grund
inhaltlicher Informationen gebildete Untermenge einer Section. In dem Header eines Layers können vor allem Genauigkeitsangaben für die Koordinaten
gemacht werden. Die Layer-Ebene dient der Aufnahme der eigentlichen Datenrekords, z. B. Koordination, Knoten, usw. Ein Layer endet mit dem Beginn des nächsten. Der letzte Layer ist durch das Auftreten eines Conversion-,
Semantic Relationship-, Section Header-, Dataset oder Volume TerminationRekord markiert. Eine wichtige Restriktion für die Koordinaten bezüglich
eines Layers ist, dass die räumlichen Objekte einen planaren Graphen bilden. D.h., der Schnittpunkt zweier oder mehr Linien ist ein Knoten und
gehört zu dem Layer, dem die Linien angehören.
Innerhalb einer Ebene ist die Reihenfolge der Rekords nicht vorgeschrieben. Das bedeutet, dass nach dem jeweiligen Header-Rekord (Volume, Dataset, Section oder Layer) die unterschiedlichen Rekords in beliebiger Reihenfolge auftreten dürfen. Im GDF-Standard wird jedoch empfohlen die Blöcke
und Rekords in einer definierten Reihenfolge anzuordnen, insbesondere gilt
dieses für die Datenrekords.
2.2.2
Physische Struktur
In diesem Abschnitt wird die physische Speicherung der Datenrekords vorgestellt. Es geht also um die physische Darstellung eines logischen Rekord in
einer GDF-Datei. Die hier vorgestellten Konzepte wirken sich auf das Einlesen einer GDF-Datei aus. Die verwendete Aufteilung von einer logischen
Zeile auf mehrere physische Zeilen und das damit einhergehende Auffüllen
der physischen Zeilen kompliziert das Auslesen von Datenfeldern.
Eine GDF-Datei besteht ausschließlich aus ASCII-Zeichen, wobei die Zeilenlänge genau 80 Zeichen zuzüglich Zeilenumbruch (ein Zeichen bei einer
Unix- und zwei Zeichen bei einer Windowsdatei) beträgt. Eine solche Zeile
bestehend aus 80 Zeichen wird im Folgenden als physische Zeile bezeichnet.
Daraus folgt, dass logische Rekords, die mehr als 80 Zeichen beinhalten,
auf mehrere Zeilen verteilt werden müssen. Zur Kennzeichnung, dass ein logischer Rekord auf der nächsten Zeile fortgesetzt wird, enthält das 80. Zeichen
eine ’1’, sonst eine ’0’. Handelt es sich um eine fortgesetzte Zeile, so beginnt
sie mit zwei Nullen (vgl. Continuation Record in [GDF95]). Der Zeilenumbruch erfolgt immer an einer Stelle, an der zwei Datenfelder des logischen
Rekords aneinander stoßen, so dass ein Datenfeld immer vollständig auf ei-
2.2. DAS GDF-DATEIFORMAT
15
ner physischen Zeile steht. Die restlichen nicht nutzbaren Zeichen werden mit
Leerzeichen aufgefüllt.
Beispiel 2.2 (physischer Rekord)
Dieses Beispiel zeigt die physische Repräsentation von Beispiel 2.1.
23
00
8000151
13318760
3 13318186 52520401
52522824
13326591
52526318
Im Beispiel 2.2 wird das Prinzip des Aufteilens einer zu langen logischen
Zeile deutlich. Da die Z-Koordinate des zweiten Tripels bestehend aus zehn
Leerzeichen nicht mehr auf die Zeile passt, muss eine neue Zeile begonnen
werden. Das bedeutet, das 80. Zeichen der ersten Zeile wird auf ’1’ gesetzt
und es wird ein Continuation Record erzeugt. Die übrigen Werte (die ZKoordinate des zweiten Tripels und das komplette dritte Tripel) werden nun
in die zweite Zeile eingetragen. Würde die logische Zeile nicht in diese zwei
Zeilen hineinpassen, so müsste eine weitere Zeile angefangen werden usw. Das
80. Zeichen der zweiten Zeile ist eine ’0’, um das Ende eines logischen Rekords
anzuzeigen. Es fällt auf, dass jetzt Leerzeichen hinzugekommen sind — die
sechs Leerzeichen am Ende der ersten Zeile und 37 am Ende der zweiten
Zeile. Diese müssen dann beim Auslesen der Daten ignoriert werden.
2.2.3
Verlinken von Datenrekords
Verlinken meint in diesem Zusammenhang die Realisierung der im allgemeinen Referenzmodell (vgl. S. 9, Abb. 2.1) vorgestellten Beziehungen zwischen
den Entities. Diesen Referenzen muss beim späteren Einlesen gefolgt werden,
um einem Feature seine Attribute und Koordinaten zuordnen zu können.
Zu diesem Zweck definiert jede Spezifikation für ein Datenrekord (vgl.
Tab. 2.1 auf Seite 11) ein Datenfeld, das einen zehnstelligen Identifikator
aufnehmen kann. Dieser Identifikator muss für den jeweiligen Rekordtyp eindeutig sein. Zum Beispiel enthält die Spezifikation des Koordinaten-Rekord
(vgl. Tab. 2.2 auf Seite 11) ein Datenfeld ’ID’, das eine für alle KoordinatenRekords eindeutige ID aufnimmt.
Des Weiteren sind in den Rekordspezifikationen Datenfelder eingeführt
worden, die eine solche ID als Referenz4 aufnehmen können. So besitzt zum
Beispiel der Rekordtyp New Node Record ein Datenfeld ’XYZ ID’, dass einen
Koordinaten-Rekord referenziert, d.h., in das Datenfeld ’XYZ ID’ wird die ID
des zugehörigen Koordinaten-Rekords eingetragen. Damit wird die Beziehung
repräsentiert durch zwischen Punkt-Feature und Knoten realisiert.
4
Im Rahmen von einigen Programmiersprachen spricht man dann von Zeigern oder
Pointern.
1
0
Kapitel 3
Entwicklung des
Datenbankschemas
Der Entwicklungsprozess eines Datenbankschemas setzt sich aus mehreren
Teilschritten zusammen [Fre99][Teo94].
Im ersten Arbeitsschritt wird der Problemraum abgegrenzt und beschrieben. Es werden relevante Objekte, ihre Eigenschaften und Beziehungen betrachtet, Transaktionen und Operationen bestimmt, sowie Systemeigenschaften festgelegt. Diese Phase beeinflusst die Qualität der späteren Lösung wesentlich.
Der nächste Arbeitsschritt ist der konzeptionelle Datenbankentwurf, in
dem auf Grundlage der Anforderungen ein Modell in einer Modellbeschreibungssprache (z. B. Entity Relationship Modell, UML) entworfen wird.
Die Abbildung des entworfenen konzeptionellen Schemas in ein konkretes Datenbankmodell bzgl. eines konkreten Datenbankmanagementsystems
(DBMS) kennzeichnet den dritten Arbeitsschritt. Hier wird gegebenenfalls
eine Normalisierung vorgenommen und es können Integritätsbedingungen
eingebracht werden.
Im letzten Arbeitsschritt wird der physische Datenbankentwurf vorgenommen. Hier werden Indizes angelegt und bestimmt, wie und wo die Daten
physisch gespeichert werden.
Dieser Abschnitt beschreibt die Ergebnisse des obigen Entwicklungsprozesses bezogen auf die vorliegende Problemstellung.
3.1
Anforderungsanalyse
Dieser Arbeitsschritt dient der Abgrenzung und Beschreibung des Problemraumes. Hier werden relevante Objekte und ihre Eigenschaften identifiziert
16
3.1. ANFORDERUNGSANALYSE
17
und anschließend Beziehungen zwischen diesen Objekten ermittelt. Größtenteils unterstützt der GDF-Standard die Analysephase, da dort bereits Entities, Attribute und Beziehungen definiert werden. Die Haupttätigkeit in
dieser Phase besteht also im Identifizieren zusätzlich notwendiger Entities,
Attribute und Beziehungen. Eine weitere wichtige Tätigkeit ist das Bestimmen der Transaktionen und Operationen, die auf der Datenbank (besonders
effizient) ausgeführt werden sollen. Andere Aufgaben sind das Festlegen von
Systemeigenschaften wie Performanz, Sicherheit oder die Spezifikation von
Hard- und Software, da diese Erkenntnisse teilweise Einfluss auf das Datenbankmodell haben.
Software und Hardware
In diesem Teil werden nun die Entscheidungen bezüglich Hard- und Software
vorgestellt und begründet. Dabei wird auch auf mögliche Alternativen eingegangen. Inbesondere geht es hier um die Möglichkeiten zur Speicherung und
Verwaltung der räumlichen Objekte.
Als DBMS wird die Software DB2 Universal Database in der Version 7.11
eingesetzt, wobei die Plattform frei wählbar ist. Dieses erweiterbare objektrelationales DBMS erlaubt eine integrierte GIS-Architektur [Fla97].
Eine weitere Überlegung betrifft die Implementierung von Datentypen für
räumliche Objekte und von räumlicher“ Funktionalität, z. B. räumliche In”
dizes, Schnittberechnung von Flächen. Diese räumliche“ Funktionalität ist
”
notwendig, um vor allem die häufig auftretenden Bereichsanfragen in angemessener Zeit beantworten zu können. Als Bereichsanfragen werden Anfragen
der folgenden Art bezeichnet: Gib mir alle räumlichen Objekte, die in dem
durch die Punkte (x1 , y1 ) und (x2 , y2 ) gegebenen Rechteck (Bounding Box)
liegen! Die erste Möglichkeit ist, diese räumliche Funktionalität selbst zu
implementieren bzw. eine vorhandene Implementierung anzupassen. Hierfür
bietet sich zum Beispiel der in [Fla97] beschriebene Ansatz an, der Z-Werte2
für die Indizierung der räumlichen Objekte verwendet. Die räumlichen Datentypen und die dazugehörige Funktionalität wurden als benutzerdefinierte
Datentypen und Funktionen (User Defined Types/User Defined Functions3 )
realisiert. Alternativ lassen sich auch kommerzielle Produkte nutzen wie zum
Beispiel der DB2 Spatial Extender von IBM.
Für eine eigene bzw. die Anpassung einer vorhandenen Implementierung
spricht, dass die Datentypen und Funktionen sehr genau an die Bedürfnisse
adaptiert werden können. Dabei ist die Indizierung mit Hilfe der Z-Ordnung
1
kurz: DB2 UDB V7.1
In [Bar95] wird diese Indizierung auch als Peano-Ordnung oder N-Ordnung bezeichnet.
3
kurz: UDT/UDF
2
18
KAPITEL 3. ENTWICKLUNG DES DATENBANKSCHEMAS
relativ einfach zu realisieren und ist laut [Fla97] für einen schnellen Zugriff
auf räumliche Objekte durchaus geeignet. Dem entgegen steht der zusätzliche
Entwicklungsaufwand; zwar ist durch [Fla97] bereits ein Gerüst gegeben, aber
trotzdem ist eine Portierung von DB2 V5 auf DB2 UDB V7.1 notwendig,
um die neu integrierten objekt-orientierten Konzepte wie z. B. Vererbung
umfassend nutzen zu können.
Die Verwendung eines kommerziellen Produkts bietet zunächst einmal
einen größeren Funktionsumfang, so dass damit auch ein höheres Anfragepotential gegeben ist. Dieser umfasst neben den grundlegenden Operationen wie
z. B. Schnitt und Vereinigung auch weitergehende wie z. B. Transformation
der Koordinaten in andere Koordinatensysteme. Im Allgemeinen ist eine solche Erweiterung fehlerfreier und auch mehr an die entsprechende Datenbank
angepasst, z. B. Optimierung. Des Weiteren erleichtert eine entsprechende
Dokumentation mit Beispielen die Arbeit mit einer solchen Erweiterung. Auf
der anderen Seite kann eine Funktionenflut“ leicht vom eigentlichen Problem
”
ablenken und auch der Installationsaufwand sowie die Einarbeitung in eine
neue Software sind sicherlich nicht zu unterschätzen. Ein für die wirtschaftliche Nutzung wichtiger Punkt sind die dadurch entstehenden Zusatzkosten.
In Absprache mit Vivatech Software Berlin GmbH wurde entschieden, das
kommerzielle Produkt DB2 Spatial Extender von IBM zu benutzen. Somit
steht zunächst der Entwurf des Datenbankschemas und das Einlesen der
GDF-Daten in die Datenbank im Vordergrund.
Diese Entscheidung schränkt gleichzeitig die Auswahl der verwendbaren
Plattformen ein, da es zur Zeit den DB2 Spatial Extender nur für die Plattformen AIX und Windows 2000 gibt.
Zusätzliche Entity-Typen, Attribute und Beziehungen
In diesem Abschnitt wird untersucht, inwieweit das allgemeine Referenzmodell aus dem GDF-Standard zu verändern bzw. zu ergänzen ist, um ein die
Anforderungen erfüllendes Modell zu erhalten. Dazu werden dem allgemeinen
Referenzmodell neue Entity-Typen, Attribute und semantische Beziehungen
hinzugefügt.
Der Entity-Typ Name wurde zu den bereits im GDF-Standard definierten hinzugenommen. Im GDF-Standard werden diese zusammen mit anderen
Eigenschaften eines Features verwaltet, d.h., sie werden mit dem Entity-Typ
Attribut identifiziert. Die Namen unterscheiden sich jedoch von den norma”
len“ Eigenschaften dahingehend, dass hier nicht nur Code-Wert-Paare auftreten, sondern außerdem auch die jeweilige Sprache gespeichert wird (vgl.
Abb. 3.2). Ein weiterer Grund für die Extraktion der Namen ist, dass diese
eine zentrale Rolle in späteren Anwendungen spielen. Nahezu jedes Feature
3.2. KONZEPTIONELLER DATENBANKENTWURF
19
besitzt einen oder mehrere Namen, die als ein wichtiges Erkennungsmerkmal
eines geographischen Objektes auf einer Karte häufig dargestellt werden.
Ein weiterer hinzugefügter Entity-Typ ist Sektion. Die hier verwalteten
Informationen wie Offsets und Faktoren sind für die Interpretation der Koordinaten wesentlich. Dieser Entity-Typ dient später auch der Einschränkung
des Suchraumes — dieses wird in Abschnitt 3.3 näher ausgeführt. Metadaten
über die GDF-Datei wie Erstellungsdatum, Hersteller usw. werden schließlich
in dem Entity-Typ Volume zusammengefasst.
Weitere Entity-Typen für zusätzliche Metainformationen müssen gegebenenfalls noch ergänzt werden.
3.2
Konzeptioneller Datenbankentwurf
Im Folgenden werden die oben zusammengestellten Anforderungen in einem
Entity Relationship4 Schema visualisiert. Das so entstandene Datenschema
dient der Überprüfung auf Richtigkeit und Vollständigkeit. Insbesondere erleichtert so eine kompakte Visualisierung der Anforderungen die Kommunikation mit dem Auftraggeber.
In einem Vektormodell, wie es in diesem Fall vorliegt, sind die Basisobjekte Knoten, Linien(züge) und Flächen. Für die Verwaltung dieser Objekte
existieren bereits unterschiedliche Basisarchitekturen. Zwei davon sind die
Spaghetti- und die topologische Struktur.
Die Spaghetti-Struktur zeichnet sich durch die voneinander unabhängige
Verwaltung der Basisobjekte aus. So werden Knoten als Koordinatenpaar,
Linien und Flächen als Koordinatenpaarliste abgespeichert. Dies bedeutet,
dass unter Umständen Koordinatenpaare mehrfach abgespeichert werden.
Dadurch können bei späteren Aktualisierungen der Daten Inkonsistenzen
entstehen.
Die topologische Struktur wahrt auf Grund der Speicherung der Koordinaten die topologische Integrität der Daten. So wird eine Linie aus Anfangsund Endknoten sowie einer Menge von Zwischenpunkten zusammengesetzt
und eine Fläche wird als eine Menge von Linien betrachtet.
Die Spaghetti-Struktur erlaubt primär einen schnellen Zugriff auf die Daten, während die topologische Struktur vor allem qualitative Aspekte (Genauigkeit, Integrität) berücksichtigt. [Fla97][Con00]
Hauptsächlich sprechen zwei Gründe für die Verwendung der SpaghettiStruktur als Basismodell. Die zu erstellende Datenbank dient primär der
Beantwortung von Anfragen und bedingt dadurch die Forderung nach ei4
kurz: ER
20
KAPITEL 3. ENTWICKLUNG DES DATENBANKSCHEMAS
ner kurzen Antwortzeit. Der zweite Grund leitet sich teilweise aus der Verwendung des DB2 Spatial Extenders ab. Sicherlich ist die Realisierung einer topologischen Struktur auch mit dem DB2 Spatial Extender möglich,
jedoch lässt sich die zur Verfügung gestellte Funktionalität dann nur eingeschränkt oder umständlich nutzen. Die Tatsache, dass bei der Aktualisierung
der Daten in einer Spaghetti-Struktur Inkonsistenzen auftreten können, ist
vernachlässigbar, da die Koordinaten ausschließlich aus den GDF-Dateien
eingelesen werden.
In den Abbildungen 3.1 und 3.2 ist das entwickelte ER-Schema dargestellt. Die erste Abbildung charakterisiert die Zusammenhänge zwischen den
Entity-Typen, die hauptsächlich für die Visualisierung benötigt werden. Die
zweite Abbildung konzentriert sich auf die zu einem Feature gehörenden Eigenschaften.
Das Feature ist der Basistyp für komplexes Feature und simples Feature,
und die Spezialisierungen übernehmen somit den Schlüssel ’ID’. Während ein
komplexes Feature aus simplen oder wiederum aus komplexen Feature zusammengesetzt wird, untergliedert sich das simple Feature weiter in Punkt-,
Linienzug- und Gebiet-Feature. Diese letztendlich stellen über die Beziehungen repräsentiert durch zu den Entity-Typen Knoten, Linie bzw. Fläche die
entsprechenden Koordinaten zur Verfügung. Dabei besitzen die Beziehungen
repräsentiert durch von dem Entity-Typ Linienzug-Feature nach Linie bzw.
von Gebiet-Feature nach Fläche ein Attribut ’Reihenfolge’, das die Menge der
zu einem Linienzug-Feature gehörenden Linien bzw. der zu einem GebietFeature gehörenden Flächen ordnet.
Wie bereits erwähnt, bilden Knoten, Linien und Flächen häufig die Basistypen für Vektormodelle. Die Koordinaten werden dabei für den Knoten
durch ein einzelnes Wertepaar und für Linien und Flächen durch eine Wertepaarliste angegeben.
Im unteren Teil der Abbildung 3.1 sieht man die Beziehung begrenzt links
bzw. begrenzt rechts. Durch diese Beziehungen wird insofern die Topologie
der Karte berücksichtigt, als dadurch einer Linie die an sie angrenzenden
Flächen zugeordnet werden.
Im Mittelpunkt der Abbildung 3.2 steht das Feature mit seinen Eigenschaften. Zum einen ist der Entity-Typ Attribut zu erkennen, mit seinen
Eigenschaften ’ID’, ’Code’ und ’Wert’. Daneben sieht man den Entity-Typ
Namen als eine Spezialisierung mit der zusätzlichen Eigenschaft ’Sprache’.
Weitere wichtige Entity-Typen sind Feature-Klasse und Feature-Kategorie,
die zum einen eine Gruppierung der Feature in Klassen erlauben (vgl. Def.
2.2) und zum anderen die Einordnung in das Repräsentationsschema vornehmen (vgl. Def. 2.4). Die Zusammenhänge zwischen mehreren Feature werden
über die Beziehung beteiligt an zum Entity-Typen semantische Beziehung
3.2. KONZEPTIONELLER DATENBANKENTWURF
[ID]
M
komplexes
Feature
21
Feature
M
besteht
aus
N
N
simples
Feature
besteht
aus
Punkt
Feature
M
Linienzug
Feature
M
Gebiet
Feature
M
repräsent
durch
repräsent
durch
repräsent
durch
1
N
Knoten
N
Linie
[ID]
Fläche
[ID]
Punkt
Koordinate
[ID]
Linien
Koordinaten
Flächen
Koordinaten
M
begrenzt
links
1
M
begrenzt
rechts
1
Linie
Fläche
Abbildung 3.1: Datenbankschema (Teil 1)
22
KAPITEL 3. ENTWICKLUNG DES DATENBANKSCHEMAS
verwirklicht. Das Attribut ’Reihenfolge’ besagt, welche Stelle die Feature
in der semantischen Beziehung besetzen. Betrachtet man zum Beispiel die
Instanz überquert von dem Entity-Typ semantische Beziehung, so ist es wesentlich, ob nun ein Feature A ein Feature B überquert oder umgekehrt.
Code
Code
Text
Feature
Klasse
M
Text
dargest.
durch
1
Feature
gehört
zu
[ID]
M
Reihenfolge
M
beteiligt
an
M
besitzt
Feature
Kategorie
1
besteht
aus
M
N
N
Code
N
semantische
Beziehung
Attribut
Sprache
Wert
[ID]
Code
Name
Abbildung 3.2: Datenbankschema (Teil 2)
Zu Gunsten einer besseren Übersichtlichkeit wurde nicht dargestellt, dass
alle Entity-Typen bis auf Feature-Klasse und Feature-Kategorie in einer Beziehung gehört zu mit dem Entity-Typ Sektion partizipieren.
3.3
Logischer Datenbankentwurf
Nunmehr wird die Abbildung des soeben vorgestellten ER-Modells auf DB2
UDB V7.1 beschrieben. Es werden unterschiedliche Herangehensweisen und
anwendbare Konzepte (z. B. benutzerdefinierte Datentypen und Funktionen)
diskutiert.
3.3. LOGISCHER DATENBANKENTWURF
3.3.1
23
Strukturierung der Datenbank
Die Sprache SQL kennt das Konzept der Schemata, worunter eine benannte
Sammlung von Objekten, z. B. Tabellen und Sichten, verstanden wird. Gewissermaßen bildet ein Schema einen Namensraum und erleichtert somit die
Wahl von Objektnamen, da diese nur noch innerhalb eines Schemas eindeutig
sein müssen.[Cha99]
Das Konzept der Schemata wird hier dazu genutzt, um zum einen Metadaten einer GDF-Datei von übrigen Daten und zum anderen geographische Gebiete zu trennen. Letzteres meint, dass für jede Sektion in den GDFDateien, die jeweils mit einem geographischen Gebiet gleichzusetzen ist, ein
extra Schema angelegt wird. Diese Aufteilung ist in Abbildung 3.3 veranschaulicht, wobei die Rechtecke innerhalb der Datenbank die einzelnen Schemata für ein geographisches Gebiet symbolisieren. Daraus ergibt sich eine
erhebliche Verkleinerung des Suchraumes bei Bereichsanfragen. Zudem garantiert der GDF-Standard eindeutige Identifikatoren für Knoten, Linien,
Flächen usw. nur innerhalb einer Sektion. Bei einer Zusammenfassung von
Tabellen wird demzufolge ein größerer Primärschlüssel benötigt.
Datenbank
Meta−
daten
Berlin Bayern
(norden)
...
Abbildung 3.3: Aufteilung der Datenbank
Neben den Tabellen zur Umsetzung der Codes (z. B. Attribut-Code) in
lesbaren Text beinhalten die Metadaten eine Tabelle Sektion. In dieser Tabelle wird für jedes Schema die zugehörige Bounding Box gespeichert, so dass
eine Zuordnung von einem Anfragebereich zu den Schemata möglich ist.
3.3.2
Data Definition Language
Konzepte in DB2 UDB V7.1
In diesem Teil werden die möglichen Konzepte zum Anlegen von Tabellen in
DB2 untersucht und sich daraus ergebene Probleme aufgezeigt. Das am Ende
genutzte Konzept entscheidet auch darüber inwiefern diese Implementation
auf andere DBMS übertragbar ist.
24
KAPITEL 3. ENTWICKLUNG DES DATENBANKSCHEMAS
Als Data Definition Language (DDL) wird der Bereich des SQL-Standards
bezeichnet, der der Erzeugung von Objekten (Tabellen, Indizes, usw.) in der
Datenbank dient. Die Realisierung des Datenbankentwurfs auf Grundlage
von DB2 UDB V7.1 kann entweder objekt-relational oder rein“ relational
”
geschehen.
Objekt-relational bietet sich an, da in dem Datenbankentwurf die Spezialisierungshierarchie des Entity-Typs Feature von zentraler Bedeutung ist. Die
Definition der Tabellen spiegelt dann diese Hierarchie auch im DBMS wider.
Weiterhin ergeben sich Vorzüge beim Zugriff auf die aus diesen Entity-Typen
generierten Tabellen, da zum Beispiel bei einer Anfrage über alle Feature
nicht die Tabellen für komplexe Feature und simple Feature nacheinander
abgefragt werden müssen, sondern die Tupel aus beiden Tabellen bereits in
einer Tabelle Feature zusammengefasst sind. Auch ließen sich Methoden (benutzerdefinierte Funktionen) als integraler Bestandteil der Datentypen für
den Zugriff auf die einzelnen Tabellen implementieren.
Im Folgenden wird die prinzipielle Verwendung der objekt-relationalen
Konzepte des strukturierten Datentypen (structured type) und der typisierten Tabellen (typed table) skizziert.
Ein strukturierter Datentyp ist ein benutzerdefinierter Datentyp, der ein
oder mehrere Attribute enthält, die wiederum über Namen und Datentypen
verfügen. Ein strukturierter Datentyp wird mit der SQL-Anweisung CREATE
TYPE (vgl. [IBM00b]) erstellt. Zusätzlich können strukturierte Datentypen
von anderen strukturierten Datentypen abgeleitet werden oder um benutzerdefinierte Methoden — Funktionalität — erweitert werden, die sozusagen
das Verhalten dieses Datentyps definieren. Darauf soll aber nicht weiter eingegangen werden.
Die folgenden beiden SQL-Anweisungen erzeugen zwei strukturierte Datentypen mit den Bezeichnungen st feature5 und st komplex feature. Letzterer
basiert auf st feature.
CREATE TYPE st feature
AS (id INTEGER)
NOT FINAL MODE DB2SQL
CREATE TYPE st komplex feature
UNDER feature
MODE DB2SQL
Ein strukturierter Typ kann als Typ für eine Tabelle — sogenannte typisierte Tabellen (typed tables) — dienen, in der jede Tabellenspalte ihren
Namen und Datentyp aus einem der Attribute des strukturierten Typs ableitet. Dazu dient die SQL-Anweisung CREATE TABLE (vgl. [IBM00b]), wo5
st steht für structured type
3.3. LOGISCHER DATENBANKENTWURF
25
bei jedoch nicht die Spaltennamen und -typen angegeben werden, sondern
die Bezeichnung eines strukturierten Datentyps. Es ist möglich eine Hierarchie von Tabellen aufzubauen, wobei in der Wurzeltabelle durch REF IS
oid USER GENERATED eine zusätzliche Spalte für einen Objektidentifikator
erzeugt wird. Dieser Objektidentifikator identifiziert jedes Tupel eindeutig in
einer Hierarchie. Für eine Hierarchie gilt, dass in Kindertabellen eingefügte
Tupel auch in der Vatertabelle sichtbar sind.
Die untenstehenden Anweisungen erzeugen zwei Tabellen basierend auf
den Datentypen st feature und st komplex feature.
CREATE TABLE feature
OF st feature
REF IS oid USER GENERATED
CREATE TABLE komplex feature
OF st komplex feature
UNDER feature INHERIT SELECT PRIVILEGES
Jedoch wird nicht jede derart aufgebaute Hierarchie von DB2 akzeptiert.
Die Ursache dafür liegt in der Verwaltung der typisierten Tabellen durch
DB2; vermutlich werden nur die Attribute als Spalte einer Tabelle umgesetzt,
die nicht geerbt wurden. Besitzt der abgeleitete strukturierte Datentyp keine
zusätzlichen Attribute, so entstehen nicht erlaubte Tabellen ohne Spalten.
Entscheidend für das Aufbauen einer Hierarchie ist also, dass die abgeleiteten
strukturierten Datentypen mindestens ein Attribut mehr besitzen ( echte“
”
Spezialisierung).
Die obigen Tabellendefinitionen werden also von DB2 mit einer Fehlermeldung zurückgewiesen, da st komplex feature kein zusätzliches Attribut definiert6 .
Da es sich also bei der im Datenbankentwurf aufgebauten Hierarchie nicht
um eine echte“ Spezialisierung handelt, ist eine Generierung der Tabel”
len mit Hilfe der objekt-relationalen Erweiterung von DB2 nicht möglich.
Deshalb wird für die Erzeugung der Tabellen hauptsächlich auf die objektrelationale Erweiterung verzichtet. Ein sich daraus ergebender Vorteil besteht
in der besseren Übertragbarkeit der SQL-Anweisungen auf andere DBMS.
Datentypen
Im Folgenden wird beschrieben, warum und wie das Konzept des einigartigen
Datentyps in die Realisierung des Datenbankentwurfs integriert wird. Dazu
werden auch ein paar Hinweise für die einfache Benutzung benutzerdefinierter
6
Die beiden CREATE TYPE-Anweisungen sind aber erlaubt.
26
KAPITEL 3. ENTWICKLUNG DES DATENBANKSCHEMAS
Datentypen gegeben. Des Weiteren werden die Datentypen des DB2 Spatial Extenders vorgestellt und deren Anwendung in dem Datenbankentwurf
verdeutlicht.
Soweit möglich wurden einzigartige Datentypen (distinct types) eingesetzt, die ihrerseits auf Basisdatentypen von DB2 (z. B. INTEGER, VARCHAR)
aufbauen. Einzigartige Datentypen garantieren vor allem Typsicherheit bei
Anfragen [Cha99]. Dies bedeutet, dass zum Beispiel der Vergleich zwischen
dem Code eines Features und dem Code eines Attributs in einer Anfrage
durch die Datenbank mit einem Fehler abgelehnt wird, falls die Codes jeweils
als einzigartige Typen implementiert sind. Es lassen sich auch die auf einen
Datentyp anwendbaren Operationen einschränken oder erweitern. Zusätzlich sind globale Veränderungen des Datentyps einer Spalte, z. B. die ID soll
BIGINT anstatt INTEGER sein, nur an einer zentralen Stelle vorzunehmen.
Die einzigartigen Datentypen können im Allgemeinen überall dort eingesetzt
werden, wo auch Basisdatentypen stehen können.
In Tabelle 3.1 sind die verwendeten einzigartigen Datentypen, deren Basisdatentypen und Einsatz aufgelistet (vgl. Anhang B.1). Jeder logische Rekord in einer GDF-Datei ist durch eine ID gekennzeichnet (vgl. Absatz 2.2.1)
— dieser Wert wird in Spalten vom Type dt id gespeichert. Für die jeweiligen Kodierungen wie in den Definitionen 2.2, 2.4 und 2.6 ist ein separater
Datentyp vorgesehen. Weiterhin existieren einzigartige Datentypen für den
Text von Namen und den Werten von Attributen. Mit Sprachencode sind
die MARC Sprachencodes für europäische Sprachen gemeint, die für die Spezifizierung der Sprache von Namen benutzt wird. Die Übersetzungstabellen
dienen der Umwandlung von Kodierungen in lesbaren Text; der lesbare Text
wird mit dem Datentyp dt description dargestellt.
einzig. Datentyp
dt id
dt featureKlasse
dt featureKategorie
dt relationshipCode
dt
dt
dt
dt
dt
attributeCode
attributeValue
nameValue
languageCode
description
Basistyp
BIGINT
SMALLINT
SMALLINT
SMALLINT
Anwendung
IDs der Datensätze
Kodierung der Feature-Klasse
Kodierung der Feature-Kategorie
Kodierung des Typs der semantischen Beziehung
CHAR(2)
Kodierung des Attributtyp
VARCHAR(100) Attributwert
VARCHAR(100) Feature-Name
CHAR(3)
Sprachencode
VARCHAR(255) Text in den Übertragungstabellen: Code ↔ lesbarer Text
Tabelle 3.1: Definierte eizigartige Datentypen
3.3. LOGISCHER DATENBANKENTWURF
27
Grundsätzlich werden alle einzigartigen Datentypen im zentralen Schema
Meta generiert. Zur Erzeugung eines einzigartigen Datentyps benutzt man die
CREATE DISTINCT TYPE-Anweisung (vgl. [IBM00b]). Die folgende Anweisung
erzeugt zum Beispiel den Datentyp dt id im Schema meta.
CREATE DISTINCT TYPE meta.dt id AS BIGINT WITH COMPARISONS
Gleichzeitig werden durch DB2 selbst Konvertierungsfunktionen von und
nach dem Basisdatentyp sowie Vergleichsoperatoren für den neuen Datentyp
(=, <>, <, <=, >, >=) generiert. Die von DB2 generierten Konvertierungsfunktionen und Vergleichsoperatoren werden in dem Schema abgelegt, in dem
auch der einzigartige Datentyp erzeugt wurde. Damit nun die neuen einzigartigen Datentypen in gewohnter Form genutzt werden können, muss darauf
geachtet werden, dass dieses Schema auch im Suchpfad (CURRENT FUNCTION
PATH) für die Funktionen liegt. Als Default benutzt DB2 die Systempfade
SYSIBM und SYSFUN sowie das Schema des angemeldeten Nutzers. Das
Kommando
SET PATH = CURRENT PATH, meta
fügt entsprechend dem obigen Beispiel das Schema meta dem aktuellen Pfad
hinzu.
Wie bereits in Abschnitt 3.1 beschrieben, wird zur Verwaltung der räumlichen Daten der DB2 Spatial Extender eingesetzt. Dieser erweitert DB2 um
strukturierte Datentypen für die Speicherung von Koordinaten und darauf
arbeitenden Funktionen.
Die Abbildung 3.4 zeigt die Hierarchie der strukturierten Datentypen,
die durch den DB2 Spatial Extender zur Verfügung gestellt werden. Die
grau unterlegten Datentypen sind nicht instanziierbar, d.h. es kann keine
Instanz erzeugt, keine typisierte Tabelle angelegt und, wenn eine Spalte in
einer Tabelle mit diesem Typ angelegt wurde, so können nur NULL-Werte
oder Instanzen von Subtypen eingefügt werden. In der Abbildung sind die Datentypen nicht dargestellt, die mehrere Punkte (ST MultiPoint), Linienzüge
(ST MultiLineString) oder Polygone (ST MultiPolygon) enthalten können.
In dem Datenbankschema wird für Knoten der Datentyp ST Point, für
Linien ST LineString und für Flächen ST Polygon verwendet.
Tabellen
Die SQL-Anweisungen für die Erzeugung von Tabellen können auf unterschiedliche Weise an DB2 übergeben werden. Die einfachste Variante ist
28
KAPITEL 3. ENTWICKLUNG DES DATENBANKSCHEMAS
ST_Geometry
ST_Point
ST_Curve
ST_Surface
ST_LineString
ST_Polygon
Abbildung 3.4: Datentypen des Spatial Extender (Ausschnitt) [IBM00a]
die manuelle Eingabe der Anweisung am Prompt des DB2-Kommandozeileninterpreters, die offensichtlich als nicht geeignet ausscheidet. Als annähernd gleichwertig sind die Möglichkeiten des SQL-Skripts und der gespeicherten Datenbankprozedur (stored procedure) zu betrachten und werden in
den folgenden Absätzen diskutiert.
Gespeicherte Datenbankprozeduren zeichnen sich dadurch aus, dass diese
in der Datenbank verwaltet werden und somit im gewissen Sinn datenbankweit7 abrufbar sind. Daraus ergibt sich jedoch auch ein aufwändigeres Verfahren für Anpassungen und Korrekturen. Gegen diese Variante spricht auch
eine kompliziertere Ausführung der gespeicherten Datenbankprozeduren, insbesondere zu Testzwecken. Gespeicherte Datenbankprozeduren werden mittels CALL aufgerufen, das jedoch nur aus Applikationen heraus aufgerufen
werden kann [IBM00b].
Die abzuarbeitenden SQL-Anweisungen sind bei einem Skript in einer
Textdatei gespeichert, die dem Kommandozeileninterpreter zur Auswertung
übergeben wird. Für diese Variante sprechen insbesondere die einfache Handhabbarkeit und Korrektur bzw. Veränderung des Skripts. Weiterhin ist ein
Wechsel des DBMS einfacher durchführbar. Nachteilig wirkt sich dagegen
die Speicherung der Skripte außerhalb der Datenbank aus, d.h., sie könnten
verlegt“ werden.
”
Letztendlich steht die Skript-Variante im Vordergrund der Betrachtungen. Die benötigten Tabellen werden in Metadatentabellen und reine“ Da”
tentabellen unterschieden. Da die Erzeugung dieser Tabellen unterschiedlich
gehandhabt werden muss, ist eine Differenzierung notwendig.
Metadaten werden stets im Schema meta abgespeichert und somit werden
7
Überall, wo die Datenbank zugreifbar ist, sind auch die gespeicherten Prozeduren
verfügbar.
3.4. PHYSISCHER DATENBANKENTWURF
29
auch die dazugehörigen Tabellen dort angelegt. Das heißt, hierfür können einfache Skripte zur Erzeugung der Tabellen eingesetzt werden. Zum Anlegen
von Tabellen wird die CREATE TABLE-Anweisung (vgl. [IBM00b]) verwendet.
Der Aufbau der Metadatentabellen kann im Anhang B.2.1 nachgelesen werden.
In diesem Beispiel wird die Tabelle languageCode im Schema meta mit
zwei Spalten (languageCode, description) angelegt. Der Schlüssel der Tabelle
ist die Spalte languageCode, der über den Objektnamen languageCode pk
angesprochen werden kann.
CREATE TABLE meta.languageCode (
languageCode meta.dt languageCode NOT NULL,
description meta.dt description NOT NULL,
CONSTRAINT languageCode pk
PRIMARY KEY (languageCode) )
Im vorgestellten Datenbankentwurf werden die geographischen Regionen
in ein jeweils separates Schema gespeichert. Daraus folgt, dass auch in den
Skripten zur Erzeugung der Datentabellen der Schemaname dynamisch eingesetzt werden muss. Dazu wird anstelle des Schemanamen das Token ’ ?’
benutzt, das zur Laufzeit durch einen übergebenen Schemanamen substituiert wird (s. Abschnitt 4.5). Das Token ist gut geeignet, da es bei DB2
für Applikationen vorbehalten ist und in SQL-Anweisungen nicht vorkommt.
Ansonsten unterscheiden sich die CREATE TABLE Anweisungen nicht von den
oben vorgestellten — die Definitionen dieser Tabellen befinden sich im Anhang B.2.2.
3.4
Physischer Datenbankentwurf
Folgender Abschnitt untersucht die physische Speicherung der Tabellen bzw.
der darin enthaltenen Daten. Es werden einige der in DB2 zur Verfügung
gestellten Methoden für die physische Verteilung der Daten diskutiert. Des
Weiteren wird die Indizierung der räumlichen Daten betrachtet.
3.4.1
Tabellenbereiche und Pufferpools
Wie die physische Speicherung von Tabellen in DB2 UDB V7.1 gehandhabt
wird und was dabei zu beachten ist, wird in diesem Abschnitt vorgestellt.
Dieses Wissen erweitert die Möglichkeiten zum Optimieren des Zugriffs auf
die Daten in einer Datenbank.
Die Daten in den Tabellen werden in der Datenbank in sogenannten Tabellenbereichen (table spaces) gespeichert und verwaltet. Bei der Erstellung
30
KAPITEL 3. ENTWICKLUNG DES DATENBANKSCHEMAS
von Tabellen kann unter anderem auch der zu benutzende Tabellenbereich
angegeben werden. Die Tabellenbereiche wiederum werden in Behältern (i.A.
Dateien) abgelegt. Dabei werden drei verschiedene Typen unterschieden:
regular für Benutzerdaten und Datenbankobjekte
temporary für die Speicherung globaler temporärer Tabellen
long für sehr lange Zeichenfolgen oder lange Objekte (LOB)
Ein weiteres Unterscheidungsmerkmal besteht in der Verwaltung der Tabellenbereiche: systemverwaltet (managed by system), datenbankverwaltet
(managed by database). Ersteres bedeutet, dass die Alloziierung von Sekundärspeicher von DB2 selbst organisiert wird — es wird nur so viel Speicher benutzt, wie benötigt wird. Nachteilig ist, dass das Hinzufügen neuer
Behälter, z. B. wenn der Festplattenplatz nicht mehr ausreicht, im Allgemeinen nicht möglich ist.
Wenn Tabellenbereiche datenbankverwaltet eingerichtet wurden, so liegt
die Verantwortung der Speicherverwaltung beim Datenbankadministrator.
Dieser muss dafür sorgen, dass stets genügend Sekundärspeicherplatz in den
Behältern vorhanden ist. Dabei wird der Speicher vorher dem System bereitgestellt — auch wenn eigentlich nicht so viel benötigt wird — und steht
damit anderen Anwendungen nicht mehr zur Verfügung. Dennoch gibt es für
die hier vorgesehene Anwendung klare Vorteile gegenüber systemverwalteten Tabellenbereichen. Es können neue Behälter dem Tabellenbereich hinzugefügt werden, wonach zur Erhöhung der E/A-Effizienz die vorhandenen
Daten gleichmäßig auf alle Behälter verteilt werden. Eine Tabelle kann nach
dem Typ der zu speichernden Daten (Langfeld/LOB, Indizes, reguläre Tabellendaten) auf mehrere Tabellenbereiche verteilt werden. Da der Speicher
vorher alloziiert wird, steht dieser zusammenhängend (nicht fragmentiert)
auf dem Sekundärspeicher zur Verfügung.[IBM00b]
Ein anderes Konzept, das in Datenbanken genutzt wird, ist die Verwendung von Pufferpools (bufferpool). Ein Pufferpool bezeichnet einen Teil des
Hauptspeichers, der dem schnellen Zugriff der von einem Datenträger gelesenen Daten oder dem Zwischenspeichern von geänderten Tabellen- und
Indexdatenseiten dienen. Dabei ist die vom Pufferpool verwendete Seitengröße ausschlaggebend dafür, wie lang eine im Pufferpool gespeicherte Zeile
sein darf, da eine Zeile sich nicht über mehrere Seiten erstrecken kann.
Standardmäßig wird eine Seitengröße von 4 kB verwendet. Es zeigt sich
jedoch, dass diese Größe für komplexere Anfragen, die den DB2 Spatial Extender benutzen, nicht ausreichend ist — solche Anfragen werden mit einer
3.4. PHYSISCHER DATENBANKENTWURF
31
Fehlermeldung abgebrochen. Deshalb ist es ratsam, die Koordinaten enthaltenden Tabellen in einem Tabellenbereich mit größeren Seiten anzulegen. Dabei ist zu beachten, dass zu Tabellenbereichen mit einer bestimmten
Seitengröße mindestens ein Pufferpool mit derselben Seitengröße existieren
muss. Eine Seitengröße von 4 kB erlaubt Tabellen mit maximal 500 Spalten.
Dahingegen sind bei einer Seitengröße von 8 kB, 16 kB und 32 kB maximal 1012 Spalten möglich. Die Seitengröße bestimmt auch den maximalen
Umfang eines Tabellenbereiches.
Pufferpools und Tabellenbereiche mit großen Seiten können auch nachteilige Auswirkungen auf das Gesamtsystem haben. Da auf einer Seite maximal
255 Zeilen gespeichert werden, bleibt bei Tabellen mit kurzen Zeilenlängen
(= Summe der Spaltenlängen) ein erheblicher Teil der Seite ungenutzt. Auch
leidet in bestimmten Anwendungsgebieten (z. B. OLTP) die Performanz, da
zusätzlich zu den gewollten auch nicht benötigte Daten ausgelesen werden
und im Pufferpool zwischengespeichert werden.
Bei der Verwendung von Pufferpools und Tabellenbereichen mit anderen
Seitengrößen als 4 kB muss auch ein entsprechender temporärer Tabellenbereich angelegt werden, da sonst SQL-Anfragen, die das Zwischenspeichern
von Daten erfordern, nicht abgearbeitet werden können.
Die untenstehenden Anweisungen erzeugen zunächst einen Pufferpool mit
einer Seitengröße von 32 kByte und einem Umfang von 250 Seiten. Darauf
aufbauend wird ein Tabellenbereich in dem Behälter C:\DB2\largets.000
angelegt. Nähere Informationen zu den SQL-Anweisungen findet man in
[IBM00b].
CREATE BUFFERPOOL largeBP SIZE 250 PAGESIZE 32K
CREATE TABLESPACE largeTS PAGESIZE 32K
MANAGED BY SYSTEM USING (’C:\DB2\largets.000’)
BUFFERPOOL largeBP
3.4.2
Räumlicher Index
Für den schnellen Zugriff auf räumliche Daten benötigt man einen Index,
der in kurzer Zeit die in einem vorgegebenen Bereich liegenden räumlichen
Objekte identifiziert. Der von DB2 UDB V7.1 verwendete Indizierungsmechanismus (B-Baum) ist für die Indizierung mehrdimensionaler Daten nicht
geeignet, da dieser nur eindimensionale Daten verarbeiten kann. Daher ist
es notwendig, spezielle räumliche Indizierungsverfahren zu verwenden. Der
DB2 Spatial Extender bietet einen dreistufigen auf einem Gitter basierenden
Index (grid index). Dieser Abschnitt erklärt kurz die Funktionsweise und
Erzeugung eines solchen Indizes.
32
KAPITEL 3. ENTWICKLUNG DES DATENBANKSCHEMAS
Die Koordinaten der räumliche Objekte werden nicht selbst in den Index
eingetragen, sondern zunächst wird das kleinste umschreibende Rechteck (envelope, minimum bounding rectangle8 , bounding box9 ) gebildet. Das MBR
ist selbst wieder ein räumliches Objekt, das die maximale Ausdehnung in xbzw. y-Richtung des zugrundeliegenden Objekts repräsentiert. In den meisten Fällen — ao auch beim DB2 Spatial Extender — handelt es sich dabei
um ein Rechteck.
Für Überschneidungen des so gebildeten MBR und des Gitters werden
nun Einträge im Index vorgenommen. Der Eintrag besteht aus der minimalen x- und y-Koordinate der geschnittenen Gitterzelle. Die Abbildung 3.5
demonstriert die Vorgehensweise. Das Polygon schneidet demnach die Gitterzellen mit den Koordinaten (10, 10), (20, 10), (10, 20), (20, 20), (10, 30)
und (20, 30).
50.0
40.0
30.0
20.0
10.0
0.0
10.0
20.0
30.0
40.0
50.0
Abbildung 3.5: Gitterindex mit einem Level von 10.0
Die Dreistufigkeit ergibt sich dadurch, dass sich insgesamt (maximal) drei
unterschiedliche (ansteigende) Gittergrößen definieren lassen. Dabei wird die
Indizierung mit der niedrigsten Gittergröße begonnen. Wenn das räumliche
Objekt mehr als vier Gitterzellen auf diesem Level überschneidet, so wird
das nächsthöhere Level zur Indizierung probiert, usw. Ist das höchste Level
8
9
kurz: MBR
kurz: BB
3.4. PHYSISCHER DATENBANKENTWURF
33
erreicht, so werden alle Schnitte in den Index eingetragen, unabhängig von
der Anzahl.
Die jeweiligen Gittergrößen werden beim Erzeugen des Indizes durch die
Anweisung CREATE INDEX mit angegeben. Die folgende Anweisung erzeugt
einen räumlichen Index für die Spalte ’Koordinate’ mit Gittergrößen 10, 100
und 1000.
CREATE INDEX point idx ON Point (Koordinate)
EXTEND USING db2gse.spatial index (10e0, 100e0, 1000e0)
Die Auswahl der in Frage kommenden Tupel mittels eines räumlicher Indizes geschieht bei fast allen Funktionen des DB2 Spatial Extenders in drei
Phasen. Zuerst werden alle Einträge im Index ermittelt, die eine größergleiche linke obere Koordinate und eine kleinergleiche rechte untere Koordinate
als die Anfragebox haben. Anschließend wird geprüft, ob das MBR der ermittelten Objekte die Anfragebox schneidet. Zuletzt erfolgt dann der Vergleich
mit den tatsächlichen Koordinaten der Objekte. Da der letzte Vergleich sehr
aufwändig ist, ist eine signifikante Reduzierung der möglichen Kandidaten
besonders wichtig. [IBM00a]
Um eine hohe Selektion durch den Index zu erreichen, müssen die Gittergrößen und die Anzahl der Level (Stufen) passend gewählt werden. Leider
gibt es keine Regeln, wie diese bestimmt werden, vielmehr kommt es dabei
auf Erfahrung und Kenntnis über die Beschaffenheit der zu indizierenden
räumlichen Objekte an. Insgesamt gesehen, bildet allein das Probieren unterschiedlicher Gittergrößen ein Mittel zur Verbesserung der Performanz.
Kapitel 4
Einlesen einer GDF-Datei in
die Datenbank
Dieses Kapitel befasst sich mit der Übertragung der Daten aus einer GDFDatei in die Datenbank. Die Datenbank muss für den Einsatz des DB2 Spatial
Extenders vorbereitet werden, um darin auf die räumlichen Datentypen und
Funktionalitäten zurückgreifen zu können. Erst jetzt ist das Anlegen aller
benötigten Tabellen möglich. Da die Datenbank im Allgemeinen keinen Filter für GDF-Dateien mitliefern, muss dieser selbst implementiert werden.
Für den Transfer der Daten in eine Datenbank sind unterschiedliche Ansätze
denkbar, die im zweiten Abschnitt erläutert werden. Die eigentliche Realisierung des Programms zur Verarbeitung der GDF-Dateien wird anschließend
vorgestellt. Dabei erfordert insbesondere die Übertragung der Koordinaten
in die Datenbank eine gesonderte Betrachtung, da diese dem DB2 Spatial Extender übergeben werden. An dieser Stelle werden einige Kodierungsformate
für räumliche Objekte vorgestellt, die zum Transfer verwendet werden.
4.1
Vorbereiten der Datenbank
Dieser Abschnitt fasst die vorbereitenden Maßnahmen für die Nutzung des
DB2 Spatial Extenders unter DB2 UDB V7.1 zusammen. Um nun die kartographischen Daten in die Datenbank einzulesen, werden zunächst die Metadatentabellen angelegt und anschließend bereits mit Daten gefüllt. Wie
hierbei vorgegangen wird, ist am Ende des Abschnitts beschrieben.
Bevor in einer Datenbank der DB2 Spatial Extender (vgl. Abschnitt 3.1)
verwendet werden kann, muss das System dafür konfiguriert werden — einige
Systemvariable müssen gesetzt werden. Anschließend muss der DB2 Spatial
Extender für die Datenbank registriert werden, um dessen Ressourcen nutzen
34
4.1. VORBEREITEN DER DATENBANK
35
zu können.
Innerhalb DB2 werden global auf das gesamte DBMS und lokal bezüglich
einer Datenbank wirkende Systemvariablen unterschieden. Für die Veränderung einer global wirkenden Systemvariablen stellt DB2 das Kommando
UPDATE DATABASE MANAGER CONFIGURATION1 bereit. Analog dazu existiert
das Kommando UPDATE DATABASE CONFIGURATION2 zur Anpassung der lokal wirkenden Systemvariablen.
Die Tabelle 4.1 enthält für die Systemvariablen die entsprechenden (minimalen) Werte. Die Variable UDF MEM SZ wirkt sich auf die Größe des Speichers aus, den sich benutzerdefinierte Funktionen und der Datenbankprozess
zur Datenübertragung teilen. Die für eine Applikation verfügbare Heapgröße
wird als Anzahl von 4 kB Seiten durch APPLHEAPSZ festgelegt. Die Größe der
für die Wiederherstellung von Daten (data recovery) verwendeter Transaktionslogdateien bestimmt LOGFILSIZ (4 kB Seiten). Die Anzahl der primären
Logdatei speichert die Variable LOGPRIMARY.
Systemvariable Wert Wirkung
UDF MEM SZ
2048
global
APPLHEAPSZ
512
lokal
LOGFILSIZ
2000
lokal
LOGPRIMARY
5
lokal
Tabelle 4.1: Werte für die Systemvariablen
Erst nachdem diese Systemvariablen gesetzt worden sind, kann der DB2
Spatial Extender für eine Datenbank aktiviert (enable) werden. Hierdurch
werden Ressourcen in die Datenbank transferiert, die erst den Einsatz der
räumlichen Datentypen und Funktionen gestatten. Alle Ressourcen werden
in dem Schema db2gse eingerichtet und sind durch Anpassung der Variablen
CURRENT FUNCTION PATH oder durch explizite Namensqualifizierung (z. B.
db2gse.st asText()) anschließend nutzbar.
Der DB2 Spatial Extender stellt hierfür eine gespeicherte Datenbankprozedur namens gse enable db() bereit. Wie bereits weiter oben erwähnt,
werden gespeicherte Datenbankprozeduren nur mittels CALL aus Applikationen heraus aufgerufen. Um diese Funktion dennoch aus einem Skript heraus aufrufen zu können, entstand ein Programm, das nichts weiter als diese
gespeicherte Datenbankprozedur aufruft. Als Parameter erwartet das Programm einen Datenbankalias, einen Benutzernamen und ein Passwort; diese
Informationen werden für den Aufbau einer Datenbankverbindung benötigt.
1
2
kurz: UPDATE DBM CFG
kurz: UPDATE DB CFG
36 KAPITEL 4. EINLESEN EINER GDF-DATEI IN DIE DATENBANK
Im weiteren Verlauf der Datenbankvorbereitung werden benötigte Pufferpools und Tabellenbereiche angelegt, gespeicherte Datenbankprozeduren,
einzigartige Datentypen sowie die Metadatentabellen erzeugt.
Die SQL-Anweisungen für die Erzeugung der einzigartigen Datentypen
und der Metadatentabellen stehen jeweils in einem SQL-Skript, die nacheinander3 ausgeführt werden (vgl. hierzu Anhänge B.1 und B.2.1).
Ein großer Teil der Metadaten sind unabhängig von der jeweiligen GDFDatei, da sie bereits im GDF-Standard festgelegt sind. Vor allem betrifft dies
die Übersetzungstabellen, die Kodierungen in lesbaren Text transformieren.
Diese Daten wurden extrahiert und in einer Trennzeichen separierten (delimited) ASCII-Datei (DEL-Datei) abgespeichert. Diese Dateien können nun
mit dem LOAD-Befehl von DB2 in die entsprechenden Tabellen eingelesen
werden.
Alle diese Vorgänge werden in einem Shell-Skript zusammengefasst, das
mit Hilfe der Abbildung 4.1 nachvollzogen werden kann. Der Übersichtlichkeithalber wurd das Skript etwas vereinfacht.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Programm prepareDB (DB-Alias, Nutzer, Passwort)
: returns Fehlercode
begin
# Phase 1
Erzeuge Datenbank DB-Alias;
Konfiguriere Systemumgebung lt. Tab. 4.1;
Erzeuge die Pufferpools;
Starte Datenbankmanager neu;
# Phase 2
Erzeuge die Tabellenbereiche;
Registriere DB2 Spatial Extender Resourcen;
# Phase 3
SQL-Skript: Erzeugung einzigartiger Datentypen;
SQL-Skript: Erzeugung Metadatentabellen;
Metadaten per LOAD einlesen;
end
Abbildung 4.1: Vorbereitung der Datenbank (vereinfacht)
Das Shell-Skript ist dazu in drei Phasen unterteilt, so dass die Startphase
3
Die einzigartigen Datentypen müssen zuerst erzeugt werden, da die Metadatentabellen
sowie die anderen Datentabellen davon abhängig sind.
4.2. KONZEPTE ZUM FÜLLEN VON DATENBANKTABELLEN
37
mittels Parameter bestimmt werden kann. In der ersten Phase wird eine Datenbank erzeugt und die Systemumgebung konfiguriert. Jetzt muss auch die
Erzeugung des Pufferpool erfolgen, damit diese in der nächsten Phase verwendet werden können. Danach wird der Datenbankmanager gestoppt und
wieder gestartet, damit die Änderungen wirksam werden. Die zweite Phase
befasst sich mit dem Erstellen der Tabellenbereiche. Weiterhin werden die
Ressourcen des DB2 Spatial Extenders mit dem Programm enableDB registriert. Danach wird die aufgebaute Datenbankverbindung getrennt, damit in
Phase drei die Tabellenbereiche verwendet werden können. Die letzte Phase
legt die einzigartigen Datentypen und die Metadatentabellen an, wobei die
Tabellen anschließend gefüllt werden. Bei auftretenden Fehlern während der
Ausführung reagiert das Skript mit einem Rückkehrcode ungleich Null.
4.2
Konzepte zum Füllen von Datenbanktabellen
Es sind unterschiedliche Wege denkbar, Daten in eine Datenbank einzuspielen, die sich jedoch in der Performanz zum Teil wesentlich unterscheiden.
Denkbare Alternativen sind:
• Übertragung der Daten aus einer Applikation heraus über eine direkte
Verbindung zur Datenbank
• Benutzen des IMPORT-Befehls, wobei die Daten aus Dateien im DELFormat ausgelesen werden
• Einlesen mittels der LOAD-Hilfsroutine, ebenfalls unter Verwendung von
Dateien im DEL-Format
In diesem Abschnitt werden diese drei Möglichkeiten miteinander verglichen,
wobei das Hauptaugenmerk auf der Geschwindigkeit liegt. Ein schnelles Einlesen ist erforderlich, da es sich hierbei um eine große Menge an Daten handelt, die in die Datenbank übertragen werden müssen. Offensichtlich ist es
entscheidend, ob hierfür Tage, Stunden oder Minuten benötigt werden.
Grundsätzlich lassen sich die Methoden zur Datenübertragung anhand
zweier Merkmale differenzieren. Zum einen ist kennzeichnend, ob die Daten
direkt aus einer Applikation heraus an die Datenbank eingegeben werden
oder indirekt über den Umweg einer DEL-Datei. Zum anderen ist wesentlich,
inwiefern während der Datenübertragung eine Integritätsprüfung stattfindet.
Die einfachste Methode ist die direkte Datenübertragung zu der Datenbank aus einer Applikation heraus mittels embedded SQL oder Call Level Interface (CLI) Programmierung. Hierbei wird in der Applikation eine
38 KAPITEL 4. EINLESEN EINER GDF-DATEI IN DIE DATENBANK
Verbindung zur Datenbank aufgebaut und darüber die Daten per INSERTAnweisungen in die jeweilige Tabelle eingefügt. Bei dieser Operation wird eine
vollständige Integritätsprüfung vorgenommen; das umfasst die Überprüfung
von eindeutigen Schlüsseln (unique key) wie z. B. dem Primärschlüsselwerten,
Fremdschlüsselbeziehungen (referential integrity) und sonstiger Bedingungen
(check constraint). In Folge dieser Überprüfungen ist diese Vorgehensweise
besonders langsam. Zusätzlich belastet die Bewegung der Daten im Hauptspeicher von der Applikation zum Datenbankprozess die Performanz.
Analog dazu funktioniert das Importieren von Daten aus DEL-Dateien
mittels des IMPORT-Befehls aus DB2. Anstatt die Daten direkt in die Datenbank zu schreiben, wird ein Umweg über DEL-Dateien begangen. Dieses Prinzip benutzt ebenfalls die INSERT-Anweisung, wodurch auch alle Integritätsbedingungen geprüft werden. Deshalb ist diese Vorgehensweise genauso performant wie die erste, benötigt aber wegen des Erzeugens der DEL-Dateien
einen Zwischenschritt. Das Prinzip ist in Abbildung 4.2 nachvollziehbar. Beim
Einlesen der GDF-Dateien muss jedoch keine Datenbankverbindung bestehen.
Programm
DEL−
Dateien
LOAD / IMPORT
GDF−
Datei
Daten−
bank
Abbildung 4.2: Datenfluss bei der Verwendung des IMPORT-Befehls oder des
LOAD-Hilfsprogramms
Die letzte Möglichkeit ist die Verwendung des LOAD-Hilfsprogramms.
Dabei liegen die Daten ebenfalls in DEL-Dateien vor, das Prinzip der Dateneingabe ist jedoch vollkommen anders. Die aus der DEL-Datei eingelesenen
Daten werden direkt auf Datenbankseiten abgebildet und anschließend in die
Datenbank geschrieben. Im Anschluss daran erfolgt eine Überprüfung der eindeutigen Schlüssel, wobei gegebenenfalls Uneindeutigkeiten durch Löschung
von Tupeln beseitigt werden. Weitere Überprüfungen finden nicht statt —
diese und davon abhängige Tabellen werden nur markiert (check pending
state). Der große Vorteil dieser Methode ist der enorme Performanzgewinn;
das LOAD-Hilfsprogramm ist um ein vielfaches (ca. Faktor 10) schneller.
4.3. VERARBEITUNG EINER GDF-DATEI
39
Dieser Vorgang benötigt aber exklusive Zugriffsrechte zu den Tabellenbereichen, in denen sich die Tabellen befinden, d.h., diese sind dann für andere
Nutzer in der Zeit nicht zugänglich.
Der große Geschwindigkeitsvorteil begründet die Entscheidung, zum Einlesen der Daten letztere Variante, das LOAD-Hilfsprogramm, zu verwenden.
Daraus folgt, dass das Programm zum Einlesen der GDF-Dateien DELDateien generiert, die in einer zweiten Phase per LOAD in die Datenbank
eingelesen werden. Den prinzipiellen Datenfluss sieht man in Abbildung 4.2.
4.3
Verarbeitung einer GDF-Datei
Der folgende Abschnitt stellt das Programm vor, mit der eine GDF-Datei
in für das LOAD-Hilfsprogramm verwendbare ASCII-Dateien transformiert
wird. Das Programm wurde in der Sprache C++ unter Verwendung der Standard Template Library (STL) geschrieben. Es besteht insgesamt aus zwei
Komponenten; die erste übernimmt dabei das Lesen der GDF-Datei und die
zweite extrahiert die Datenfelder aus den logischen Zeilen. Diese Unterteilung wird als nächstes beschrieben. Danach wird die Funktionsweise jeder
einzelnen Komponente eingehender erläutert.
4.3.1
Struktur
Das Werkzeug mit dem die GDF-Dateien verarbeitet werden, ist ein Programm, das zunächst die physische Zeilen (vgl. Abschnitt 2.2.2) in logische
umsetzt und anschließend daraus die benötigten Datenfelder ausliest. Die extrahierten Daten können dann in ein für das LOAD-Hilfsprogramm geeignetes
Format abgespeichert werden. In diesem Abschnitt werden die Komponenten
des Programms vorgestellt.
Das Programm besteht im Ganzen aus zwei Komponenten — einem Scanner und einem Parser. Der Scanner übernimmt dabei das Einlesen der GDFDatei und kombiniert physische Zeilen zu einer logischen (vgl. Abschnitt 2.2).
Der Parser extrahiert anhand der Rekorddefinitionen im GDF-Standard die
benötigten Daten aus der logischen Zeile und schreibt diese in die entsprechende Datei. Die Abbildung 4.3 ist eine Verfeinerung von Abbildung 4.2 und
zeigt schematisch diese Aufteilung.
Diese Trennung ist sinnvoll, da eine physische Zeile zusätzliche Zeichen
enthält, die die Interpretation behindern. Solche Zeichen sind zum Beispiel
Leerzeichen, die zum Auffüllen einer physischen Zeile benutzt werden, damit
ein einzelnes Datenfeld nicht auf zwei Zeilen verteilt wird (vgl. Abschnitt
2.2.2). Weitere nur in der physischen Zeile vorkommende Zeichen sind die
40 KAPITEL 4. EINLESEN EINER GDF-DATEI IN DIE DATENBANK
Programm
Scanner
log. Zeile
Parser
phys. Zeile
GDF−
Datei
DEL−
Dateien
Abbildung 4.3: Komponenten des Einleseprogramms
Nullen oder Einsen an der 80. Position (Fortsetzungmarke) und die zwei
Nullen, mit denen die Fortsetzung einer geteilten logischen Zeile eingeleitet
wird. Zum Parser hin sind diese Zeichen nicht sichtbar. Der Parser greift
zum Lesen von Datenfeldern über Methoden des Scanners auf die eingelesene
Zeile zu. Somit konzentriert sich das Wissen über die in einer logischen Zeile
gespeicherten Daten im Parser.
4.3.2
Funktionsweise des Scanners
In diesem Abschnitt geht es um die Scanner-Komponente des Programms
zum Verarbeiten von GDF-Dateien. Diese Komponente arbeitet direkt auf
den GDF-Dateien und unterhalb der Parser-Komponente. Zusammengefasst
bildet diese Komponente die Schnittstelle zu den logischen Zeilen einer GDFDatei.
Der Scanner besitzt zum einen eine Methode zum Lesen der nächsten
logischen Zeile und zum anderen Methoden zum Auslesen bestimmter Bereiche einer logischen Zeile. Der Begriff logische Zeile ist hier eigentlich nicht
ganz korrekt, da sich nach dem Auslesen dieser noch immer Füll- und Steuerzeichen4 darin befinden. Da diese jedoch nur innerhalb des Scanners eine
Rolle spielen und nach außen nicht sichtbar werden, ist der Begriff dennoch
anwendbar.
Der Ablauf der in Abbildung 4.4 dargestellten Methode getNextLine soll
nun erläutert werden. Nachdem die GDF-Datei geöffnet wurde, werden zum
Einlesen einer logischen Zeile solange physische Zeilen zusammengefügt, bis
die 80. Position einer physischen Zeile das Zeichen ’0’ enthält. Das Lesen
4
Im Folgenden werden diese Zeichen nur noch als Füllzeichen bezeichnet.
4.3. VERARBEITUNG EINER GDF-DATEI
41
einer physischen Zeile erfolgt ohne die Zeilenendezeichen. Die logische Zeile
wird solange in einem lokalen Puffer gehalten, bis die nächste logische Zeile
angefordert wird. Konnte aus der GDF-Datei eine logische Zeile extrahiert
werden, liefert diese Methode den Wert wahr (true) ansonsten falsch (false).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Methode getNextLine (void)
: returns boolean
begin
t = ∅; /* temporärer Puffer für physischen Zeile */
p = ∅; /* lokaler Puffer für die logische Zeile */
t = Lese nächste Zeile aus der Datei;
if (Dateiende) then
return (false);
end;
Hänge t an p an;
while (t[79] <> ’0’ and not Dateiende)
t = Lese nächste Zeile aus der Datei;
Hänge t an p an;
end;
return (true);
end
Abbildung 4.4: Einlesen einer logischen Zeilen
Aufgrund der Füllzeichen in der so gewonnenen logischen Zeile ist ein
einfaches Übertragen der Rekordspezifikationen auf die logische Zeile nicht
möglich, d.h., einzelne Datenfelder können nicht direkt aufgrund ihrer Position und Länge in der logischen Zeile ausgelesen werden. Deshalb wurden spezielle Methoden implementiert, die die zu überlesenden Zeichen zählen und
zu der Positionsangabe beim nächste Auslesen von Datenfeldern hinzuaddieren. Um eine korrekte Zählung zu gewährleisten, müssen alle Datenfelder
durchgängig von vorne nach hinten ausgelesen werden. Eine Vorausberechnung, wie viele Zeichen in der i-ten physischen Zeile einer logischen Zeile
hinzugefügt wurden, ist im Allgemeinen nicht möglich, da in den Rekordspezifikation häufig sich wiederholende Datenfelder auftreten (vgl. Abschnitt
2.2.1) und die Anzahl der Wiederholungen nicht deterministisch ist.
Gerade die Häufigkeit dieser sich wiederholender Datenfelder begründet
die Implementation von Methoden, die mehrere Datenfelder nach einem Aufruf an den Parser zurückgeben können. Anhand der Methode readNumber soll
das Prinzip näher erläutert werden.
Die Methode in Abbildung 4.5 nimmt als Parameter die Anzahl der zu
42 KAPITEL 4. EINLESEN EINER GDF-DATEI IN DIE DATENBANK
lesenden Zahlen, die Position bezüglich der logischen Zeile5 , an der die erste
Zahl zu lesen ist, die Anzahl der Zeichen (Länge) einer Zahl und ein Feld
Ergebnis der Länge Anzahl, das die gelesenen Zahlen aufnimmt.
1
2
3
4
5
6
7
8
9
10
11
12
13
Methode readNumber (Anzahl, Position, Länge, Ergebnis[])
: returns Anzahl gelesener Zahlen
begin
Addiere zur Position #Füllzeichen;
for i = 0 to Anzahl - 1 do
if (nächstes Datenfeld passt nicht auf physische Zeile) then
Berechne die Anzahl der Füllzeichen neu;
Addiere zur Position #hinzugekommener Füllzeichen;
end;
Ergebnis[i] = Zahl an Position mit Länge Zeichen;
end;
return (i);
end
Abbildung 4.5: Auslesen von Datenfeldern aus einer logischen Zeile
Im GDF-Standard ist vorgesehen, dass Datenfelder nicht benutzt zu werden brauchen und somit Null-Werte enthalten. Hierfür sind Methoden vorgesehen, die zusätzlich zum Ergebnis-Feld ein Indikatorfeld entsprechend des
Vorhandenseins eines Wertes füllen.
4.3.3
Funktionsweise des Parsers
Oberhalb des Scanners arbeitet die Parser-Komponente. Diese enthält implizit sämtliche Rekordspezifikationen. Auf Grundlage des vorliegenden Rekordtyps der vom Scanner gelesenen logischen Zeile extrahiert diese Komponente
die Datenfelder und schreibt die Daten in DEL-Dateien. In diesem Teil wird
die Funktionsweise dieser Komponente näher vorgestellt.
Ein zentraler Bestandteil dieser Komponente ist eine Schleife (Hauptschleife), die bis zum Erreichen des Dateiendes nacheinander alle logischen
Zeilen vom Scanner lesen lässt und anschließend je nach Rekordtyp in Unterroutinen verzweigt. In diesen werden dann die Datenfelder ausgelesen und
in DEL-Dateien hinausgeschrieben.
Für jeden Rekordtyp wurde also eine spezielle Methode implementiert,
die analog zur Rekordspezifikation die Datenfelder aus der logischen Zeile
5
ohne Füllzeichen, usw.
4.4. VORGEHEN BEIM EINLESEN DER KOORDINATEN
43
ausliest. Wie bereits früher beschrieben, wird für den Zugriff auf die logische
Zeile ausschließlich Methoden des Scanners verwendet. Damit sich die Anzahl
der Methodenaufrufe reduziert, wird nach der Bearbeitung einer logischen
Zeile zunächst geprüft, ob der Rekordtyp der nächsten derselbe ist. Falls
dem so ist, kann auf die Rückkehr in die Hauptschleife verzichtet werden.
Die Tatsache, dass die Koordinaten eines Knotens, einer Linie oder Fläche
nicht zusammen in einem Rekord abgespeichert werden, erfordert ein Zwischenspeichern der Koordinatendaten, d.h., die von den Knoten- (KNOTREC), Linien- (NEDGEREC6 ) oder Flächenrekords (FACEREC) wird auf
ein Koordinatenrekord (XYZREC) mittels eines Identifikators verwiesen (vgl.
Abschnitt 2.2.3). Nur durch die Auflösung dieser Referenz erreicht man die
eigentlichen Koordinaten, die in dem vorliegenden Datenbankentwurf zusammen mit dem jeweiligen räumlichen Objekt abgespeichert werden. Dieses
Vorgehen ist auch wegen der Reihenfolge des Auftretens der Rekords in einer
GDF-Datei notwendig — die Koordinatenrekords stehen vor den anderen Datenrekords. Für das Zwischenspeichern werden Maps aus der STL benutzt.
Eine Map implementiert einen B-Baum, der Schlüssel-Wert-Paare abspeichern kann. Dies gewährleistet einen schnellen Zugriff auf die Daten.
Anhand eines Beispiels soll die Funktionsweise verdeutlicht werden —
das Auslesen aller anderen Rekordtypen erfolgt analog. Die Abbildung 4.6
skizziert die Verarbeitung eines Knotenrekords. Zunächst werden mit Hilfe
von Methoden des Scanners (z. B. readNumber()) aus der logischen Zeile die
Knoten- und die Koordinaten-ID ausgelesen. Die Koordinaten-ID referenziert
einen Rekord in dem sich die tatsächlichen Koordinaten befinden. Danach
erfolgt das Auflösen dieser Referenz über eine Methode (find()), die durch
die STL bereitgestellt wird. Anschließend wird ein Wertepaar in eine andere
Map eingefügt, die für spätere Referenzauflösungen in einem anderen Kontext
benötigt wird. Hiernach können die so extrahierten Datenfelder in eine DELDatei geschrieben werden. Zuletzt wird der Scanner aufgefordert, die nächste
logische Zeile in seinen lokalen Puffer zu laden und es wird überprüft, ob die
neue Zeile den selben Rekordtyp besitzt. Sollte dies der Fall sein, so kann in
dieser Routine verblieben werden.
4.4
Vorgehen beim Einlesen der Koordinaten
Da die Koordinaten mittels des DB2 Spatial Extenders verwaltet werden,
werden natürlich auch die bereitgestellten Datentypen genutzt. Dieser Abschnitt diskutiert die Möglichkeiten für die Konvertierung der aus der GDFDatei extrahierten Koordinaten in das Format des DB2 Spatial Extender
6
Das ’N’ am Anfang steht auch im GDF-Standard.
44 KAPITEL 4. EINLESEN EINER GDF-DATEI IN DIE DATENBANK
1
2
3
4
5
6
7
8
9
10
11
Methode parseNode (void)
: returns void
begin
do
Lese Knoten-ID;
Lese Koordinaten-ID;
Finde Koordinaten-ID in Koordinaten-Map;
Füge (Knoten-ID, Koordinaten-ID) in Knoten-Map ein;
Schreibe in Knoten-Datendatei (Knoten-ID, Koordinaten);
while (scanner.getNextLine() and Rekordtyp = KNOTREC);
end
Abbildung 4.6: Parsen eines Knotenrekords
und auch dem damit verbundenen Transfer in die Datenbank. Dazu müssen
die Koordinaten zuerst kodiert und dem DB2 Spatial Extender übermittelt
werden.
Zunächst soll erläutert werden, wie die Koordinatendaten zu strukturieren sind, damit diese in die Datenbank übertragen werden können. Der DB2
Spatial Extender stellt hierfür unterschiedliche Funktionen zur Verfügung,
die jedoch ähnlich funktionieren. Prinzipiell werden die Koordinaten in einem bestimmten Datenformat kodiert und anschließend einer gespeicherten
Datenbankprozedur übergeben. Die damit in ein internes Datenformat transformierten Daten werden in der Datenbank abgelegt.
DB2 Spatial Extender unterstützt drei Datenformate. Dabei handelt es
sich bei dem ersten um eine ASCII- und bei den anderen um eine Binärdarstellung.
• OGC 7 well-known text representation
• OGC well-known binary8 representation
• ESRI shape representation
Die Textrepräsentation eines räumlichen Objekts lässt sich verhältnismäßig einfach erzeugen; es werden nach dem Objekttyp nur noch die Koordinaten angegeben (vgl. Beispiel 4.1). Jedoch können Objekte mit besonders
vielen Koordinaten nicht in diesem Datenformat in die Datenbank übertragen werden, da die Länge der Zeichenkette durch die gespeicherte Datenbankprozedur auf 4000 Zeichen — der entsprechende Eingabeparameter ist
7
8
Abkürzung für Open GIS Consortium
kurz: WKB
4.4. VORGEHEN BEIM EINLESEN DER KOORDINATEN
45
als VARCHAR(4000) definiert — beschränkt ist. Im Allgemeinen sind in einer
GDF-Datei jedoch Polygone enthalten, die eine längere Zeichenkette erfordern. In solchen Fällen muss auf jeden Fall die binäre Kodierung verwendet
werden.
Beispiel 4.1 (Textrepräsentation eines Linienzuges)
Ein Linienzug, der durch die Punkte (10.05, 10.28), (20.59, 31.98) und
(21.98, 29.80) definiert ist, wird wie folgt als Text kodiert:
linestring ( 10.05 10.28, 20.59 31.98, 21.98 29.80 )
Eine binäre Repräsentation serialisiert ein räumliches Objekt auf ByteEbene. Es ist mit der binären Kodierung von Zeichen in einem Computer
vergleichbar. Hiermit können auch Objekte bestehend aus besonders vielen
Koordinaten übertragen werden; die Grenze liegt bei einer Größe von 1 MB.
Detaillierte Beschreibungen der ASCII- und Binärkodierungen für räumliche Objekte können in [IBM00a] nachgelesen werden.
Die Verwendung des DB2 Spatial Extenders bedeutet gleichzeitig, dass die
Koordinaten nicht einfach mittels des LOAD-Befehls geladen werden können,
da es sich bei den bereitgestellten Datentypen um strukturierte Datentypen
handelt. Es musste also ein alternativer Weg gefunden werden.
Eine Möglichkeit, die Koordinaten räumlicher Objekte in die Datenbank
zu übertragen, ist der direkte Weg über eine Datenbankverbindung mit Hilfe einer INSERT-Anweisung. Weiter oben ist bereits beschrieben, dass diese
Methode recht langsam arbeitet und deshalb nur in besonderen Situationen
(z. B. eine geringe Anzahl räumlicher Objekte) anwendbar ist.
Da die vom DB2 Spatial Extender Importfunktion auf dem gleichen Prinzip wie der IMPORT-Befehl beruht, ist hierdurch keine Verbesserung zu erzielen.
Der bisher erfolgversprechendste Weg verläuft nach folgendem Schema.
Zuerst wird aus den Koordinaten der GDF-Datei die Textrepräsentation erzeugt und diese in eine DEL-Datei geschrieben. Diese Tabelle kann durch
die LOAD-Hilfsroutine in die Datenbank eingelesen werden. Dabei wird die
Textrepräsentation auf den Basisdatentyp VARCHAR(4000) abgebildet. Eine anschließende INSERT ... SELECT-Anweisung mit integriertem Aufruf
der DB2 Spatial Extender Konvertierungsroutine arbeitet um ein vielfaches
schneller. Es liegt die Vermutung nahe, dass auf Grund geringerer Datenbewegungen im Speicher Zeit gewonnen wird.
Wie bereits weiter oben aufgezeigt, besitzen manche Polygone so viele Ecken, dass sie nicht in der Textrepräsentation kodiert werden können.
Es wird also die binäre Kodierung verwendet. Da ein Binärstring nicht wie
46 KAPITEL 4. EINLESEN EINER GDF-DATEI IN DIE DATENBANK
ein String in einer DEL-Datei behandelt werden kann9 , muss jeder derartige
Binärstring in einer extra Datei abgelegt werden. Diese können dann wiederum mittels der LOAD-Hilfsroutine als LOB eingelesen werden. Das Erzeugen
der Binärdateien ist auch der Grund dafür, weshalb man nicht grundsätzlich
binär kodieren kann. Durch die sehr große Anzahl an Dateien ist eine schnelle
Verarbeitung nicht mehr möglich.
Befinden sich zum Beispiel die Textrepräsentationen von räumlichen Objekten in der Tabelle rawNode mit den Spalten ID (BIGINT) und Coordinate (VARCHAR(4000)), und das Ziel ist die Tabelle node mit den Spalten
ID (BIGINT) und Coordinate (db2gse.st point), so transformiert folgende SQL-Anweisung10 die Koordinaten in das entsprechende Format. Analog
kann auch mit LOBs verfahren werden.
INSERT INTO node
SELECT id, st pointFromText(coord, coordref()..srid(0))
FROM rawNode
Trotzdem treten insbesondere beim Einlesen von Flächen (Polygonen)
Probleme auf, die durch die Daten selbst verursacht werden. Zum Teil sind
die Daten wahrscheinlich fehlerhaft (sich selbst schneidene oder nicht geschlossene Polygone) oder der Begriff Polygon wird in der GDF-Datei anders
ausgelegt als im DB2 Spatial Extender. Bei Nichtbeachtung dieser Probleme
gehen sogar bei der Transformation Information verloren.
Sehr häufig treten in einer GDF-Datei Polygone auf, die nach innen gehende Kanten haben, wie in Abbildung 4.7 dargestellt. Diese hineinragenden
Kanten werden jedoch vom DB2 Spatial Extender ersatzlos entfernt wie im
Abbildung 4.8 veranschaulicht. Offensichtlich gehen dadurch Informationen
verloren. Eine zufriedenstellende Lösung für dieses Problem wurde noch nicht
gefunden. Ein Ansatz, um trotzdem auf diese weggeworfenen Koordinaten
zugreifen zu können, könnte zum Beispiel das separate und somit zusätzliche Speichern der Punkte der hineinreichenden Kanten oder des gesamten
Polygons sein.
Diese hineinragenden Kanten erschweren außerdem das Erkennen von
Ringen (vgl. Def. 2.9) in einem Polygon. Das Erkennen von Ringen ist notwendig, um die entsprechende Kodierung erzeugen zu können. Da Polygone
sich nicht selbst schneiden dürfen, zeichnet sich ein Ring dadurch aus, dass
der Anfangs- und Endpunkt derselbe ist. Trifft nun der Algorithmus gleich
zu Anfang auf eine hineinragende Kante, so ist der dritte Punkt gleich dem
ersten und somit wird fälschlicherweise ein Ring identifiziert. Ein Objekt mit
drei Punkten, wobei der erste gleich dem letzten ist, ist kein Polygon.
9
10
Es gibt kein Zeichen, mit dem man einen Binärstring klammern kann
Dabei wird angenommen, dass sich das Schema db2gse im Funktionenpfad befindet.
4.5. LADEN DER DEL-DATEIEN
47
Abbildung 4.7: Polygon in der GDFDatei
Abbildung 4.8: resultierendes Polygon in der Datenbank
Die oben geschilderten fehlerhaften Daten verursachen zudem einen Abbruch und damit ein Zurücksetzen der INSERT ... SELECT-Anweisung, da
die Konvertierungsroutine einen Fehler zurückliefert. Wenn man nicht vorher
sicherstellen kann, dass die Polygone fehlerfrei sind, bleibt in dieser Situation
nichts anderes übrig, als tupelweise die Daten in die Datenbank einzulesen.
Somit bietet sich bei einem Fehler die Möglichkeit, das Polygon näher zu
untersuchen und gegebenenfalls zu berichtigen. Dieses Prinzip kann sowohl
als Applikation oder gespeicherte Datenbankprozedur implementiert werden.
4.5
Laden der DEL-Dateien
Nach der Generierung der DEL-Dateien müssen diese nun in die Datenbank
hineingeladen werden. Wie in Abschnitt 3.3.2 schon aufgezeigt, müssen außerdem die Datentabellen in einem entsprechenden Schema angelegt werden.
Dieser Vorgang wird im folgenden Abschnitt näher beschrieben.
Das Laden der DEL-Dateien wird von einem Shell-Skript gesteuert. Dieses Skript arbeitet in zwei Phasen. In der ersten werden die Daten- und
temporäre Tabellen in einem neuen Schema angelegt, das den Namen der
gerade einzulesenden Sektion erhält. Dazu wird das Token ’ ?’ in den SQLSkripten mittels sed (Stream Editor) durch den Namen der Sektion substituiert und anschließend von DB2 ausgeführt. In der darauffolgenden Phase
werden die DEL-Dateien nacheinander mit Hilfe der LOAD-Hilfsroutine in
die Datenbank geladen. Die Koordinaten werden, wie in Abschnitt 4.4 vorgestellt, zunächst in einer temporären Tabellen abgelegt und dann in das
DB2 Spatial Extender Format überführt. Als letztes werden die temporären
Dateien wieder gelöscht.
Der Ablauf des Skriptes sieht also folgendermaßen aus:
Das Shell-Skript nimmt als Parameter den neuen Schemanamen, einen
Datenbankalias sowie eine NutzerID mit seinem Passwort. Alle Anweisungen
für die Erzeugung und das Laden der Dateien sind bereits in jeweils einem
SQL-Skript zusammengefasst. Es muss lediglich das Token ’ ?’ substituiert
48 KAPITEL 4. EINLESEN EINER GDF-DATEI IN DIE DATENBANK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Programm loadData (Schema, DB-Alias, Nutzer, Passwort)
: returns Fehlercode
begin
# Phase 1
CONNECT TO DB-Alias USER Nutzer USING Passwort;
Erzeuge Datenbanktabellen in Schema;
Erzeuge temporäre Tabellen in Schema;
# Phase 2
Lade Daten alle Daten bis auf Koordinaten;
Lade Koordinaten in temporäre Tabellen;
Konvertiere Koordinaten;
Lösche temporäre Tabellen;
DISCONNECT;
end
Abbildung 4.9: Einlesen der DEL-Dateien
werden; in diesen Zeilen erfolgt demzufolge auch ein Aufruf von sed.
Kapitel 5
Zusammenfassung und
Auswertung
Insgesamt soll ein datenbankgestütztes Geo-Informationssystem zur performanten Verwaltung kartographischer Daten entwickelt werden, wobei durch
Integration verschiedener Datenquellen der Mehrwert einer Visualisierung
erhöht wird. Im Vordergrund steht hierbei auch die effiziente Beantwortung
von Bereichsanfragen, um eine rasche Visualisierung unterschiedlicher Kartenausschnitte zu gewährleisten. Am Anfang konnten die Anforderungen an
die Datenbank und das System nur allgemein formuliert werden. Im weiteren Verlauf konkretisierten sich unter anderem auch durch die Evaluation
früherer Versionen die Vorstellungen und Erwartungen.
Die Grundlage eines derartigen Systems bildet ein Datenbankschema für
die Verarbeitung und Speicherung von GDF-Daten. In dieser Studienarbeit
wurde ein solches Datenbankschema konzipiert und für das Datenbankmanagementsystem DB2 UDB V7.1 realisiert. Eine Verfeinerung und Ergänzung
des allgemeinen Referenzmodell des GDF-Standards bildet hierfür die Basis.
Der Datenbankentwurf beschreibt zunächst nur die wesentlichen Aspekte der
in GDF-Dateien gespeicherten Informationen. Zum Beispiel sind benutzerdefinierte Feature noch nicht vollständig integriert.
Besondere Anforderungen an das DBMS stellte die Speicherung und Indizierung räumlicher Objekte, da zweidimensionale Datenbestände nicht hinreichend mit den üblichen B-Bäumen indiziert werden können. Eine mögliche
Lösung hierfür ist die Verwendung des DB2 Spatial Extenders, der das DBMS
um räumliche Datentypen und Funktionalität erweitert. Der DB2 Spatial Extender benutzt zur Indizierung der räumlichen Objekte einen mehrstufigen
Gitterindex. Hierbei werden über das betrachtete Gebiet Gitternetze unterschiedlicher Größe gelegt und Schnittpunkte mit den minimalen umschreibenden Rechtecken von räumlichen Objekten in einem Index eingetragen.
49
50
KAPITEL 5. ZUSAMMENFASSUNG UND AUSWERTUNG
Da die Daten im GDF-Format vorliegen, war zuerst eine Einarbeitung
in den konzeptionellen Aufbau und die physische Speicherung einer GDFDatei notwendig. Dabei erwiesen sich zusätzlich eingefügte Leerzeichen bei
der physischen Speicherung der Datenrekords beim Einlesen als hinderlich.
Für den Transfer der Daten aus den GDF-Dateien in die Datenbank
wurden in diesem Kontext entsprechende Werkzeuge implementiert. Das
Hauptaugenmerk liegt hierbei auf dem schnellen Extrahieren und Einlesen
der Daten aus den GDF-Dateien. Aus diesem Grund werden mittels eines
Programms entsprechend den Tabellen im Datenbankschema DEL-Dateien
erzeugt. Anschließend lädt das LOAD-Hilfsprogramms von DB2 die DELDateien in die Tabellen. Diese Methode des Datentransfers erwies sich im
Zusammenhang mit DB2 als besonders zeitsparend. Ein weiterer sich daraus
ergebender Vorteil ist die Unabhängigkeit des Werkzeugs vom DBMS, da im
Allgemeinen jedes DBMS über Möglichkeiten zum Einlesen von DEL-Dateien
verfügt. Als schwierig erwies sich hierbei die Übergabe der Koordinaten an
den DB2 Spatial Extender. Das konnte bisher nur unbefriedigend durch einen
Umweg über das Zwischenspeichern einer textuellen bzw. binären Kodierung
der räumlichen Objekte in temporären Tabellen und darauf folgender Konvertierung gelöst werden.
5.1
Fortführung der Studienarbeit
Im Rahmen einer Studienarbeit ist es nicht möglich, alle Aspekte eines datenbankgestützten Geo-Informationssystems mit Integration unterschiedlicher
Datenquellen zu untersuchen oder zu realisieren. In diesem Kapitel wird zusammengefasst, wie die in der Studienarbeit gelegte Basis erweitert und somit
zu einem umfassenden GIS ausgebaut werden kann. Weiterhin werden in der
Studienarbeit herauskristallisierte Probleme aufgegriffen.
Ein wichtiger Punkt stellt die Realisierung der in der Studienarbeit entwickelten Konzepte in zumindest einem anderen DBMS dar, um dadurch
eine objektivere Bewertung des System auf Basis von DB2 UDB V7.1 vornehmen zu können. Unsystematische, parallel durchgeführte Tests unter dem
DBMS Oracle zeigen, dass DB2 UDB V7.1 mit der Erweiterung DB2 Spatial
Extender für den Einsatz in der Entwicklungsumgebung der Firma Vivatech
Software Berlin GmbH nicht unbedingt die beste Lösung darstellt.
Erste Untersuchungen zeigen, dass DB2 UDB V7.1 nur ein unzureichendes Interface zu Java implementiert. Hauptsächlich werden die Koordinatenlisten aus dem DB2 Spatial Extender mittels der LOB Datentypen übertragen, die jedoch im Allgemeinen eher für Sprachen der dritten Generation
— also für Sprachen die C-ähnliche Strukturen implementieren — geeignet
5.1. FORTFÜHRUNG DER STUDIENARBEIT
51
sind [IBM00a]. Ein weiteres in diesem Zusammenhang auftretendes Problem
ist, dass für das Auslesen der Koordinatenlisten aus den LOBs mittels Java
zunächst ein Konvertierung von der Little Endian zu der Big Endian Repräsentation vorgenommen werden muss. Zusammengefasst wird hier ein effizienterer Mechanismus zur Datenübertragung benötigt. Zum Beispiel wäre
zu entscheiden, ob eine eigene Implementation der räumlichen Erweiterung in
DB2 UDB V7.1, die derartige Konvertierungsprobleme umgeht, Sinn macht
oder ob auf ein anderes DBMS ausgewichen werden sollte.
Ein anderer Ansatzpunkt für eine Weiterentwicklung im Bereich der hier
vorgestellten Werkzeuge zum Einlesen der GDF-Dateien bildet die Korrektur fehlerhafter Koordinaten von räumlichen Objekte. Wie in Kapitel 4.4 beschrieben, treten insbesondere bei Einlesen der Flächen (Polygone) Probleme
mit den Daten auf. In diesem Kontext ist es überlegenswert, Methoden zu
schaffen, die bereits während des Parsens einer GDF-Datei die räumlichen
Objekte auf Validität prüfen und gegebenenfalls Anpassungen vornehmen.
Des Weiteren ist noch nicht klar, ob ausschließlich die korrigierten Objekte in der Datenbank gespeichert werden oder auch noch zusätzliche Informationen, aus denen sich die Daten des ursprünglich fehlerhaften Objektes
wiederherstellen lassen.
Bisher außer Acht gelassen wurde die geeignete Erstellung von (materialisierten) Views oder Indizes. Diese Konzepte ermöglichen dann die Vermeidung von Joinoperationen und dadurch einen schnelleren sowie einfacheren
Zugriff auf die Daten. Sinnvoll ist auch eine weitere Untersuchung des Integrationsaspekts, indem von GDF verschiedene Datenquellen in die Basis
eingeflochten werden und entsprechende Anfragen an das System gestellt
werden. Erst hiernach ist eine vollständige Evaluation des Gesamtsystems
möglich.
Anhang A
Das Entity Relationship Modell
In diesem Anschnitt wird die in der Studienarbeit verwendete Entity Relationship1 Notation näher erläutert. Die in [Fre99] vorgestellte Notation bildet
dabei die Grundlage.
A.1
Entity und Entity-Typ
Ein Entity ist ein gerade betrachteter Gegenstand aus der realen Welt. In der
Modellierung werden Entities mit gleichen Eigenschaften zu Entity-Typen
zusammengefasst. Wie in Abbildung A.1 gezeigt, wird ein Entity-Typ durch
ein Rechteck dargestellt.
Entity
Abbildung A.1: Entity-Typ
A.2
Attribut und Attributtyp
Attribute sind Eigenschaften eines Entity und gleichartige Attribute werden in Attributtypen zusammengefasst. Dargestellt werden diese durch eine
Ellipse (s. Abbildung A.2). Kann ein Attribut mehrere Werte gleichzeitig annehmen (mehrwertig oder auch multi valued), so wird dies durch doppelte
Umrandung gekennzeichnet.
Wenn ein Attribut der Schlüssel eines Entity ist, so wird der Name des
Attributs in eckige Klammer gesetzt.
1
kurz: ER
52
A.3. BEZIEHUNG UND BEZIEHUNGSTYP
Attribut
53
Attribut
[Attribut]
Abbildung A.2: Attributtypen (atomar/mehrwertig/Schlüsselattribut)
A.3
Beziehung und Beziehungstyp
Besteht zwischen zwei Entities eine semantische Verbindung, so kann dies
als Beziehung veranschaulicht werden. Beziehungen derselben Art werden in
Beziehungstypen zusammengefasst. Die graphische Notation ist eine Raute
(s. Abbildung A.3).
Entity A
Beziehung
M
Entity B
N
Abbildung A.3: Beziehungstyp
A.3.1
Grad
Der Grad eines Beziehungstyps gibt an, wie viele Entity-Typen in diesem
partizipieren (binär, tertiär, usw.).
A.3.2
Kardinalität
Die Kardinalität bestimmt die Anzahl der Beziehungsinstanzen, in der ein
Entity teilnehmen kann. Tabelle A.1 zeigt wie die Kardinalitäten in einem
Diagramm interpretiert werden. Ein Beispiel für die Darstellung von Kardinalitäten bietet Abbildung A.3.
A.3.3
Totalität
Die Totalität drückt aus, ob ein Entity an einer Beziehung teilnehmen muss.
Als graphische Darstellung wird ein Querbalken auf der Verbindungslinie
zwischen Entity-Typ und Beziehungstyp benutzt. Dies ist in Abbildung A.3
beim Entity-Typ A zu erkennen. Ist auf der Seite eines Entity-Typs ein
solcher Querbalken eingetragen, so bedeutet dies, dass jede Instanz dieses
Entity-Typs an der entsprechenden Beziehung teilnehmen muss (totale Beteiligung). Ansonsten braucht die Instanz eines Entity nicht an der Beziehung
teilnehmen (partielle Beteiligung).
54
ANHANG A. DAS ENTITY RELATIONSHIP MODELL
A
1
B
1
1
M
N
M
Interpretation
Ein Entity des Typs A steht mit genau einem Entity des Typs
B und ein Entity des Typs B steht mit genau einem Entity
des Typs A in Beziehung.
Ein Entity des Typs A kann mit mehreren Entities des Typs
B in Beziehung stehen, aber ein Entity des Typs B steht mit
genau einem Entity des Typs A in Beziehung.
Ein Entity des Typs A kann mit mehreren Entities des Typs
B und ein Entity des Typs B kann mit mehreren Entities des
Typs A in Beziehung stehen.
Tabelle A.1: Interpretation der Kardinalitäten
Das Beispiel wird so interpretiert, dass jede Instanz des Entity-Typs A
an der Beziehung mit einer Instanz des Entity-Typ B teilnehmen muss. Auf
der anderen Seite kann (muss aber nicht) jede Instanz des Entity-Typs B an
der Beziehung teilzunehmen.
A.4
Spezialisierung und Generalisierung
Ausgehend von mehreren Entity-Typen mit gemeinsamen Attributen kann
ein neuer Entity-Typ erzeugt werden, der nur die gemeinsamen Attribute
besitzt. Diesen Vorgang nennt man Generalisierung. Den umgekehrten Vorgang, also die Bildung neuer Entity-Typen aus einem bereits vorhandenen,
wird als Spezialisierung bezeichnet. Die Generalisierung und Spezialisierung
werden durch ein Dreieck symbolisiert (s. Abbildung A.4).
Insbesondere übernehmen die spezialisierten Entity-Typen alle Attribute
und Schlüssel des Basisentity-Typs. Besitzt die Spezialisierung einen anderen
Schlüssel als die Basis, so wird dieser beim spezialisierten Entity-Typ mit
angegeben.
Entity
Entity
Abbildung A.4: Spezialisierung und Generalisierung
Anhang B
Data Definition Language
B.1
Einzigartige Datentypen
Die untenstehende Tabelle enthält die definierten einzigartigen Datentypen,
deren Basistyp und deren Einsatz. Diese Datentypen sind alle im Schema meta definiert. Um die Operatoren der neuen Datentypen wie bei den Standarddatentypen benutzen zu können, muss sich das Schema meta im Suchpfad für
Funktionen befinden. Dazu ist das Kommando SET PATH = CURRENT PATH,
meta auszuführen.
einzig. Datentyp
dt id
dt featureKlasse
dt featureKategorie
dt relationshipCode
dt
dt
dt
dt
dt
dt
attributeCode
attributeValue
nameValue
languageCode
externalCode
description
B.2
Basistyp
BIGINT
SMALLINT
SMALLINT
SMALLINT
Anwendung
IDs der Datensätze
Kodierung der Feature-Klasse
Kodierung der Feature-Kategorie
Kodierung des Typs der semantischen Beziehung
CHAR(2)
Kodierung des Attributtyp
VARCHAR(100) Attributwert
VARCHAR(100) Feature-Name
CHAR(3)
Sprachencode
VARCHAR(10)
externe Kodierung
VARCHAR(255) Text in den Übertragungstabellen: Code ↔ lesbarer Text
Tabellen
In diesem Abschnitt sind alle Tabellen aufgeführt. Im ersten Teil sieht man
die Tabellen für das Schema meta und im zweiten die für die kartographischen Daten. Dabei sind tabellarisch die Spaltennamen mit ihren Datenty55
56
ANHANG B. DATA DEFINITION LANGUAGE
pen, Zulässigkeit von NULL-Werten sowie eine Kurzbeschreibung dargestellt.
Der Schlüssel einer Tabellen ist hervorgehoben.
B.2.1
Metadatentabellen
Section In dieser Tabelle werden alle Informationen bezüglich einer Sektion
einer GDF-Datei abgelegt. Mit Hilfe dieser Tabelle sind auch die von einer
Bereichsanfrage betroffenen Schemata bestimmbar.
Spaltenname
ID
schema
GeoArea
XY Factor
Datentyp
dt id
VARCHAR(128)
dt description
INTEGER
null
nein
nein
ja
ja
Z Factor
X Offset
Y Offset
Z Offset
max
min
box
INTEGER
INTEGER
INTEGER
INTEGER
st point
st point
st polygon
ja
ja
ja
ja
nein
nein
nein
Kurzbeschreibung
eindeutige ID
zugehöriges Schema
Name des Gebietes
Multiplikator x- und y-Koordinaten
Multiplikator z-Koordinate
Verschiebung x-Koordinate
Verschiebung y-Koordinate
Verschiebung z-Koordinate
rechte obere Ecke der BB
linke untere Ecke der BB
Bounding Box
FeatureKategorie Die Tabelle ermöglicht die Umsetzung der Kodierung
einer Feature-Kategorie in lesbaren Text und umgekehrt.
Spaltenname
featureKategorie
Datentyp
dt featureKategorie
null
nein
externalCode
description
dt externalCode
dt description
ja
nein
Kurzbeschreibung
Kodierung für Feature-Kategorien lt. GDF-Standard
externe Kodierung
Feature-Kategorie als Text
FeatureKlasse Die Tabelle ermöglicht die Umsetzung der Kodierung einer
Feature-Klasse in lesbaren Text und umgekehrt.
Spaltenname
featureKlasse
Datentyp
dt featureKlasse
null
nein
externalCode
description
dt externalCode
dt description
ja
nein
Kurzbeschreibung
Kodierung
für
FeatureKlassen lt. GDF-Standard
externe Kodierung
Feature-Klasse als Text
B.2. TABELLEN
57
RelationshipCode Die Tabelle ermöglicht die Umsetzung der Kodierung
einer semantischen Beziehung in lesbaren Text und umgekehrt.
Spaltenname
relationshipCode
Datentyp
null
dt relationshipCode nein
externalCode
description
dt externalCode
dt description
ja
nein
Kurzbeschreibung
Kodierung für semant. Beziehungen lt. GDF-Standard
externe Kodierung
semant. Beziehung als Text
RelationshipParts Diese Tabelle gibt Auskunft über die teilnehmenden
Features und an welcher Stelle sie auftreten.
Spaltenname
relationshipCode
Datentyp
null
dt relationshipCode nein
position
featureKlasse
SMALLINT
dt featureKlasse
nein
nein
Kurzbeschreibung
Kodierung für semant. Beziehungen lt. GDF-Standard
Stelle in der Beziehung
teilnehmende Feature-Klasse
AttributeCode Die Tabelle ermöglicht die Umsetzung der Kodierung eines Attributes in lesbaren Text und umgekehrt.
Spaltenname
attributeCode
Datentyp
dt attributeCode
null
nein
externalCode
description
dt externalCode
dt description
ja
nein
Kurzbeschreibung
Kodierung für Attribute lt.
GDF-Standard
externe Kodierung
Attribut als Text
LanguageCode Die Tabelle ermöglicht die Umsetzung der Kodierung einer Sprache in lesbaren Text und umgekehrt.
Spaltenname
languageCode
Datentyp
dt languageCode
null
nein
externalCode
description
dt externalCode
dt description
ja
nein
B.2.2
Kurzbeschreibung
Kodierung für Sprachen nach
MARC Sprachcodes
externe Kodierung
Sprache als Text
Datentabellen
ComplexFeature Die Tabelle enthält die Basisinformationen zu einem
komplexen Feature.
Spaltenname
ID
FeatureKlasse
Datentyp
dt id
dt featureKlasse
null
nein
nein
Kurzbeschreibung
Identifikator
Feature-Klasse
58
ANHANG B. DATA DEFINITION LANGUAGE
SimpleFeature Die Tabelle enthält die Basisinformationen zu einem simplen Feature. Hier sind Punkt-, Linienzug, und Gebiets-Feature zusammengefasst.
Spaltenname
ID
FeatureKategorie
FeatureKlasse
Datentyp
dt id
dt featureKategorie
dt featureKlasse
null
nein
nein
nein
Kurzbeschreibung
Identifikator
Feature-Kategorie
Feature-Klasse
Node Die Tabelle enthält die Koordinaten für die Knoten.
Spaltenname
ID
Coordinate
Datentyp
dt id
st point
null
nein
nein
Kurzbeschreibung
Identifikator
Koordinate
Edge Die Tabelle enthält die Koordinaten für die Linien.
Spaltenname
ID
LeftFaceID
Datentyp
dt id
dt id
RightFaceID
dt id
Coordinate
st lineString
null
nein
ja
ja
nein
Kurzbeschreibung
Identifikator
Identifikator von linksseitiger
Fläche
Identifikator von rechtsseitiger
Fläche
Koordinateliste
Edge Die Tabelle enthält die Koordinaten für die Flächen.
Spaltenname
ID
Coordinate
Datentyp
dt id
st polygon
null
nein
nein
Kurzbeschreibung
Identifikator
Koordinateliste
FeatureName Die Tabelle enthält die Namen-Attribute für die Feature.
Spaltenname
ID
AttributeCode
LanguageCode
Text
Datentyp
dt id
dt attributeCode
dt languageCode
dt nameValue
null
nein
nein
nein
ja
Kurzbeschreibung
Identifikator
kodierter Name des Attributs
Sprachenkodierung
Attributwert
B.2. TABELLEN
59
NameOfComplex Diese Tabelle stellt die Verbindung zwischen komplexen Feature und Namenattributen her.
Spaltenname
ComplexID
Datentyp
dt id
null
nein
NameID
dt id
nein
Kurzbeschreibung
Identifikator eines komplexen
Feature
Identifikator eines NamenAttributs
NameOfComplex Diese Tabelle stellt die Verbindung zwischen simplen
Feature und Namenattributen her.
Spaltenname
Datentyp
FeatureKategorie dt featureKategorie
SimpleID
dt id
null
nein
nein
NameID
nein
dt id
Kurzbeschreibung
Feature-Kategorie
Identifikator eines simplen
Feature
Identifikator eines NamenAttributs
FeatureAttribute Die Tabelle enthält die Attribute für die Feature.
Spaltenname
ID
AttributeCode
Value
Datentyp
dt id
dt attributeCode
dt attributeValue
null
nein
nein
ja
Kurzbeschreibung
Identifikator
kodierter Name des Attributs
Attributwert
AttributeOfComplex Diese Tabelle stellt die Verbindung zwischen komplexen Feature und Attributen her.
Spaltenname
ComplexID
Datentyp
dt id
null
nein
AttributeID
dt id
nein
Kurzbeschreibung
Identifikator eines komplexen
Feature
Identifikator eines Attributs
AttributeOfSimple Diese Tabelle stellt die Verbindung zwischen simplen
Feature und Attributen her.
Spaltenname
Datentyp
FeatureKategorie dt featureKategorie
SimpleID
dt id
null
nein
nein
AttributeID
nein
dt id
Kurzbeschreibung
Feature-Kategorie
Identifikator eines simplen
Feature
Identifikator eines Attributs
60
ANHANG B. DATA DEFINITION LANGUAGE
semanticRelation Die Tabelle enthält die Basisdaten für die semantischen
Beziehungen.
Spaltenname
Datentyp
null
semanRelationID dt id
nein
relationshipCode dt relationshipCode nein
Kurzbeschreibung
Identifikator
kodierter Name der semantischen Beziehung
RelationOfFeature Diese Tabelle ordnet einem Feature die semantischen
Beziehungen zu, an denen es beteiligt ist. Das Datenfeld Position dient der
Bestimmung der Stelle in der semantischen Beziehung.
Spaltenname
FeatureKategorie
FeatureID
semanRelationID
Datentyp
dt featureKategorie
dt id
dt id
null
nein
nein
nein
Position
SMALLINT
nein
Kurzbeschreibung
Feature-Kategorie
Identifikator eines Feature
Identifikator der zugehörigen
semantischen Beziehung
Stelle in der Beziehung
ComplexOfSimple Durch diese Tabelle werden die simplen Feature einem
daraus bestehenden komplexen Feature zugeordnet.
Spaltenname
ComplexID
Datentyp
dt id
null
nein
FeatureKategorie dt featureKategorie
SimpleID
dt id
nein
nein
Position
nein
SMALLINT
Kurzbeschreibung
Identifikator eines komplexen
Feature
Feature-Kategorie
Identifikator eines simplen
Feature
fortlaufende Nummer des simplen Feature
ComplexOfComplex Durch diese Tabelle werden die komplexen Feature
einem daraus bestehenden komplexen Feature zugeordnet.
Spaltenname
SuperComplexID
Datentyp
dt id
null
nein
SubComplexID
dt id
nein
Position
SMALLINT
nein
Kurzbeschreibung
Identifikator des entstehenden
komplexen Feature
Identifikator der untergeordneten komplexen Feature
fortlaufende Nummer des
komplexen Feature
B.2. TABELLEN
61
SimpleOfNode Diese Tabelle ordnet einem simplen Feature deren KnotenKoordinaten zu. Implizit wird die Feature-Kategorie Punkt angenommen.
Spaltenname
SimpleID
Datentyp
dt id
null
nein
nodeID
dt id
nein
Kurzbeschreibung
Identifikator eines simplen
Feature
Identifikator des zugehörigen
Knotens
SimpleOfEdge Diese Tabelle ordnet einem simplen Feature deren LinienKoordinatenlisten zu. Implizit wird die Feature-Kategorie Linie angenommen. Das Datenfeld Position dient der Erhaltung der Reihenfolge.
Spaltenname
SimpleID
Datentyp
dt id
null
nein
edgeID
dt id
nein
Direction
SMALLINT
nein
Position
SMALLINT
nein
Kurzbeschreibung
Identifikator eines simplen
Feature
Identifikator der zugehörigen
Linie
Richtung wie die Linie zu
durchlaufen ist — entweder 0
(von vorn) oder 1 (von hinten)
fortlaufende Nummer der Linie
SimpleOfFace Diese Tabelle ordnet einem simplen Feature deren FlchenKoordinatenlisten zu. Implizit wird die Feature-Kategorie Polygon angenommen. Das Datenfeld Position dient der Erhaltung der Reihenfolge.
Spaltenname
SimpleID
Datentyp
dt id
null
nein
faceID
dt id
nein
Position
SMALLINT
nein
Kurzbeschreibung
Identifikator eines simplen
Feature
Identifikator der zugehörigen
Fläche
fortlaufende Nummer der
Fläche
Literaturverzeichnis
[Bar95]
Norbert Bartelme. Geoinformatik. Springer-Verlag Berlin Heiderberg, 1995.
[Cha99]
Don Chamberlin. DB2 Universal Database; Der unentbehrliche
Begleiter. Addison Wesley Longman GmbH, 1999.
[Con00]
Rainer Conrad. Vortragsfolien: GIS und Anwendungen. Institut
für Informatik, Humbold-Universität zu Berlin, 2000.
[ESR98]
ESRI,
http://www.esri.com/library/gis/abtgis/compgis.html.
Components of a GIS, Juli 1998.
[Fla97]
Miroslaw A. Flasza. Diplomarbeit: Implementation von GeoFunktionalität in einem erweiterbaren relationalen DBMS. Institut
für Informatik, Humbold-Universität zu Berlin, August 1997.
[Fre99]
Johann Christoph Freytag. Vorlesungsskript: Grundlagen von Datenbanken. Institut für Informatik, Humbold-Universität zu Berlin, 1998/99.
[GDF95] European Committee for Standardisation. Geographic Data Files,
first draft edition, October 1995.
[IBM00a] IBM. IBM DB2 Spatial Extender User’s Guide and Reference
Version 7, 2000.
[IBM00b] IBM. IBM DB2 Universal Database Online-Informationen Version 7.1, 2000. siehe auch: http://www-4.ibm.com/software/data/db2/library/publications/.
[Kin01]
Kingston Centre for GIS, Kingston University, http://www.kingston.ac.uk/geog/gis/intro.htm. Introduction to GIS and Geospatial
Data, 2001.
62
LITERATURVERZEICHNIS
[Teo94]
63
Toby J. Teorey. Data Modeling & Design; The Fundamental Principles. Morgan Kaufmann Publishers, Inc., second edition, 1994.
Erklärung
Hiermit erkläre ich, dass ich die vorliegende Arbeit selbständig und ohne
unerlaubte Hilfe verfasst habe.
Berlin, den 10. Juni 2001
Ralf Heese
Herunterladen