2010-05-09 9 views
5

Mam aplikacji nieruchomości i „dom” zawiera następujące informacje:Database/NoSQL - Najniższa latency sposób odzyskać następujące dane

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

trzeba wykonać niezwykle szybko (o niskiej latencji) pobieranie wszystkich domów w obrębie geo-koordynować polu.

Coś poniżej SQL (jeśli miałbym użyć bazy danych):

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

Pytanie: Jaki byłby najszybszym sposobem dla mnie do przechowywania tych informacji, aby można było wykonać najszybsze pobieranie danych na podstawie szerokości geograficznej & długości geograficznej? (np. baza danych, NoSQL, memcache itp.)?

+1

To jest jak pytanie, czy muszę udać się do najbliższej najszybszej drogi Walmart, nie wspominając, jak daleko jest? Jakie macie pojazdy? i czy drogi są już rozwinięte tam, gdzie mieszkasz? Trudno jest odpowiedzieć na twoje pytanie. tzn. Memcached może być najszybszy, ale jak uruchomić kwerendy na nim. Tego rodzaju ogólne pytania nie mogą znaleźć odpowiedzi poza dyskusją. Dodaj więcej informacji do swojego pytania. – mamu

+1

To wydaje się być duplikatem http://stackoverflow.com/questions/2796575/nosql-how-to-retrieve-a-house-based-on-lat-long. – kristina

Odpowiedz

0

ThereMongoDB obsługuje indeksy geoprzestrzennych, ale istnieją sposoby, aby zmniejszyć czas obliczeń dla tego typu rzeczy. W zależności od tego, w jaki sposób uporządkowane są twoje dane, możesz umieścić domy w identyfikowalnych "kafelkach", a następnie pobrać wszystkie domy dla danego pola, a następnie, z tego zredukowanego zestawu danych, sortować na podstawie odległości od współrzędnych, które posiadasz.

W zależności od tego, ile płytek istnieje, można użyć bitmasks znaleźć domy, które mogą znajdować się w pobliżu lub pokrywają wiele płytek.

1

Jest to typowy zapytań dla systemu informacji geograficznej (GIS) aplikacji. Wiele z nich rozwiązuje się, stosując quad-tree lub podobne wskaźniki przestrzenne. Wspomniane kafelki pokazują, w jaki sposób często są one wdrażane.

Jeśli indeks zawierający współrzędne mieściłby się w pamięci, a DBMS miałby przyzwoity optymalizator, to skanowanie tabeli mogłoby zapewnić odległość kartezjańską od dowolnego punktu zainteresowania z tolerancyjnie niskim narzutem. Jeśli jest to zbyt wolne, to zapytanie może być wstępnie przefiltrowane przez porównanie każdej osi współrzędnych oddzielnie przed wykonaniem obliczenia pełnej odległości.

0

mam zamiar założyć, że robisz dużo więcej czyta niż pisze, a nie trzeba się baza danych rozłożone na kilkudziesięciu maszyn. Jeśli tak, powinieneś wybrać zoptymalizowaną pod kątem odczytu bazę danych, taką jak sqlite (moje osobiste preferencje) lub mysql, i użyć dokładnie tego zapytania SQL, które sugerujesz.

Większość (nie wszystkie) baz danych NoSQL jest zbyt skomplikowana dla zapytań tego rodzaju, ponieważ lepiej sprawdzają dokładne wartości w swoich indeksach niż zakresach.

To miłe, że szukasz na obwiedni zamiast kartezjańskiej odległości; to drugie byłoby trudniejsze dla optymalizacji bazy danych SQL (chociaż można zawęzić ją do ramki ograniczającej, a następnie wykonać wolniejsze obliczenia odległości kartezjańskiej).

Powiązane problemy