2010-11-03 3 views
0

Я разрабатываю базу данных MySQL и соответствующее приложение RoR, которое будет содержать различные предприятия, каждый бизнес будет иметь адрес.Поиск DB (of business) по местоположению

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

Вот грубый ERD: alt text

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

Спасибо!

+0

Что вы, кажется, достаточно нормально. Если вы хотите найти предприятия на основе расстояния, вам понадобятся координаты. – Stephen

+0

- это поиск, ограниченный для собственной страны пользователя, например. Я живу в Лондоне, ищу сырую компанию, ваша система предлагает компании, которая находится всего в 30 милях от отеля, но она находится по каналу во ФРАНЦИИ! не очень хорошо для меня, так как я ненавижу путешествовать - или это будет ВАЛИДНЫЙ ХИТ в вашей системе? –

+0

@ f00 спасибо за понимание, мы планировали ограничить его страной. Поэтому, если вы ищете в Великобритании, он только вернет результаты поблизости. – christo16

ответ

2

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

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

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

1

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

+0

Хорошо, поймите, спасибо! – christo16

1

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

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

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

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

Ресурсы:

Смежные вопросы