Расчет расстояния - на лету или как только данные вводятся в базу данных? - PullRequest
1 голос
/ 05 марта 2012

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

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

Я делаю это по формуле haversine.

Моя проблема в том, как мне поступить?Как я могу сделать это на лету?Или мне нужно рассчитать все пользовательские расстояния, когда пользователь регистрируется, и сохранить их?

Должен ли обслуживать сортировку: т.е. сначала самое короткое расстояние.

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Если вы сохраняете все расстояния между всеми вашими пользователями во время регистрации, вы обнаружите, что очень быстро сохраните большой объем данных - для 100 пользователей, ~ 5000 фрагментов данных. Для 1000 пользователей ~ 500 000 (с соответствующими расчетами, необходимыми для каждого) - плюс, если пользователь меняет свое местоположение, эти данные немедленно становятся избыточными, что требует пересчета для всех пользователей. Опять же, огромная проблема с большим количеством пользователей.

Вам, вероятно, было бы лучше делать это на лету - MySQL предлагает пространственные расширения, которые вы можете использовать для оптимизации поиска по местоположению (см. http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html)

Очень простой пример использования этих расширений можно найти по адресу http://maisonbisson.com/blog/post/12147/working-with-spatial-data-in-mysql/ - более сложные примеры должны позволять вам возвращать все точки в радиусе r.

Кто-то еще упомянул вычисление этого на стороне клиента с использованием Javascript. Конечно, есть возможность, но еще раз подумайте, если у вас большое количество пользователей, скажем, 10 000 - вам сначала нужно будет передать все эти данные клиенту (что приведет к задержке при получении HTTP), а затем предположить, что они обладают достаточно мощным Процессор для выполнения расчетов (что если кто-то смотрит на ваш сайт на старом смартфоне?). Вы можете остановить их браузер на несколько секунд, пока идет процесс.

1 голос
/ 05 марта 2012

Если количество пользователей будет очень большим (или неограниченным), то у вас могут возникнуть проблемы.

Для вычисления этого аванса может потребоваться немного места.Но для расчета по требованию может потребоваться большое количество процессорного времени сервера.

Некоторые соображения:

  1. Использование MySQL для выполнения геосортировки.http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

  2. Рассмотрим расчет расстояний только для небольшого подмножества других пользователей.

  3. Рассмотрим преимущества динамического вычисления расстояний на клиентском компьютере с использованиемJavaScript.

0 голосов
/ 05 марта 2012

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

Если вы хотите реализовать ее самостоятельно, это то, как эти базы данных делают внутренне:

Разделите карту на большиепрямоугольные сетки (скажем, 10 км х 10 км сетки).Для каждого пользователя добавьте столбец, в котором указывается, в какой сетке он находится. Вместо поиска по всему пользователю вы можете просто выполнить поиск по этой конкретной сетке и соседним с ней 8 сеткам.

...