2010-05-09 70 views
5

我有一個房地產應用程序和「家」包含以下信息:數據庫/ NoSQL的 - 最低延遲的方法來檢索以下數據

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

我需要執行一個非常快速的(低延遲)檢索所有房屋內的一個地理座標框

類似下面的SQL(如果我是使用一個數據庫):

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

問:什麼是我來存儲這些信息,這樣我可以進行最快檢索的最快方法數據基於緯度&經度? (例如數據庫,NoSQL,memcache等)?

+1

這就像問我需要去最近的沃爾瑪最快的方式,沒有提到它有多遠?你有什麼車輛?你住的地方道路是否已經開發? 很難回答你的問題。即Memcached可能是最快的,但您如何在其上運行查詢。 除了討論之外,這種一般性問題無法解答。在您的問題中添加更多信息 – mamu 2010-05-10 00:08:24

+1

這看起來像是http://stackoverflow.com/questions/2796575/nosql-how-to-retrieve-a-house-based-on-lat-long的副本。 – kristina 2010-05-10 15:41:10

回答

0

ThereMongoDB支持地理空間索引,但有一些方法可以減少像這樣的事情的計算時間。根據您的數據排列方式,您可以將房屋放置在可識別的「瓷磚」中,然後爲給定的瓷磚提取所有房屋,並從縮小的數據集中根據與您擁有的任何座標的距離進行排序。

根據有多少瓦片,您可以使用位掩碼來查找可能接近或重疊多個瓦片的房屋。

1

這是地理信息系統(GIS)應用程序的典型查詢。這些中的許多是通過使用四叉樹或類似的空間索引來解決的。提到的貼圖是這些通常最終被實現的方式。

如果一個包含座標的索引可以放入內存並且DBMS有一個體面的優化器,那麼表掃描可以提供從任何興趣點開始的笛卡爾距離,並具有可接受的低開銷。如果這太慢,那麼可以在進行全部距離計算之前通過分別比較每個座標軸來預先過濾查詢。

0

我打算假設讀取的次數多於寫入的次數,並且不需要將數據庫分佈在數十臺機器上。如果是這樣,你應該去一個閱讀優化的數據庫,如sqlite(我的個人偏好)或MySQL,並使用你建議的SQL查詢。

大多數(並非全部)NoSQL數據庫最終對這類查詢過於複雜,因爲它們更擅長查找索引中的精確值而非範圍。

很高興你正在尋找一個邊界框而不是笛卡爾距離;後者對於SQL數據庫來說會更難以優化(儘管您可以將它縮小到邊界框,然後執行較慢的笛卡爾距離計算)。