2010-05-09 52 views
5

Tôi có một ứng dụng bất động sản và một "ngôi nhà" chứa các thông tin sau:Cơ sở dữ liệu/NoSQL - cách độ trễ thấp nhất để lấy dữ liệu sau

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

tôi cần phải thực hiện một HẾT MÌNH nhanh (độ trễ thấp) hồi của tất cả các nhà trong một số hộp tọa độ địa lý.

Cái gì như SQL dưới đây (nếu tôi được sử dụng một cơ sở dữ liệu):

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

Câu hỏi: Điều gì sẽ là cách nhanh nhất đối với tôi để lưu trữ thông tin này để tôi có thể thực hiện truy xuất nhanh nhất dữ liệu dựa trên vĩ độ & kinh độ? (ví dụ: cơ sở dữ liệu, NoSQL, memcache, v.v ...)?

+1

Điều này giống như yêu cầu tôi cần phải đi đến gần nhất Walmart cách nhanh nhất, mà không đề cập đến bao xa? Những chiếc xe bạn có là gì? và Đường có được phát triển ở nơi bạn sinh sống không? Thật khó để trả lời câu hỏi của bạn. tức là Memcached có thể nhanh nhất nhưng làm thế nào để bạn chạy các truy vấn trên đó. Loại câu hỏi chung này không thể có câu trả lời khác ngoài thảo luận. Thêm thông tin khác trong câu hỏi của bạn – mamu

+1

Điều này có vẻ giống như một bản sao của http://stackoverflow.com/questions/2796575/nosql-how-to-retrieve-a-house-based-on-lat-long. – kristina

Trả lời

0

ThereMongoDB hỗ trợ chỉ mục không gian địa lý, nhưng có nhiều cách để giảm thời gian tính toán cho những thứ như thế này. Tùy thuộc vào cách dữ liệu của bạn được sắp xếp, bạn có thể đặt nhà ở 'gạch' có thể nhận dạng và sau đó tìm nạp tất cả nhà ở cho một ô cụ thể và từ tập dữ liệu đã giảm đó, sắp xếp dựa trên khoảng cách từ bất kỳ tọa độ nào bạn có.

Tùy thuộc vào số lượng ô có sẵn, bạn có thể sử dụng bitmap để tìm những ngôi nhà có thể gần hoặc trùng lặp nhiều ô.

1

Đây là truy vấn điển hình cho ứng dụng Hệ thống thông tin địa lý (GIS). Nhiều người trong số này được giải quyết bằng cách sử dụng quad-tree, hoặc không gian tương tự, chỉ số. Tiling được đề cập là cách chúng thường được thực hiện.

Nếu chỉ mục chứa tọa độ có thể vừa với bộ nhớ và DBMS có trình tối ưu hóa tốt, thì quét bảng có thể cung cấp khoảng cách Descartes từ bất kỳ điểm quan tâm nào với chi phí thấp. Nếu điều này quá chậm, thì truy vấn có thể được lọc trước bằng cách so sánh từng trục tọa độ riêng biệt trước khi thực hiện phép tính khoảng cách đầy đủ.

0

Tôi sẽ giả định rằng bạn đang thực hiện nhiều lần đọc hơn viết và bạn không cần phải có cơ sở dữ liệu được phân phối trên hàng chục máy. Nếu vậy, bạn nên đi cho một cơ sở dữ liệu được tối ưu hóa đọc như sqlite (sở thích cá nhân của tôi) hoặc mysql, và sử dụng chính xác truy vấn SQL mà bạn đề xuất.

Hầu hết (không phải tất cả) Cơ sở dữ liệu NoSQL kết thúc quá phức tạp đối với các truy vấn thuộc loại này, vì chúng tốt hơn khi tìm kiếm các giá trị chính xác trong chỉ mục của chúng thay vì phạm vi.

Thật tuyệt khi bạn đang tìm kiếm một hộp giới hạn thay vì khoảng cách Descartes; sau này sẽ khó khăn hơn cho một cơ sở dữ liệu SQL để tối ưu hóa (mặc dù bạn có thể thu hẹp nó vào một hộp giới hạn, sau đó thực hiện việc tính toán khoảng cách theo chu kỳ chậm hơn).

Các vấn đề liên quan