Pull to refresh

Comments 11

Что КЛАДР, что ФИАС, что ГАР - это неустанные попытки каталогизировать беспорядок. Мой 20-ти летний опыт работы в ИТ говорит, что работа с адресами пока будет нескончаемой головной болью для программистов, независимо от того, какие технологии натягивать на эту кучу нечётких правил и их исключений.

Стоит отметить, что ГАР по сравнению с ФИАС (и тем более КЛАДР) - большой шаг вперёд в деле каталогизации. И в плане нормализации прогресс не стоит на месте (Yandex, DaData, Pullenti...). Головной боли стало значительно меньше, работаем...

Адрес это строка. И ничего больше. Индекс можно.

Если адреса без улиц. Есть город в городе. Есть деревня в городе. Номера домов бывают любыми. Даже бывает что они выглядят как не номер вообще. Регион может быть равен городу. И так далее.

Изначально адрес - строка. Но строковое представление неудобно для разной аналитики, так что приходится решать эту проблему.

Так это потом тащат в форму ввода адреса. И все начинают страдать. Мол вашего адреса не существует потому что не может существовать.

Отметим, что ни районы, ни населённые пункты типов не имеют…для небольших населённых пунктов часто путают посёлки, сёла и поселения, например, и т.п. И с одинаковыми именами и разными типами в одном районе населённые пункты нам не встречались

Это вам не встречались …

Однако:

https://47channel.ru/event/iz-derevni-v-selo-poselok-ili-mestecko-v-volxovskom-raione-privodyat-v-poryadok-kartu

https://vesti-yaroslavl.ru/novosti/item/100725-v-yaroslavskoj-oblasti-chast-naselennykh-punktov-s-odinakovym-nazvaniem-izmenyat-svoj-tip

https://www.kommersant.ru/doc/8159662

Да, действительно, две деревни Антониха в Варнавинском районе Нижегородской области. И таких примеров по России сотня-другая, даже с разными типами. Но в нашей модели на такой случай получится несколько разных Guid при привязке, так что гео-тёзки укладываются в модель. При запросе по имени мы найдём обе деревни.

Информация, что есть Pullenti и в SDK есть SqlHelper - это конечно здорово, но все-таки хотелось бы увидеть схему таблицы и примеры запросов поиска.

Ещё раз отмечу, что поля можно не в отдельной таблице, а в той, где уже есть колонка с адресом. У меня в рамках этой модели отдельная таблица такая:

CREATE TABLE public.addresses (

id bigint NOT NULL,

text character varying(256) COLLATE pg_catalog.“default”,

normal character varying(256) COLLATE pg_catalog.“default”,

coef integer,

message character varying(128) COLLATE pg_catalog.“default”,

level integer,

country_code character varying(2) COLLATE pg_catalog.“default”,

region_mnem character varying(64) COLLATE pg_catalog.“default”,

region_guid uuid[],

city_mnem character varying(64) COLLATE pg_catalog.“default”,

city_guid uuid[],

district_mnem character varying(64) COLLATE pg_catalog.“default”,

district_guid uuid[],

location_mnem character varying(64) COLLATE pg_catalog.“default”,

location_guid uuid[],

territory_mnem character varying(64) COLLATE pg_catalog.“default”,

territory_type character varying(32)[] COLLATE pg_catalog.“default”,

territory_guid uuid[],

street_mnem character varying(64) COLLATE pg_catalog.“default”,

street_type character varying(32)[] COLLATE pg_catalog.“default”,

street_guid uuid[],

house_mnem character varying(32) COLLATE pg_catalog.“default”,

house_guid uuid[],

apartment_mnem character varying(32) COLLATE pg_catalog.“default”,

apartment_guid uuid[],

gps_lat real,

gps_lon real,

gps_level integer,

misc character varying(32) COLLATE pg_catalog.“default”,

CONSTRAINT addresses_pkey PRIMARY KEY (id) )

Насчёт запросов - SQL генерируется на основе запросов на естественном языке.

Пусть в таблице PERSONS - персоны, ADDRESS - адреса, PERSONS_ADDDRESSES - таблица связи.

Для запроса "люди родившиеся после 1990 года и проживающие в москве на проспекте жукова" система сгенерирует:

select distinct concat('V=', p.full_name, ';PERSON=', p.id, ';SID=', p.source_id, ';BD=', to_char(p.birth_day, 'yyyy.mm.dd'), ';BY=', p.birth_year, ';G=', p.gender, ';') as "Персона"   

from PERSONS p  

where p.birth_day > '1990-01-01'    and exists (

select * from PERSONS_ADDRESSES p_a

join ADDRESSES a on p_.id2 = a.id

      where p_a.id1 = p.id  and p_a.type_id = 3

and '9e722ecb-da00-452a-b3b5-51b7bc208432' = any(a.street_guid)

)  order by 1

Здесь из запроса сразу для город + улица получилась привязка к ГАР и добавилось условие на поле street_id.

Но если убрать из запроса город, а только проспект Жукова, то привязки к ГАР не получится и запрос будет на условие мнемоник и типа:

and a.street_mnem = 'ЖУКОВ' and ('ПРОСПЕКТ' = any(a.street_type))

Sign up to leave a comment.

Articles