Всем привет! Часто использую базу данных городов, регионов, стран, населенных пунктов и так далее в своем проекте.
Например:
1. пользователи в профиле выбирают свой город.
2. мероприяти относятся к определенному городу.
3. Новости привязанные к определённому городу
По итогу получается, что мне нужно в каждую таблицу добавить city_id и уже по этому полю получаю название города, региона, страны...
Сейчас эту базу данных я вбиваю в ручную. Знаю, что есть различные большие базы, но некоторые весят по 1 ГБ. Столько городов не всегда требуется....
Так как часто использую подобные вещи и, по всем правилам, имеет смысл вынести это все в компонент City. Но вопрос не об этом... Может быть есть уже какие-то практики использования подобных компонентов с городами? Например, какой-нибудь geo кодер от яндекса... Поделитесь ссылками и информацией как вы используете в своих проектах подобные базы? Возможно есть единая база на стороннем сервере, а в проекте только хранить ID. Буду благодарен любой помощи)
1) Определитесь с целевой аудиторий и импортируйте базу городов только тех стран, которые нужны
2) посмотрите на готовые решения. Например для РФ есть отличный сервис dadata checker. Либо воспользуйтесь услугами гугл карт (или яндекс карт - пожалуйста, просто гуглите их API), давая пользователю самому возможность выбрать локацию и уже по локации парсить страну и город.
3) ну и вручную это ужасно.
1. это вариант я сейчас и использую. Но хранить в базе не очень хочется.
2. Скорее всего подойдёт вариант с Гугл и яндекс картами. Думаю, что это самое то) И хранить не нужно и актуальная база. Только как хранить информацию о городе? В текстовом формате получается? И парусите по текстовому формату если нудно получить регион? Может быть есть где-то пример компонента?
3. Согласен, но для небольшого проекта прокатывало. Теперь совсем не нравится.
у сторонних сервисов есть нормализированное название города, так что текстом - да, почему бы и нет?
А еще можно хранить place_id по которому всегда можно глянуть инфу
текстовому формату если нудно получить регион?
нене, там они разделены, вот и вы разделяйте. У гугла довольно большая система определения локаций. Там три уровня административных округов (область, город, район), в общем много что есть.
Decadal, спасибо за разъяснения) И все таки, как это использовать? Ни разу не работал с этим. Что-то пока не могу понять. Работал только с картами по api. Может быть тогда видео есть какие-то или статьи для «далеких»? Или готовые компоненты? Буду очень благодарен)
Максим Ворожцов, Используйте так как придумаете. На туристическом проекте у нас используется список своих городов, который дополняется гугловыми городами. Если к нам заходит город (пользователь указал точку на гугл картах, для которой есть город, известный гуглу), которого нет ни в основной таблице, ни в локализации городов (similarity сверка, модуль постгреса), и по его координатам не находится никакого города из нашей базы в радиусе 2-х км - мы создаем новый город в нашей базе.
Если такого города в базе нет, но рядом (менее 2-х км) лежит город в нашей базе - присваиваем его айдишник, а новый город не создаем. Если город, который указывает пользователь, есть в базе и совпадает по имени или по локализации, а также разница координат между указанным городом и городом из базы - меньше двух км, считаем город найденным и используем айди из нашей базы.
Вы можете сколько угодно упрощать или усложнять этот алгоритм)
Если вашему проекту требуется геобаза всего мира (на гиг(или на 23, если с локализацией)), то стоимость этого гига (или 23 гигов) вас волновать не должна.
Я вот тоже сейчас смотрю в эту сторону. Пожалуй буду туда копать. Сделать отдельный модуль для этого и получать всё по id API VK. только как лучше взаимодействовать между независимыми модулями и этим модулем? Через глобальный component? Я даже нашел решение.. https://github.com/skeeks-cms/cms-vk-database правда его придется изменить. Там нет access_token
Максим Ворожцов, Я думаю стоит города хранить у себя, но не все, а те что реально используются, что бы при выводе имени города, как связанной сущности не бегать к ВК за строкой. А вот списки всех городов или выборки городов по регионам, брать из ВК api, при этом в базе наверное стоит иметь 2 id, один свой и id vk, а может свой и не нужен. Просто если понадобиться город, которого нет у ВК, то можно иметь 15 | null | Чережопск и не бояться войти конфликтом id-шника с ВК-шным.
Максим Тимофеев, вот как раз в этом расширении так и сделано) У меня только вопрос как получать имя города, например, у пользователя и делать это так, чтобы модуль был независимым... Через Абстракцию?
если мне не изменяет память то раньше для списка городов токены были не нужны, это публичные данные были. Возможно закрыли сейчас, давно не лазил.
Но кстати вот и минус главный этого подхода. Измениться политика ВК или API и надо быдет переделывать. Так что стоит внедрить вариант, если не отвечает ВК, берем выборку своих.
Это самый простой вариант. Тоже имеет место быть, но пользователь может кучу таких городов создать. Если не жесткая нужна привязка по городам, то да. В моем случае важна точность...
EVGENY T., тоже как вариант) Не подумал об этом... А как тогда хранить в базе? Я обычно храню у пользователя id города, а тут получается имя надо хранить его вписанное название и id из таблицы городов? Или две таблицы городов? Можете подробнее написать вашу идею?) Буду благодарен. Хочется рассмотреть все плюсы и минусы разных вариантов
Кажется понял вашу идею. Вы предлагаете в поле город хранить имя города, а не id. Далее по крону раз в сутки мы запускаем поиск городов. Если название города встречается несколько раз, то его записываем в базу наших городов. Верно?
Максим Ворожцов, второй вариант: в таблице City завести поле "checked". И считать что город на полных правах в базе городов, только после того, как несколько пользователей ввели его название.