Im Rahmen eines „kleinen“, privaten Softwareprojektes wollte ich jede Menge Informationen in einer Datenbank speichern. Da ich es schon von anderen Projekten her kannte, fiel die Wahl ohne Zögern auf MySQL als DBMS.Und weil man’s endlich mal „richtig“ mit Fremdschlüsseln etc. machen will, wird eben InnoDB als Storage Engine genommen.
So weit, so gut – wären da nur nicht die GPS-Koordinaten, die mit in die zentrale Tabelle sollen. Sicher, sowas kann man in Form von geographischen Koordniaten (also “X Grad Ost und Y Grad Nord”) einfach als zwei Fließkommawerte in die Datenbank schreiben. Das wird nur später dann zum Knieschuß, wenn man Abfragen in der Art „alle Einträge in Entfernung von höchstens X von Punkt Y“ starten möchte. Denn entweder wird das Ergebnis sagenhaft ungenau, wenn man stumpf einen einfachen („rechtwinkligen“) Wertebereich von Breiten- und Längenbreitengraden selektiert, oder man darf für jeden einzelnen Punkt eine korrekte trigonometrische Entfernungsberechnung machen (lassen). Was letzteres für die Rechenlast des Datenbankservers bedeutet, wird man sich wohl leicht vorstellen können.
Nun ist es so, daß MySQL grundsätzlich auch sogenannte Spatial Extensions, also spezielle geometrische Datentypen wie Punkte nebst passenden Indizes bietet. Leider beherrschen die nur rechtwinklige und keine Kugel-Koordinatensysteme, weshalb ich gestern erstmal in mühevoller Kleinarbeit MySQL das Umrechnen von geografischen in UTM-Koordinaten inklusive Zonennummer beigebracht habe. Das mit dem Hintergedanken, per Trigger eine Point-Spalte (und eine Integer-Spalte für die Zonennummer) in Abhängigkeit der Längen- und Breitengradspalte aktualisieren zu lassen.
Gesagt, getan. Doch was muß ich heute feststellen, als ich das Projekt weiterführen will? InnoDB unterstützt zwar immerhin Point-Spalten, jedoch keine Spatial Indizes. Das tut nur MyISAM, was wiederum keine Fremdschlüssel unterstützt. Damit wären wir dann auch bei der Fragestellung des Titels angekommen: Die eine Storage Engine unterstützt das eine dringend benötigte Feature, die andere Storage Engine das andere Feature. 🙁 Jetzt ist guter Rat wieder teuer.
In meiner Verzweiflung habe ich sogar kurz hinüber zu PostgreSQL geschielt, dieses Vorhaben dann aber nach einem Blick in die meiner Meinung wenig hilfreiche Dokumentation schnell wieder fallen gelassen. Weitere Alternativvorschläge werden dankbar angenommen. 😉