Можно ли использовать хранилище Key-Value для геопространственных данных?


26

В прошлом я использовал много реляционных баз данных, но я также читал обо всех базах данных NoSQL, и хранилища Key-Value выглядят интересно.

Когда я сохраняю геометрический объект, я в основном использую пять индексированных столбцов ID, MIN_X, MAX_X, MIN_Y и MAX_Y (где X и Y находятся в проекции карты). Мне не нужен индекс на других моих данных.

Мне нужны значения X и Y для поиска объектов в указанном месте (прямоугольник карты), и мне нужно значение ID, если я хочу обновить указанный объект.

Есть ли способ, которым я могу использовать хранилище Key-Value для этого?

Ответы:


18

Мы используем Google AppEngine для выполнения пространственных / атрибутивных запросов, и основная проблема (с первого дня) заключается в том, как индексировать большие наборы линий / полигонов произвольного размера. Точечные данные не слишком сложны (см. Geohash, geomodel и т. Д.), Но наборы случайно сгруппированных малых / больших полигонов всегда были проблемой (а в некоторых случаях все еще остаются)

Я пробовал несколько разных версий пространственной индексации на GAE, но большинство из них - только варианты двух ниже. Ни один из них не был так быстр, как базы данных SQL, и у всех были свои плюсы и минусы. компромисс кажется разумным для большинства интернет-картографических приложений. Кроме того, два приведенных ниже должны быть связаны с отбраковкой геометрии в памяти (через JTS и т. Д.), Чтобы удалить любые функции, которые не соответствуют конечным параметрам поиска. и, наконец, они полагаются на специфические функции GAE, но я уверен, что это может быть применено к другим архитектурам (или использовать TyphoonAE для запуска на кластере Linux, ec2 и т. д.)

Сетки - упакуйте все функции для определенной области в известный индекс сетки. Поместите небольшой пространственный индекс в сетку, чтобы вы могли быстро перемещаться по набору объектов, которые он содержит. Для большинства запросов вам понадобится всего лишь несколько быстрых сеток, поскольку вы знаете точное соглашение о присвоении имен сетке и его отношение к K / V-сущностям (получает, а не запрашивает)

Плюсы - довольно быстрый, простой в реализации, не занимает памяти.

Минусы - необходима предварительная обработка, пользователь должен определить размер сетки, большие геомы разделяются на несколько сеток, кластеризация может вызвать перегрузку сеток, могут возникнуть проблемы с сериализацией / десериализацией (даже при сжатии через буферы протокола)

QuadKeys - это текущая реализация. в основном это то же самое, что и сетки, за исключением того, что нет установленного уровня сетки По мере добавления объектов они индексируются сеткой четырехугольников, которая полностью содержит их границы (или, в некоторых случаях, делятся на две части, когда нельзя использовать один четырехъядерный ключ, подумайте о дате). После того, как qk найден, его затем разбивают на максимальное число меньших qk, которые обеспечивают более точные представления зерна объекта. указатель / bbox на эту функцию затем упаковывается в облегченный индекс сетки (группа функций), который можно запрашивать (оригинальный дизайн запрашивал функции напрямую, но это оказалось слишком медленным / интенсивно использующим процессор в случаях, когда набор результатов был большим)

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

Соглашение об именах quadkey, использованное выше, хорошо известно и, что более важно, имеет тенденцию сохранять локальность (более подробно описано здесь )

Вышеупомянутый многоугольник выглядит примерно так: 0320101013123 03201010131212 03201010131213 0320101013132 0320101013133 03201010131302 03201010131302 032010101313002 0320101010131301010101010101010101010101010101010101010101010101010101310101010101310101310101010131010101010131010101010100

если границы запроса достаточно малы, вы можете получить их напрямую через qk. это оптимально, поскольку это только один пакетный вызов rpc в хранилище данных GAE. если границы достаточно велики, чтобы включить слишком много возможных qks (> 1000), вы можете альтернативно выполнить запрос, используя фильтр (например: qk> = 0320101013 и qk <= 0320101013 + \ ufffd). Соглашение об именах quadkey плюс способ, которым GAE индексирует строки, позволяет вышеприведенному запросу извлекать только существующие сетки, которые опускаются ниже этого значения qk.

Существуют и другие предостережения и проблемы с перфорированием, но, как правило, это делает возможным выполнение запросов на Quadkeys, что делает его возможным

примеры - запрос по округам США: геойсон

Плюсы - довольно быстро, нет конфигурации размера сетки, нет места в памяти, нет переполненных сеток

Минусы - необходима предварительная обработка, возможна перегрузка в некоторых сценариях, нет полярных данных

Кривые заполнения пространства - взгляните на выступление Альфреда NextGen Queries в Google I / O в этом году. Включение общих кривых заполнения пространства / времени вместе с новыми операторами MultiQuery (выполняемыми параллельно) позволит выполнить некоторые действительно классные пространственные запросы. Будет ли он побить традиционную производительность SQL? Трудно сказать, но это должно действительно хорошо масштабироваться. И мы быстро приближаемся к будущему, когда постоянно подключенные мобильные устройства всех форм / размеров значительно увеличат трафик на ваш сайт / услугу.

наконец, я также согласен с тем, что вам следует внимательно изучить проблемную область, прежде чем выбирать NoSQL вместо SQL. В нашем случае мне действительно понравилась модель ценообразования GAE, так что выбора действительно не было, но если вам не нужно масштабировать, сэкономьте время и просто используйте стандартный sql db


Вы упоминаете GAE, но какую базу данных вы используете? Их несколько: cloud.google.com/products/storage
Дон

11

Я слышал о GeoCouch, который является реализацией CouchDB для данных, основанных на местоположении. И я также думаю, что MongoDB имеет возможности геопространственной индексации.


Да, они оба делают, и SimpleGeo строит пространственное расширение Cassandra. Я ничего не слышал о Волдеморте или MemCache
TheSteve0

О, я люблю то, что делает SimpleGeo. Я завидую и хотел бы работать на них!
ДжошФинни

8

Это в основном вопрос об алгоритмах. Переполнение стека также может быть хорошим местом, чтобы спросить об этом.

В любом случае, ответ на ваш прямой вопрос - «да, вы можете использовать хранилище kvp для представления пространственных данных». Лучший вопрос, однако, может быть «Должен ли я использовать хранилище kvp для представления пространственных данных?»

Ответ на этот вопрос (как и многие другие): «это зависит». Это зависит от вашего масштаба, вашей (транзакционной) рабочей нагрузки, характера данных и вычислительной инфраструктуры, которой вы располагаете.

Хранилище kvp будет иметь низкие накладные расходы, что может помочь увеличить пропускную способность для больших объемов вставки и параллелизма обновления. Однако не будет очень быстро выполнять пространственный поиск (найти все объекты в прямоугольнике). Для этого вам нужен пространственный индекс, например, R-Tree.

Однако, если у вас действительно большой объем данных и огромный кластер компьютеров, то использование индекса kvp может обеспечить некоторые преимущества производительности. Единственный способ узнать наверняка - это провести измерения производительности с использованием фактических данных и получить доступ к шаблонам, которые вы ожидаете встретить.

Обновление :

Вот немного больше информации. Вы можете использовать магазин KVP для поиска в пространстве. Проблема в том, что это медленно. Чтобы понять почему, рассмотрим что-то вроде этого:

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

Где * и # представляют объекты, расположенные в сетке 11x11, с началом координат в верхнем левом углу. Представьте себе поиск объектов внутри прямоугольника (4,4) - (7,7). Это должно найти все "#". Предполагая, что вы используете дерево b + для представления своих индексов в хранилище KVP, вы можете найти результаты, используя индекс «X» или индекс «Y». В этом случае не имеет значения, какой. Для обсуждения я буду использовать индекс х. Вы должны выполнить поиск log (n) в индексе X, чтобы найти первый узел со значением X, равным «4», а затем перебрать листовые узлы дерева b +, пока не найдете узел со значением, большим 7. Когда вы перебирая индекс x, вы отклоняете все, что находится за пределами желаемого диапазона y.

Это медленно. Представьте себе это на большой сетке с такой же плотностью, скажем, 100 K * 100 K. Там вам придется сканировать «300 000» записей индекса, чтобы найти только 9 записей. Однако, если вы используете правильно сбалансированное R-дерево, тогда для поиска по индексу, вероятно, потребуется отсканировать около 90 записей или около того. Это огромная разница.

Проблема, однако, заключается в том, что поддержание сбалансированного R-дерева стоит дорого. Вот почему ответ «это зависит», и почему вопрос «должен ли я сделать это» гораздо важнее, чем «как мне это сделать».

Если вы часто вставляете и удаляете записи, и в основном выполняете поиск по «идентификатору объекта» и не часто выполняете «пространственный» поиск, то использование индекса KVP даст вам лучшую производительность для того, что вы действительно хотите использовать для системы. , Однако, если вы вставляете или удаляете нечасто, но выполняете пространственный поиск много раз, тогда вы захотите использовать R-Tree.


Я бы не принял ответ типа «да, ты можешь». потому что я хочу знать, КАК . И «ДОЛЖЕН я ..» не лучший вопрос, потому что, как вы сказали, «это зависит».
Джонас

1
Я должен не согласиться с вами. Если вы хотите создать полезную систему или оставить полезную ссылку в Интернете для других людей, создающих подобные системы, то «должен я» гораздо важнее, чем «как». Однако, чтобы быть полезным, я отредактировал свой ответ, чтобы вы предоставили некоторую информацию о том, как это сделать.
Скотт Вишневски

@Jonas Я полагаю, что ответы на «советы» вы получили благодаря тому, как вы задали вопрос: «но я также прочитал обо всех базах данных NoSQL, и хранилища Key-Value выглядят интересно». Это имеет все признаки решения проблемы.
JasonBirch

NoSQL действительно решает проблему, но это проблема, которой практически никто не имеет, потому что они не работают в достаточно широком масштабе. К сожалению, всегда приятно думать, что наши собственные системы больше в общей схеме вещей, чем они есть на самом деле. :)
JamesRyan

4

Если вы используете значения широты / долготы , вы можете использовать геохэш как часть значений вашего магазина.

Вот один для Нью-Йорка. dr5regy6rc6ye

С помощью геохеша вы можете начать сбивать символы в конце геохеша, чтобы получить сетку различной точности: http://geohash.org/dr5re

Пример реализации js: http://github.com/davetroy/geohash-js


1

В большинстве случаев вы получите больше полезности от хранилища реляционных данных, чем от хранилища ключ / значение или ключ / значение / тип. Существуют значительные сложности, связанные с эффективным запросом и представлением отчетов по этому виду схемы данных.

Мой совет - внимательно оценить, требует ли ваша шкала NoSQL, прежде чем подумать, как его использовать.


1
Вот пример проблемы, которая может возникнуть (и решение), если вам нужно вычислить, находится ли точка внутри или снаружи геометрии. code.google.com/p/giscloud/wiki/SerializedSpatialIndexes
Джон Брингхерст,

Привет @Jon, это было бы лучше добавить в качестве ответа. Таким образом, он может стоять сам по себе, и вы получите за это должное, если люди подумают, что это имеет смысл!
JasonBirch


1

MongoDB имеет возможность создавать и использовать геопространственные индексы, основанные на строгих свойствах 2d [x, y] кортежей Documents, и позволяет выполнять запросы как «ближнего», так и «ограниченного» типа. Однако он не обрабатывает какие-либо поправки для проекций и использует идеализированную модель плоской земли



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.