[opengeodb] nur deutschland

Martin Trautmann traut at gmx.de
Die Mar 18 08:16:51 CET 2008


Robert Böck wrote:

>>> Die Vorteile speziell für die Opengeodb wären, dass die SQL-Statements,
>>> um Daten abzufragen, bei weitem nicht so komplex wären, wie sie jetzt
>>> sind (momentan muss man u. a. ganz exzessiv mit Selbstbezügen arbeiten,
>>> um der Datenbank bestimmte Datensätze zu entlocken).
>> fuer bestimmte ja - aber gerade normalisiert ergeben sich
>> moeglicherweise mehr Bezuege als wenn man alles in eine einzige Tabelle
>> reinpfropft.
>
> In der Praxis werden sich für Abfragen weniger Bezüge ergeben, eben weil
> nicht alles in eine Tabelle reingestopft ist und somit schon die Bezüge
> für die Datenart (text_type) wegfallen.

Nun, du polemisierst hier mit "reingestopft" und "Saustall" und 
ignorierst dabei, dass wir nicht nur eine Kiste "Obst" mit durcheinander 
Äpfeln und Birnen haben, sondern jedes einzelne Obststück fein sortiert 
seinen Platz hat.

Nach meiner unfachmännischen Meinung ist es einer guten Datenbank total 
egal, ob die Daten nun normalisiert vorliegen oder mit einem Type 
etikettiert sind. Bei einer schlechten Datenbank wage ich die 
Behauptung, dass manche mit dem einen Ansatz besser zurechtkommen, 
manche mit dem anderen.

> Wenn man das, was jetzt in geodb_textdata drinsteckt,
> auseinanderklamüsert, dann reduziert es einerseits die Datenmenge, weil
> text_type wegfallen kann, andererseits vereinfacht es die Abfragen, weil
> ich keinen text_type dafür herziehen muss, nur um festzulegen, welche
> Art von Daten (PLZ, Ort, etc.) ich haben will.

Statt dessen musst du sagen, in welcher Tabelle nachgesehen werden muss. 
Nehmen wir ein  einfaches Beispiel: Suche mir mal in deinem Ansatz die 
Daten zum Eintrag "Hampuri" heraus. Du wirst damit wohl in der Kiste 
"rote Äpfel aus Neuseeland" suchen müssen:

INSERT INTO geodb_textdata 
VALUES(17838,500100000,'Hampuri','fi',0,0,null,null,'3000-01-01',300500000);


Wenn ich dich richt verstehe, möchtest du Hampuri nun nicht einsortieren 
nach
   textdata:500100000:fi -> Hampuri
sondern nach
   500100000_fi

Das lässt sich absolut einfach normalisieren:
INSERT INTO geodb_textdata_500100000_fi 
VALUES(17838,'Hampuri',0,0,null,null,'3000-01-01',300500000);

Ich kann dir die SQL-Datei gerne in dieser Form konvertierten, dann 
kannst du deine Behauptung belegen. Zeige mir aber erst mal, wie du die 
Suche nach "Hampuri" gestalten würdest, wenn du nun atomarisiert suchen 
musst nach Äpfel (Name, Type 5001*), rot (Unterscheidung nach 
allgemeinem Name, Kurzform, Langform, Sortierform, ..., hier also 
500100000) aus Neuseeland (hier die Sprachversion "fi").

Deine atomarisierte Suchfunktion muss hier also nachsehen, ob Hampuri in 
rote Äpfel aus Neuseeland liegt - oder vielleicht in der Kiste rote 
Äpfel aus Papua-Neuguinea (500100000_yi) oder in der Kiste rote Äpfel 
aus Hawai (500100000_he).

Womöglich musst du sogar noch kleinere Kisten anlegen, wie z.B. "grüner, 
fauler Apfel aus Deutschland", um den Regierungsbezirk Magdeburg zu finden:

INSERT INTO geodb_textdata VALUES(190,500100099,'Regierungsbezirk 
Magdeburg','de',1,1,null,null,'2007-06-30',300500000);

->
INSERT INTO geodb_textdata_500100099_de_ehem 
VALUES(190,'Regierungsbezirk 
Magdeburg',1,1,null,null,'2007-06-30',300500000);

Das ist der ehemalige Regierungsbezirk Magdeburg, der zum 30. Juni 2007 
aufgelöst wurde und daher wohl in die Kiste der "faulen Äpfel" gehört.

Konsequent weiter gedacht gehört der aber in die Kiste der faulen, 
grünen Äpfel aus Deutschland, die in Deutschland abgepackt wurden, von 
deutschen Erntehelfern, usw., um irgendwann auf dem Atom
  INSERT INTO geodb_textdata_500100099_de_1_1_ehem_x_y_z 
VALUES(190,'Regierungsbezirk Magdeburg');
anzukommen.

(nochmal zur Erinnerung:
Äpfel = Name;
grün = Name in Langform;
aus Deutschland = Sprache de;
in Deutschland verpackt = is_native_lang;
von deutschen Erntehelfern = is_default_name;
faul = valid_until in der Vergangenheit;
...)


>>> Es geht schon mal damit los, dass die Tabelle keinen primary key hat.
>>> loc_id ist ein foreign key.
>> Wie kommst du darauf, die loc_id waere kein primary key? Sie wird also
>> solcher verwendet.
>
> Weil die loc_id in der Tabelle geodb_locations der Primärschlüssel ist.
> Wenn ich nun geodb_locations.loc_id mit geodb_textdata.loc_id verknüpfe,
> folgt daraus, dass geodb_textdata.loc_id ein Fremdschlüssel ist.

Ah, ok, in der textdata ist sie tatsaechlich Fremdschlüssel. Du brauchst 
also noch eine Hilfstabelle, um der
geodb_location.loc_id darüber mitzuteilen, dass plz_id zu dieser loc_id 
gehört - und irgendwie scheinst du zu glauben, dass du mit diesen 
Hilfstabellen Platz sparst?


>>> Dann ist da alles mögliche drin, was gar nicht zusammengehört (also
>>> Postleitzahlen, Ortsnamen in verschiedenen Schreibweisen, Bundesländer,
>>> Regiertungsbezirke, etc.)
>> Das gehoert nicht zusammen, glaubst du? Seltsam.
>
> Genauso wie Äpfel, Birnen und Tomaten nicht zusammengehören. Die gehören
> auch in getrennte Kisten.

Ja, du kannst natürlich bei Apfel-Anton einkaufen und in Bertas 
Birnenladen die Birnen holen - ich gehe gleich zu Obi.

>>> Die Tabelle enthält Daten (text_val) und
>>> Metadaten (text_type) gleichermaßen. Alles wild durcheinander wie Kraut
>>> und Rüben.
>> Das hat mit Normalisierung aber wohl nichts mehr zu tun?
>
> Meiner Meinung nach schon. Weil text_type redundant ist. Wenn man das
> alles sinnvoll zerlegt, wird text_type überflüssig.

Mir scheint eher, du hast eine Abneigung gegen den text_type, weil du 
die Problematik noch nicht verstanden hast. Zugegeben, das ist beliebig 
kompliziert. Mit wildcard-Operationen auf 50001* wird manches 
leichter... Ich befürchte, du würdest dich bald vor lauter Kisten nicht 
mehr umdrehen können.

Was machst du beispielsweise, falls ich bald mal das einbaue:

500600000 - amtlicher Gemeindeschlüssel
500600010 - amtlich ergäntzter Gemeindeschlüssel
500600020 - frei ergänzter Gemeindeschlüssel
500600100 - Landes/Gemeindeschlüssel

Nimm z.B. Hamburg mit dem Gemeindeschlüssel 02000000.
Der Stadtbezirk Hamburg-Mitte ist einer von sieben Stadtbezirken mit dem 
frei ergänzten Gemeindeschlüssel 020000001 und weiteren 15 Stadtteilen 
wie z.B. Hamm-Nord mit Gemeindeschlüssel 02000000104

In manchen Orten sind diese Unternummerierungen amtlich, könnte also als 
500600010 markiert werden. Andernfalls mache ich diese Ergänzung frei 
Schnauze und schaffe mir diesen frei ergänzten Gemeindeschlüssel als 
extrem leistungsfähigen Primärschlüssel, der in den ersten beiden 
Stellen das Bundesland, den nächsten drei den Landkreis, dann den 
Regierungsbezirk und die Gemeinde benennt.

Wer mehrere Länder in einer Datenbank zusammenpackt, der kann sich die 
gesamten Hierarchies ersparen, wenn er statt dessen in 500600100 den 
Wert DE02000000104 findet - das ist die einfache Kombination von 
Länderabkürzung und 5006000?0



Schönen Gruß
Martin