Это более сложный вопрос, чем то, что мне срочно нужно, поэтому не тратьте на него весь день.
Я построил сайт знакомств (давно ушел) еще в 2000 году или около того, и одна из проблем заключалась в расчете расстояния между пользователями, чтобы мы могли представить ваши "матчи" в радиусе X миль. Чтобы просто указать проблему, учитывая следующую схему базы данных (примерно):
ТАБЛИЦА ПОЛЬЗОВАТЕЛЯ Идентификатор пользователя UserName ZipCode
Таблица ZIPCODE Почтовый Индекс широта Долгота
С USER и ZIPCODE, соединенными с USER.ZipCode = ZIPCODE.ZipCode.
Какой подход вы предпримете, чтобы ответить на следующий вопрос: какие другие пользователи живут в Zip-кодах, которые находятся в пределах X миль от указанного почтового индекса пользователя.
Мы использовали 2000 данных переписи, в котором есть таблицы для почтовых индексов и их приблизительная ширина и долгота.
Мы также использовали Формулу Хаверсина для расчета расстояний между любыми двумя точками на сфере... довольно простая математика.
Вопрос, по крайней мере для нас, быть студентами 19-летнего колледжа, которым мы были, действительно стал тем, как эффективно рассчитывать и/хранить расстояния от всех членов до всех других членов. Один из подходов (тот, который мы использовали) заключался в том, чтобы импортировать все данные и рассчитать расстояние ОТ каждого почтового индекса ко всем другим почтовым индексам. Затем вы будете хранить и индексировать результаты. Что-то вроде:
SELECT User.UserId
FROM ZipCode AS MyZipCode
INNER JOIN ZipDistance ON MyZipCode.ZipCode = ZipDistance.MyZipCode
INNER JOIN ZipCode AS TheirZipCode ON ZipDistance.OtherZipCode = TheirZipCode.ZipCode
INNER JOIN User AS User ON TheirZipCode.ZipCode = User.ZipCode
WHERE ( MyZipCode.ZipCode = 75044 )
AND ( ZipDistance.Distance < 50 )
Проблема, конечно, в том, что таблица ZipDistance будет содержать в себе много строк. Это не совсем невозможно, но он очень большой. Также он требует полной предварительной работы над всем набором данных, который также не является неуправляемым, но не обязательно желаемым.
Во всяком случае, мне было интересно, какой подход некоторые из вас, гуру, могут принять что-то вроде этого. Кроме того, я думаю, что это общая проблема, с которой программисты вынуждены время от времени заниматься, особенно если вы рассматриваете проблемы, которые просто алгоритмически схожи. Я заинтересован в тщательном решении, которое включает по крайней мере HINTS на всех частях, чтобы это действительно быстро закончилось эффективно. Спасибо!