Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Поиск в БД (предприятий) по местоположению

Автор вопроса: christo16Ответов: 3

Я разрабатываю базу данных MySQL и соответствующее приложение RoR, которое будет содержать различные предприятия, у каждого предприятия будет адрес.

Требование этого приложения - выполнять поиск в базе данных по городу / стране (это касается предприятий по всей Европе / Великобритании). Результаты поиска будут возвращены ближайшим городом в этой стране.

Вот приблизительный ERD:

Как лучше всего организовать БД? Следует ли переместить поле города в отдельную таблицу? Должен ли я хранить GPS-координаты для каждой компании?

Спасибо!

  • То, что у вас есть, кажется вполне нормальным. Если вы хотите определять местонахождение предприятий по расстоянию, вам понадобятся координаты. Stephen 03.11.2010
  • это поиск, ограниченный собственной страной пользователя, например Я живу в Лондоне, ищу компанию по производству сыра, ваша система предлагает компанию, которая находится всего в 30 милях от отеля, но находится через пролив во ФРАНЦИИ !! на самом деле не очень хорошо для меня, потому что я ненавижу путешествия - или это будет ДЕЙСТВИТЕЛЬНЫМ ХИТОМ в вашей системе? Jon Black 03.11.2010
  • @ f00 спасибо за понимание, мы планировали ограничить его страной. Поэтому, если вы ищете в Великобритании, он будет возвращать только результаты поблизости. christo16 04.11.2010
  • ах, хорошо, тогда вы можете посмотреть мое решение здесь stackoverflow.com/questions/3983325/ Jon Black 04.11.2010

ruby-on-railsdatabasegeolocationdatabase-design

Ответы

Ответ 1 · рейтинг 2 · D'Arcy Rittich

Я бы сохранил город в отдельной таблице с широтой / долготой ратуши (или центра города). Затем для каждого магазина я сохранял широту / долготу.

Это позволит вам рассчитать расстояние от магазина до центра города и ранжировать по расстоянию, чтобы вы могли показать верхнюю N.

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

Ответ 2 · рейтинг 1 · dotariel

Вам не нужно ссылаться на countryID из вашей Businesses таблицы, поскольку таблица PostalCodes уже имеет FK для таблицы Countries.

Ответ 3 · рейтинг 1 · Jesse Wolgamott

Я думаю, что наличие стран и почтовых индексов - это перебор, не беспокойтесь. В таблице "Страны" укажите адрес, город, штат, почтовый индекс, страну, широту и долгосрочность.

Затем используйте GeoKit для геокодирования вашего адреса в Lat / Lng, если ваш адрес обновлен до_save.

Тогда вы сможете быть крутым и говорить что-то вроде (найти все компании в радиусе 10 миль от этого адреса)

Business.within.find(:all, :origin=>'100 Spear st, San Francisco, CA', :within=>10)

Ресурсы:

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы