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

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

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

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

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

Спасибо!


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


Ответы (3)


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

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

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

person D'Arcy Rittich    schedule 03.11.2010

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

person dotariel    schedule 03.11.2010

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

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

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

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

Ресурсы:

person Jesse Wolgamott    schedule 03.11.2010