Có cách nào tôi có thể sử dụng kho Lưu trữ khóa-giá trị cho dữ liệu không gian địa lý không?


26

Tôi đã sử dụng nhiều cơ sở dữ liệu quan hệ trong quá khứ, nhưng tôi cũng đã đọc về tất cả các cơ sở dữ liệu NoQuery và các cửa hàng Key-Value trông có vẻ xen kẽ.

Khi tôi lưu trữ đối tượng hình học, tôi chủ yếu sử dụng năm cột được lập chỉ mục ID, MIN_X, MAX_X, MIN_Y và MAX_Y (trong đó X và Y nằm trong phép chiếu bản đồ). Tôi không cần một chỉ mục trên dữ liệu khác của tôi.

Tôi cần các giá trị X và Y để tra cứu các đối tượng ở một nơi được chỉ định (hình chữ nhật trên bản đồ) và tôi cần giá trị ID nếu tôi muốn cập nhật một đối tượng đã chỉ định.

Có cách nào để tôi có thể sử dụng cửa hàng Key-Value cho việc này không?

Câu trả lời:


18

Chúng tôi sử dụng Google AppEngine để chạy các truy vấn không gian / thuộc tính và vấn đề chính (từ ngày đầu tiên) là làm thế nào để lập chỉ mục các tập hợp lớn các dòng / đa giác có kích thước tùy ý. Dữ liệu điểm không quá khó (xem geohash, geomodel, v.v.) nhưng các tập hợp đa giác nhỏ / lớn được phân cụm ngẫu nhiên luôn là một vấn đề (và trong một số trường hợp, vẫn còn)

Tôi đã thử một số phiên bản khác nhau của lập chỉ mục không gian trên GAE nhưng hầu hết chỉ là các biến thể của hai bên dưới. Không có gì nhanh như cơ sở dữ liệu SQL và tất cả đều có ưu / nhược điểm. sự đánh đổi có vẻ hợp lý cho hầu hết các ứng dụng bản đồ dựa trên internet. Ngoài ra, hai cái bên dưới cần được kết hợp với loại bỏ hình học trong bộ nhớ (thông qua JTS, v.v.) để loại bỏ bất kỳ tính năng nào không phù hợp với các tham số tìm kiếm cuối cùng. và cuối cùng, họ dựa vào các tính năng cụ thể của GAE nhưng tôi chắc chắn rằng nó có thể được áp dụng cho các kiến ​​trúc khác (hoặc sử dụng TyphoonAE để chạy trên cụm linux, ec2, v.v.)

Lưới - Đóng gói tất cả các tính năng cho một khu vực nhất định vào một chỉ mục lưới đã biết. Đặt một chỉ mục không gian nhỏ trên lưới để bạn nhanh chóng điều hướng tập hợp các tính năng mà nó chứa. Đối với hầu hết các truy vấn, bạn sẽ chỉ cần kéo một số lưới nhanh, vì bạn biết quy ước đặt tên lưới chính xác và cách nó liên quan đến các thực thể K / V (được, không phải truy vấn)

Ưu điểm - khá nhanh, dễ thực hiện, không có dấu chân bộ nhớ.

Nhược điểm - tiền xử lý cần thiết, người dùng cần quyết định kích thước lưới, các địa chất lớn được chia sẻ trên một số lưới, việc phân cụm có thể khiến lưới bị quá tải, chi phí tuần tự hóa / giải tuần tự có thể là một vấn đề (ngay cả khi được nén qua bộ đệm giao thức)

QuadKeys - Đây là triển khai hiện tại. về cơ bản nó giống như Grids ngoại trừ không có mức lưới đặt. khi các tính năng được thêm vào, chúng được lập chỉ mục bởi lưới tứ giác chứa hoàn toàn giới hạn của chúng (hoặc trong một số trường hợp, được chia thành hai khi không thể sử dụng một tứ giác đơn lẻ, hãy nghĩ về đường dữ liệu). Sau khi tìm thấy qk, sau đó nó được chia thành một số lượng tối đa qk nhỏ hơn cung cấp các biểu diễn hạt mịn hơn của tính năng. một con trỏ / bbox cho tính năng đó sau đó được đóng gói vào một lưới lưới nhẹ (nhóm tính năng) có thể được truy vấn (một thiết kế ban đầu đã truy vấn các tính năng trực tiếp nhưng điều này tỏ ra quá chậm / tốn nhiều CPU trong trường hợp bộ kết quả lớn)

Polyline Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_1.png Polygon Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_2.png

Quy ước đặt tên tứ giác được sử dụng ở trên là nổi tiếng và quan trọng hơn, có xu hướng bảo tồn địa phương (mô tả thêm ở đây )

Đa giác trên hình đa giác ở trên trông giống như thế này: 03201010101010101

nếu giới hạn truy vấn đủ nhỏ, bạn có thể tìm nạp trực tiếp qua qk. điều này là tối ưu vì nó chỉ là một cuộc gọi rpc hàng loạt duy nhất đến datatore GAE. nếu giới hạn đủ lớn để bao gồm quá nhiều qks có thể (> 1000) thì bạn có thể truy vấn thay thế bằng bộ lọc (ví dụ: qk> = 0320101013 và qk <= 0320101013 + \ ufffd). Quy ước đặt tên tứ giác cộng với cách chuỗi chỉ mục GAE cho phép truy vấn ở trên chỉ tìm nạp các lưới hiện có nằm dưới giá trị qk đó.

Có những vấn đề khác và hoàn hảo, nhưng nói chung, khả năng truy vấn trên các tứ giác làm cho nó khả thi

ví dụ - truy vấn về các quận của Hoa Kỳ: Geojson

Ưu điểm - khá nhanh, không có cấu hình kích thước lưới, không có dấu chân bộ nhớ, không có lưới quá đông

Nhược điểm - tiền xử lý cần thiết, có thể tải quá mức trong một số trường hợp, không có dữ liệu cực

Đường cong lấp đầy không gian - Hãy xem cuộc trò chuyện NextGen Queries của Alfred tại Google I / O năm nay. Việc bao gồm các đường cong điền không gian / thời gian chung cùng với các toán tử MultiQuery mới (chạy song song) sẽ cho phép một số truy vấn không gian thực sự thú vị. Nó sẽ đánh bại hiệu năng SQL truyền thống? Khó nói nhưng nên mở rộng quy mô thực sự tốt. Và chúng tôi đang nhanh chóng tiếp cận một tương lai nơi các thiết bị di động luôn có đủ hình dạng / kích cỡ sẽ tăng lưu lượng truy cập đến trang web / dịch vụ của bạn một cách đáng kể.

cuối cùng, tôi cũng đồng ý rằng bạn nên xem xét kỹ về miền vấn đề của mình trước khi chọn NoQuery qua SQL. Trong trường hợp của chúng tôi, tôi thực sự thích mô hình định giá của GAE vì vậy thực sự không có lựa chọn nào nhưng nếu bạn không cần phải mở rộng quy mô, hãy tiết kiệm thời gian và chỉ cần sử dụng db sql tiêu chuẩn


Bạn đề cập đến GAE, nhưng bạn đang sử dụng cơ sở dữ liệu nào? Có một số: cloud.google.com/products/st Storage
Don McCurdy

11

Tôi đã nghe nói về GeoCouch, đây là một triển khai của CouchDB cho dữ liệu dựa trên vị trí. Và tôi cũng nghĩ rằng MongoDB có khả năng lập chỉ mục không gian địa lý.


Vâng, cả hai đều làm, và SimpleGeo đang xây dựng một phần mở rộng không gian cho Cassandra. Tôi chưa nghe thấy gì trong Voldemort hoặc MemCache
TheSteve0

Ồ, tôi yêu những gì SimpleGeo đang làm. Tôi ghen tị và rất thích làm việc cho họ!
JoshFinnie

8

Đây chủ yếu là một câu hỏi về thuật toán. Stack Overflow cũng có thể là một nơi tốt để hỏi nó.

Trong mọi trường hợp, câu trả lời cho câu hỏi trực tiếp của bạn là "có, bạn có thể sử dụng cửa hàng kvp để thể hiện dữ liệu không gian." Một câu hỏi hay hơn, tuy nhiên có thể là "TÔI NÊN sử dụng cửa hàng kvp để thể hiện dữ liệu không gian?"

Câu trả lời cho câu hỏi đó (giống như nhiều người khác) là "nó phụ thuộc". Nó phụ thuộc vào quy mô của bạn, khối lượng công việc (giao dịch) của bạn, tính chất của dữ liệu và cơ sở hạ tầng tính toán mà bạn có theo ý của bạn.

Cửa hàng kvp sẽ có chi phí hoạt động thấp, có thể giúp tăng thông lượng cho khối lượng chèn và cập nhật song song cao. Tuy nhiên, nó sẽ không nhanh chóng thực hiện tìm kiếm không gian (tìm tất cả các đối tượng trong một hình chữ nhật). Cho rằng bạn sẽ muốn một chỉ số không gian, như R-Tree.

Tuy nhiên, nếu bạn có một khối lượng dữ liệu thực sự lớn và một cụm máy tính khổng lồ, thì việc sử dụng chỉ số kvp có thể mang lại một số lợi ích về độ bền. Cách duy nhất để thực sự biết chắc chắn là thực hiện các phép đo hoàn hảo bằng cách sử dụng dữ liệu thực tế và truy cập các pattens mà bạn mong đợi gặp phải.

Cập nhật :

Đây là một chút thông tin. Bạn có thể sử dụng cửa hàng KVP để thực hiện tra cứu không gian. Vấn đề là nó chậm. Để xem tại sao, hãy xem xét một cái gì đó như thế này:

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

Trong đó * và # đại diện cho các đối tượng, được đặt trong lưới 11x11, với điểm gốc ở góc trên cùng bên trái. Hãy tưởng tượng tìm kiếm các đối tượng trong hình chữ nhật (4,4) - (7,7). Điều đó sẽ tìm thấy tất cả các "#". Giả sử rằng bạn đang sử dụng b + -tree để thể hiện các chỉ mục của mình trong cửa hàng KVP, bạn có thể tìm thấy kết quả bằng cách sử dụng chỉ mục "X" hoặc chỉ mục "Y". Trong trường hợp này, nó không thành vấn đề. Để thảo luận, tôi sẽ sử dụng chỉ số x. Bạn sẽ thực hiện tra cứu nhật ký (n) trong chỉ mục X để tìm nút đầu tiên có giá trị X là "4" và sau đó lặp qua các nút lá b + -tree cho đến khi bạn tìm thấy một nút có giá trị lớn hơn 7. Khi bạn Lặp lại thông qua chỉ số x, sau đó bạn sẽ từ chối mọi thứ nằm ngoài phạm vi y mong muốn.

Điều này là chậm. Hãy tưởng tượng nó trên một lưới lớn, với cùng mật độ, giả sử 100 K * 100 K. Cuối cùng, bạn sẽ phải quét các mục chỉ mục "300, 000" để chỉ tìm thấy 9 bản ghi. Tuy nhiên, nếu bạn sử dụng R-Tree được cân bằng chính xác, thì việc tra cứu chỉ mục có thể chỉ cần quét khoảng 90 bản ghi hoặc hơn thế. Đó là một sự khác biệt rất lớn.

Tuy nhiên, vấn đề là giữ cho R-Tree cân bằng là tốn kém. Đây là lý do tại sao câu trả lời là "nó phụ thuộc" và tại sao câu hỏi "tôi có nên làm điều này" quan trọng hơn nhiều so với "làm thế nào để tôi làm điều đó".

Nếu bạn chèn và xóa nhiều bản ghi và chủ yếu thực hiện tra cứu "ID đối tượng" và không thường xuyên thực hiện tra cứu "không gian", thì việc sử dụng chỉ mục KVP của bạn sẽ mang lại cho bạn hiệu suất tốt hơn cho những gì bạn thực sự muốn sử dụng hệ thống . Tuy nhiên, nếu bạn chèn hoặc xóa không thường xuyên, nhưng thực hiện tra cứu không gian rất nhiều, thì bạn muốn sử dụng R-Tree.


Tôi sẽ không chấp nhận một câu trả lời như "có, bạn có thể." bởi vì tôi muốn biết CÁCH . Và "NÊN TÔI .." không phải là một câu hỏi hay hơn, vì như bạn đã nói "nó phụ thuộc".
Jonas

1
Tôi phải không đồng ý với bạn. Nếu bạn muốn xây dựng một hệ thống hữu ích hoặc để lại một tài liệu tham khảo hữu ích trên internet cho những người khác xây dựng các hệ thống tương tự, thì "tôi nên" quan trọng hơn nhiều so với "làm thế nào". Vì lợi ích của việc hữu ích, tuy nhiên tôi đã chỉnh sửa câu trả lời của mình để bạn cung cấp một số thông tin về cách thức.
Scott Wisniewski

@Jonas Tôi tin rằng câu trả lời "lời khuyên" bạn nhận được là do cách bạn đặt câu hỏi: "nhưng tôi cũng đã đọc về tất cả các cơ sở dữ liệu NoQuery và các cửa hàng Key-Value có vẻ thú vị." Điều này có tất cả các đặc điểm của một giải pháp tìm kiếm một vấn đề.
JasonBirch

NoQuery không giải quyết được vấn đề, nhưng thực tế không có ai mắc phải vì họ không làm việc ở quy mô đủ lớn. Thật không may, thật tuyệt khi nghĩ rằng các hệ thống của chúng ta lớn hơn trong sơ đồ lớn hơn so với thực tế. :)
JamesRyan


1

Trong phần lớn các trường hợp, bạn sẽ nhận được nhiều tiện ích hơn từ lưu trữ dữ liệu quan hệ so với bạn sẽ lưu trữ từ khóa / giá trị hoặc lưu trữ khóa / giá trị / loại. Có những phức tạp đáng kể xung quanh việc truy vấn và báo cáo hiệu quả về loại sơ đồ dữ liệu này.

Lời khuyên của tôi sẽ là đánh giá chặt chẽ xem liệu quy mô của bạn có thực sự cần NoQuery hay không trước khi xem xét cách sử dụng nó.


1
Đây là một ví dụ về một vấn đề bạn có thể có (và một giải pháp cho vấn đề đó) nếu bạn cần tính toán nếu một điểm nằm trong hoặc bên ngoài hình học. code.google.com/p/giscloud/wiki/SerializedSpatial Indexes
Jon Bringhurst

Xin chào @Jon, điều đó sẽ được thêm vào dưới dạng Câu trả lời. Bằng cách đó, nó có thể tự đứng vững và bạn sẽ nhận được tín dụng cho nó nếu mọi người nghĩ rằng nó có công!
JasonBirch




Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.