2016-06-23 11 views
-1

Das ist eine konzeptionelle Frage, aber ich hätte es schon lange in diesem Forum fragen sollen.Gestaltete PostGIS-Datenbank ... Punkte-Tabelle und Polygon-Tabellen ... Wie effizienter machen?

Ich habe eine PostGIS-Datenbank, und ich habe viele Tabellen darin. Ich habe einige über die Verwendung von Schlüsseln in Datenbanken recherchiert, aber ich bin mir nicht sicher, wie man Schlüssel im Fall der Punktdaten einbaut, die dynamisch sind und mit der Zeit zunehmen.

Ich speichere Punktdaten in einer Tabelle, und diese Daten werden jeden Tag größer. Es ist ungefähr 10 Millionen Zeilen im Moment und wird wahrscheinlich etwa 10 Millionen Zeilen pro Jahr wachsen. Es gibt die Spalten lat, lon, time und the_geom.

I mehrere andere Tische haben, die jeweils verschiedene Polygongruppen (umgewandelte Formdateien auf Tabellen mit shp2pgsql), wie Bezirke, Zustände, usw.

I Abfragen bin zu schreiben, die die Punktdaten an die räumlichen Tabellen beziehen sich auf Sehen Sie, ob Punkte innerhalb der Polygone sind, was zu Dingen wie "55 Punkte im X-Polygon in den letzten 24 Stunden" usw. führt

Das Problem ist, ich habe keinen Schlüssel, der die Punkttabelle mit der verbindet andere Tabellen. Ich denke, das hemmt wahrscheinlich die Abfrageeffizienz, aber ich bin mir nicht sicher.

Ich weiß, diese Frage ist ziemlich vage, und ich bin glücklich, alles zu klären, aber ich habe im Grunde eine Reihe von Punkten in einer Tabelle, die ich räumlich mit anderen Tabellen vergleiche, und ich versuche, die zu finden beste Art, Dinge zu gestalten.

Danke für jede Hilfe!

Antwort

0

Foreign keys (and other constraints) are not needed to query. Darüber hinaus sie entstehen als Folge von welchem ​​Design der Anwendung pro priciples von gutem Design angemessen entsteht.

Sie teilen dem DBMS nur mit, dass eine Liste von Werten unter einer Liste von Spalten in einer Tabelle auch anderswo als eine Liste von Werten unter einer Liste von Spalten in einer Tabelle erscheint. (Zur Vermeidung von Fehlern und Verbesserung der Optimierung.)

Sie möchten immer noch Indizes für Spalten, die in Joins eingebunden werden. ZB möchten Sie vielleicht, dass X-Koordinaten in zwei Tabellen sortierte Indizes in der gleichen Reihenfolge haben. Dies ist unabhängig davon, ob die Werte einer Spalte eine Untermenge der anderen bilden, dh ob eine Fremdschlüssel-Bedingung zwischen ihnen besteht.

1

Wenn Sie dies noch nicht getan haben, sollten Sie einen räumlichen Index sowohl für die Punkt- als auch für die Polygontabelle erstellen.

Jedenfalls sind räumliche Vergleiche in der Regel langsamer als der numerische Vergleich.

Das Hinzufügen eines oder mehrerer Schlüssel zu der Punkttabelle, die auf die anderen Tabellen verweist, und die Verwendung derselben in Ihren ausgewählten Abfragen anstelle von räumlichen Operationen, wird sicherlich schneller werden. Offensichtlich werden Einfügungen langsamer sein, aber angesichts der Zahlen, die Sie gaben (10 Millionen pro Jahr), sollte es kein Problem sein.

Wahrscheinlich wird nur ein Fremdschlüssel zu den kleinsten Entitäten (Städte zum Beispiel) hinzugefügt und die anderen zu verbinden, um Ergebnisse zu erhalten (Länder, Staaten ...) werden schneller sein als der räumliche Vergleich.

+0

Danke! Ich denke ich tracking. Wenn ich Punktdaten einfüge (die ich im Prinzip alle 10 Minuten aus einer CSV-Datei kopiere), kann ich nach der Kopie, die eine räumliche Abfrage für Städte oder Bezirke in den Zeilen der letzten 10 Minuten und Updates ausführt, eine Aktualisierungsanweisung ausführen ein Feld wie "Stadt" oder "Kreis" als Fremdschlüssel ausfüllen? Auf eine kleine Randnotiz, aber sicherlich verwandt, eine Abfrage, die ich schmerzlich langsam gefunden habe (und bisher nie erfolgreich) ist ein ST_DWithin auf 24 Stunden Punktdaten innerhalb 5000m eines Polygons. – user1610717