2010-05-09 5 views
5

Ho un'applicazione immobiliare e una "casa" contiene le seguenti informazioni:Database/NoSQL - basso modo di latenza per recuperare i seguenti dati

house: 
- house_id 
- address 
- city 
- state 
- zip 
- price 
- sqft 
- bedrooms 
- bathrooms 
- geo_latitude 
- geo_longitude 

Ho bisogno di eseguire un estremamente veloce (bassa latenza) di recupero di tutte le case all'interno di casella coordinate geografiche.

Qualcosa di simile a SQL di seguito (se dovessi usare un database):

SELECT * from houses 
WHERE latitude IS BETWEEN xxx AND yyy 
AND longitude IS BETWEEN www AND zzz 

Domanda: Quale sarebbe il modo più veloce per me di memorizzare queste informazioni in modo che possa svolgere il recupero più veloce di dati basati sulla latitudine & longitudine? (ad esempio database, NoSQL, memcache, ecc.)?

+1

Questo è come chiedere di andare al più vicino modo più veloce di Walmart, senza menzionare quanto è lontano? Quali sono i veicoli che hai? e le strade sono già sviluppate dove vivi? È difficile rispondere alla tua domanda. Memcached potrebbe essere il più veloce ma come eseguire query su di esso. Questo genere di domande generiche non potrebbe avere una risposta diversa dalla discussione. Aggiungi ulteriori informazioni nella tua domanda – mamu

+1

Questo sembra un duplicato di http://stackoverflow.com/questions/2796575/nosql-how-to-retrieve-a-house-based-on-lat-long. – kristina

risposta

0

ThereMongoDB supporta gli indici geospaziali, ma ci sono modi per ridurre il tempo di calcolo per cose come questa. A seconda di come sono organizzati i tuoi dati, puoi posizionare le case in "tessere" identificabili e quindi recuperare tutte le case per una determinata tessera e, partendo da quel set di dati ridotto, ordinare in base alla distanza da qualunque coordinate tu abbia.

A seconda del numero di tessere disponibili, è possibile utilizzare le maschere di bit per trovare case che potrebbero essere vicine o sovrapposte a più riquadri.

1

Questa è una query tipica per un'applicazione GIS (Geographical Information System). Molti di questi sono risolti usando indici quad-tree, o simili, spaziali. La piastrellatura menzionata è il modo in cui questi spesso finiscono per essere implementati.

Se un indice contenente le coordinate potrebbe essere contenuto nella memoria e il DBMS ha un ottimizzatore decente, una scansione della tabella potrebbe fornire una distanza cartesiana da qualsiasi punto di interesse con un sovraccarico ragionevolmente basso. Se questo è troppo lento, la query potrebbe essere pre-filtrata confrontando ciascun asse coordinato separatamente prima di eseguire il calcolo dell'intera distanza.

0

Presumo che si stiano facendo molte più letture che scritture e non è necessario che il database sia distribuito su dozzine di macchine. Se è così, dovresti cercare un database ottimizzato per la lettura come sqlite (la mia preferenza personale) o mysql e usare esattamente la query SQL che suggerisci.

La maggior parte (non tutti) dei database NoSQL finiscono per essere eccessivamente complicati per query di questo tipo, poiché sono più adatti a cercare valori esatti nei loro indici piuttosto che in intervalli.

È bello che stai cercando una casella di delimitazione anziché una distanza cartesiana; il secondo sarebbe più difficile da ottimizzare per un database SQL (sebbene sia possibile restringerlo a un riquadro di delimitazione, quindi eseguire il calcolo della distanza cartesiano più lento).

Problemi correlati