È possibile utilizzare un archivio valori-chiave per i dati geospaziali?


26

Ho usato molti database relazionali in passato, ma ho anche letto tutti i database NoSQL e gli archivi Key-Value sembrano interessanti.

Quando immagazzino un oggetto geometrico uso principalmente cinque colonne indicizzate ID, MIN_X, MAX_X, MIN_Y e MAX_Y (dove X e Y sono in una proiezione della mappa). Non ho bisogno di un indice sui miei altri dati.

Ho bisogno dei valori X e Y per cercare gli oggetti in un posto specificato (rettangolo della mappa) e ho bisogno del valore ID se voglio aggiornare un oggetto specificato.

È possibile utilizzare un archivio valori-chiave per questo?

Risposte:


18

Utilizziamo Google AppEngine per eseguire query spaziali / di attributi e il problema principale (dal primo giorno) è come indicizzare grandi gruppi di linee / poligoni di dimensioni arbitrarie. I dati dei punti non sono troppo difficili (vedi geohash, geomodel ecc.) Ma gli insiemi di poligoni piccoli / grandi raggruppati casualmente sono sempre stati un problema (e in alcuni casi lo sono ancora)

Ho provato diverse versioni dell'indicizzazione spaziale su GAE, ma la maggior parte sono solo varianti di due di seguito. Nessuno è stato veloce come i database SQL e tutti hanno vantaggi / svantaggi. i compromessi sembrano ragionevoli per la maggior parte delle app di mapping basate su Internet. Inoltre, i due seguenti devono essere accoppiati con l'abbattimento della geometria in memoria (tramite JTS ecc.) Per rimuovere tutte le funzionalità che non si adattano ai parametri di ricerca finali. e infine, si basano su funzionalità specifiche di GAE ma sono sicuro che potrebbe essere applicato ad altre architetture (o usare TyphoonAE per funzionare su un cluster linux, ec2 ecc.)

Griglie : comprime tutte le funzionalità di una determinata area in un indice di griglia noto. Posiziona un piccolo indice spaziale sulla griglia in modo da navigare rapidamente nel set di funzionalità che contiene. Per la maggior parte delle query, dovrai solo tirare una manciata di griglie che è veloce, poiché conosci l'esatta convenzione di denominazione della griglia e come è correlata alle entità K / V (ottiene, non query)

Pro : abbastanza veloce, facile da implementare, senza ingombro di memoria.

Contro : preelaborazione necessaria, l'utente deve decidere la dimensione della griglia, i geom di grandi dimensioni sono condivisi su più griglie, il clustering può causare il sovraccarico delle griglie, i costi di serializzazione / deserializzazione possono essere un problema (anche se compressi tramite buffer di protocollo)

QuadKeys : questa è l'implementazione attuale. fondamentalmente è uguale a Griglie tranne per il fatto che non esiste un livello di griglia impostato. man mano che le funzionalità vengono aggiunte, vengono indicizzate dalla griglia di quadkey che contiene completamente i loro limiti (o in alcuni casi, divisi in due quando non è possibile utilizzare un singolo quadkey, si pensi alla linea di dati). Dopo che il qk è stato trovato, viene quindi diviso in un numero massimo di qk più piccoli che forniscono rappresentazioni più dettagliate della funzione. un puntatore / bbox a quella funzione viene quindi impacchettato in un gridindex leggero (gruppo di funzionalità) che può essere interrogato (un design originale ha interrogato direttamente le funzionalità ma ciò si è rivelato troppo lento / intensivo della CPU nei casi in cui il set di risultati era grande)

Polilinea Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_1.png Poligono Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_2.png

La convenzione di denominazione dei quadkey usata sopra è ben nota e, soprattutto, tende a preservare la località (descritta più qui )

Il poligono sopra è simile al seguente: 0320101013123 03201010131212 03201010131213 0320101013132 0320101013133 03201010131302 03201010131303 032010101313002 03201010101010101010101010101010101010101010101010101

se i limiti della query sono abbastanza piccoli, è possibile recuperare direttamente tramite qk. questo è ottimale poiché è solo una singola chiamata rpc in batch al datatore GAE. se i limiti sono abbastanza grandi da includere troppi qk possibili (> 1000), in alternativa puoi eseguire una query utilizzando un filtro (es: qk> = 0320101013 e qk <= 0320101013 + \ ufffd). La convenzione di denominazione quadkey più il modo in cui GAE indicizza le stringhe consente alla query sopra di recuperare solo le griglie esistenti che scendono al di sotto di quel valore qk.

ci sono altri avvertimenti e problemi di perf ma, in generale, è la possibilità di interrogare sui quadkey che lo rende possibile

esempi - query sulle contee statunitensi: geojson

Pro : abbastanza veloce, nessuna configurazione della dimensione della griglia, nessuna impronta di memoria, nessuna griglia sovraffollata

Contro : preelaborazione necessaria, possibile sovraccarico in alcuni scenari, nessun dato polare

Curve di riempimento dello spazio - Dai un'occhiata al discorso sulle query NextGen di Alfred quest'anno a Google I / O. L'inclusione di curve di riempimento spazio / tempo generiche insieme ai nuovi operatori MultiQuery (eseguiti in parallelo) consentirà alcune query spaziali davvero interessanti. Batterà le prestazioni SQL tradizionali? Difficile a dirsi ma dovrebbe ridimensionarsi davvero bene. E ci stiamo avvicinando rapidamente a un futuro in cui i dispositivi mobili sempre attivi di tutte le forme / dimensioni aumenteranno notevolmente il traffico verso il tuo sito / servizio.

infine, sarei anche d'accordo che dovresti esaminare molto attentamente il tuo dominio problematico prima di scegliere NoSQL su SQL. Nel nostro caso, mi è piaciuto molto il modello di prezzi di GAE, quindi non c'era davvero scelta, ma se non hai bisogno di ridimensionare, risparmia un po 'di tempo e usa semplicemente un sql db standard


Citi GAE, ma quale database stai usando? Ce ne sono diversi: cloud.google.com/products/storage
Don McCurdy,

11

Ho sentito parlare di GeoCouch, che è un'implementazione di CouchDB per i dati basati sulla localizzazione. E penso anche che MongoDB abbia capacità di indicizzazione geospaziale.


Sì, lo fanno entrambi, e SimpleGeo sta costruendo un'estensione spaziale a Cassandra. Non ho sentito nulla in Voldemort o MemCache
TheSteve0

Oh, adoro quello che sta facendo SimpleGeo. Sono geloso e mi piacerebbe lavorare per loro!
JoshFinnie,

8

Questa è principalmente una domanda sugli algoritmi. Stack Overflow può anche essere un buon posto per chiederlo.

In ogni caso, la risposta alla tua domanda diretta è "sì, puoi usare un negozio kvp per rappresentare i dati spaziali". Una domanda migliore, tuttavia, potrebbe essere "DOVREI utilizzare un negozio kvp per rappresentare i dati spaziali?"

La risposta a questa domanda (come molte altre) è "dipende". Dipende dalla tua scala, dal tuo carico di lavoro (transazionale), dalla natura dei dati e dall'infrastruttura computazionale che hai a tua disposizione.

Un negozio kvp avrà un sovraccarico basso, che può aiutare ad aumentare la produttività per elevati volumi di inserimento e aggiornare il parallelismo. Tuttavia non sarà molto veloce eseguire ricerche spaziali (trova tutti gli oggetti all'interno di un rettangolo). Per questo vorresti un indice spaziale, come un R-Tree.

Tuttavia, se si dispone di un volume di dati davvero elevato e un enorme cluster di computer, l'utilizzo di un indice kvp potrebbe offrire alcuni vantaggi in termini di prestazioni. L'unico modo per saperlo con certezza è quello di eseguire misurazioni di perf utilizzando i dati effettivi e accedere alle schermate che ci si aspetta di incontrare.

Aggiornamento :

Ecco qualche informazione in più. Puoi usare un negozio KVP per fare ricerche spaziali. Il problema è che è lento. Per capire perché, considera qualcosa del genere:

  ***********
  ***********
  ***********
  ***********
  ****###****
  ****###****
  ****###****
  ***********
  ***********
  ***********
  ***********

Dove * e # rappresentano oggetti, disposti in una griglia 11x11, con l'origine nell'angolo in alto a sinistra. Immagina una ricerca di oggetti all'interno del rettangolo (4,4) - (7,7). Questo dovrebbe trovare tutti i "#". Supponendo che tu stia usando una b + -tree per rappresentare i tuoi indici nel negozio KVP, potresti trovare i risultati usando l'indice "X" o l'indice "Y". In questo caso, non importa quale. Per motivi di discussione, userò l'indice x. Dovresti fare una ricerca log (n) nell'indice X per trovare il primo nodo con un valore X di "4" e quindi scorrere i nodi foglia b + -tree fino a trovare un nodo con un valore maggiore di 7. iterando l'indice x, respingeresti tutto ciò che era al di fuori dell'intervallo y desiderato.

Questo è lento Immaginalo su una grande griglia, con la stessa densità, diciamo 100 K * 100 K. Lì finiresti per scansionare le voci dell'indice "300, 000" per trovare solo 9 record. Se si utilizza un R-Tree correttamente bilanciato, tuttavia, la ricerca dell'indice dovrebbe probabilmente scansionare solo circa 90 record. Questa è una differenza enorme.

Il problema, tuttavia, è che mantenere un R-Tree bilanciato è costoso. Questo è il motivo per cui la risposta è "dipende" e perché la domanda "dovrei farlo" è molto più importante di "come posso farlo".

Se inserisci e rimuovi molti record e esegui principalmente la ricerca "ID oggetto" e non esegui spesso la ricerca "spaziale", l'utilizzo dell'indice KVP ti offrirà prestazioni migliori per ciò che desideri effettivamente utilizzare il sistema . Tuttavia, se si inserisce o si elimina di rado, ma si effettuano molte ricerche spaziali, si desidera utilizzare un R-Tree.


Non accetterei una risposta del tipo "sì, puoi". perché voglio sapere come . E "DOVREI .." non è una domanda migliore, perché come hai detto "dipende".
Jonas,

1
Devo dissentire. Se vuoi costruire un sistema utile o lasciare un utile riferimento su Internet per altre persone che costruiscono sistemi simili, allora "dovrei" è molto più importante di "come". Nell'interesse di essere d'aiuto, tuttavia ho modificato la mia risposta affinché tu possa fornire alcune informazioni su come.
Scott Wisniewski,

@Jonas Credo che le risposte al "consiglio" che hai avuto siano state fatte dal modo in cui hai posto la domanda: "ma ho anche letto di tutti i database NoSQL e gli archivi Key-Value sembrano interessanti". Questo ha tutti i tratti distintivi di una soluzione alla ricerca di un problema.
JasonBirch,

NoSQL risolve un problema, ma è un problema che praticamente nessuno ha perché non stanno lavorando su una scala abbastanza grande. Sfortunatamente è sempre bello pensare che i nostri sistemi siano più grandi nel grande schema delle cose di quanto non siano in realtà. :)
JamesRyan il


1

Nella maggior parte dei casi, si otterrà più utilità dall'archiviazione dei dati relazionali rispetto a quella dall'archiviazione chiave / valore o chiave / valore / tipo. Esistono notevoli complessità in termini di query e reportistica efficiente su questo tipo di schema di dati.

Il mio consiglio sarebbe di valutare attentamente se la tua bilancia richiede effettivamente NoSQL prima di considerare come usarla.


1
Ecco un esempio di un problema che potresti avere (e una soluzione ad esso) se devi calcolare se un punto si trova all'interno o all'esterno di una geometria. code.google.com/p/giscloud/wiki/SerializedSpatialIndexes
Jon Bringhurst

Ehi @Jon, sarebbe meglio aggiungerlo come risposta. In questo modo può resistere da solo, e ti verrà riconosciuto se la gente pensa che abbia merito!
JasonBirch,




Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.