[PostNAS] PostNAS 0.8 - Datenbank-Schema
Frank J.
newsletter at fotodrachen.de
Fr Sep 19 09:13:33 PDT 2014
Am 15.09.2014 um 14:33 schrieb Jürgen E. Fischer:
> Moin Frank,
>
> On Thu, 11. Sep 2014 at 15:14:28 +0000, Jäger, Frank (KRZ) wrote:
>> Die Relationen-Spalten enthalten aber leider immer nur Verweise auf die
>> kurzen IDs.
>
>> Datenbanktechnisch ist das also eigentlich eine kaputte Relation weil das
>> Feldformat auf beiden Seiten nicht zusammen passt.
>
> Das ist ein Argument. Die langen Schlüssel haben aber nur unmittelbar bei der
> Fortführung Sinn. ...
>
> Daher habe ich jetzt alle gml_id und Relation wieder auch character(16)
> gestellt ([1]). ...
>
> Jürgen
So, es geht weiter mit PostNAS Version 0.8 ...
1. ... raus ausse Kartoffeln:
Im Datenbankschema des PostNAS-SVN [1] habe ich auch die "gml_id" wieder
auf "character(16)" zurück geändert. Dabei wird es dann wohl bleiben.
Nebenbei: Für bessere Massen-Edits habe ich nun auf Tab-ausgerichten
SQL-Code verzichtet und die Tabellen-Definitionen auf das PG-Dump Format
umgestellt. Das sieht jetzt im Diff des SVN einmal grausam aus.
2. Trigger für Historie:
Bisher habe ich fast ausschließlich die NBA-Abgabeart 1000 (ohne
Historie) erhalten und das mit der Trigger-Variante "Kill" verarbeitet.
Für eine Stadt liegt mir jedoch Abgabeart 3100 (Vollhistorie) vor, die
mit dem Kill-Trigger fehlerhaft verarbeitet wird, weil der (noch) gar
kein "replace" kennt.
Da die Auskunft-Programme, Views und Mapfiles nun mit historischen
Objekten in der Datenbank umgehen können, spricht nichts dagegen, dazu
jetzt den Trigger in der Variante "hist" zu verwenden. Mit dem hatte ich
noch keine Erfahrungen.
Meine Tests ergaben, dass der vorliegende Hist-Trigger, auch die
frischeste Norbit-Version aus github, mit meinen Daten nicht funktioniert.
Ich habe mich an die Reparatur gemacht. ...
Donnerwetter! Schweres Gelände.
Ich habe noch nie so viel Hirnschmalz für so wenige Zeilen Code gebraucht.
Das vorläufige Ergebnis habe ich heute Mittag hoch geladen [2].
Der bisherige Trigger-Code geht offensichtlich von der klassischen
Situation einer Aktualisierung aus. In der Datenbank liegt nur eine alte
Version des bearbeiteten Objektes mit "ended IS NULL". Das ist die
bisher gültige Version.
Dann kommt eine NAS-Datei mit EINEM Replace zu dem Objekt, auch "endet
IS NULL". Das ist die neue aktuelle Version.
Der Trigger wird aufgerufen, nimmt den Beginn der neuen Version und fügt
das als Ende der alten Version ein.
Die hat nun "NOT endet IS NULL" und wird von den Programmen nicht weiter
beachtet, sie ist historisch.
Die Aufgabe des Triggers ist es, die alte und neue Version des gleichen
Objektes in Verbindung zu setzen.
Dass beide Versionen "endet NOT NULL" haben wird dabei vorausgesetzt.
Ich habe aber folgende Situation vorgefunden:
Eine einzige NAS-Datei einer Erstabgabe mit Abgabeart 3100 enthält
bereits mehrere Versionen eines Objektes. Es wird ja dessen komplette
Historie mit transportiert.
Die erste Objekt-Version kommt noch mit "insert" und hat - obwohl auch
schon historisch - noch kein Ende-Datum in den Daten. Insert sieht das
wohl nicht vor.
Die folgenden Versionen kommen mit "replace" und haben bereits ein
Ende-Datum, das gleich mit übernommen wird.
Die letzte Version mit "replace" hat kein Ende Datum, das ist die
aktuellste Version.
Alle Versionen werden zunächst in die Objekt-Tabelle geladen.
Dann läuft PostNAS noch mal durch die Datei und erzeugt dabei die
Einträge in der Delete-Tabelle, also einen Trigger-Aufruf für jeden
Replace-Satz.
Dieser Trigger findet nun NICHT genau ein Paar Vorgänger-Nachfolger vor,
die beide "endet NOT NULL" haben.
Mal hat der Vorgänger "endet IS NULL", der aus dem Insert.
Mal haben beide bereits ein Ende, aus mittlerem "replace".
Mal hat der Nachfolger kein "endet", aber der Vorgänger.
Der alte Trigger nahm den "beginn" der letzten Objekt-Version (NOT NULL)
um damit das allererste (NOT NULL) zu beenden.
Die mittleren Versionen wurden nicht gefunden und führten zu
Fehlermeldungen im Logfile.
Ich habe diese Abläufe, unter denen der Trigger arbeiten soll, als
Kommentar in der Datei [2] ab Zeile 297 dokumentiert.
Was mich ein wenig wundert: Ich habe von mehren Seiten schon gehört,
dass Datenbanken mit Historie benutzt werden.
Warum läuft das bei mir schief und andere haben keine Probleme?
Hatte denn noch niemand eine Erstabgabe in der es mindestens 3 Versionen
eines Objektes gibt?
Die aktuellen NBA-Daten wurden folgendermaßen erzeugt:
Software: ibR
Bundesland : NRW
Die Erstabgabe wurde zurück datiert auf einen Stichtag in 1950 um
wirklich die ganze Historie zu bekommen.
Die erste automatisch generierte Ausgabe ist entsprechend leer.
Die erste abgerufene Aktualisierung ist dann die eigentliche Erstabgabe,
die die komplette Lebensgeschichte der Objekte mitbringt.
Dabei kracht es dann ...
Ich habe noch nicht viel testen können, nur dies eine NBA-Verfahren.
Also los: andere Bundesländer, andere Software, ...
Frank Jäger
[1]
http://trac.wheregroup.com/PostNAS/export/336/trunk/import/alkis_PostNAS_schema.sql
[2]
http://trac.wheregroup.com/PostNAS/browser/trunk/import/alkis-functions.sql
More information about the NAS
mailing list