Comments 11
Что КЛАДР, что ФИАС, что ГАР - это неустанные попытки каталогизировать беспорядок. Мой 20-ти летний опыт работы в ИТ говорит, что работа с адресами пока будет нескончаемой головной болью для программистов, независимо от того, какие технологии натягивать на эту кучу нечётких правил и их исключений.
Адрес это строка. И ничего больше. Индекс можно.
Если адреса без улиц. Есть город в городе. Есть деревня в городе. Номера домов бывают любыми. Даже бывает что они выглядят как не номер вообще. Регион может быть равен городу. И так далее.
Отметим, что ни районы, ни населённые пункты типов не имеют…для небольших населённых пунктов часто путают посёлки, сёла и поселения, например, и т.п. И с одинаковыми именами и разными типами в одном районе населённые пункты нам не встречались
Это вам не встречались …
Однако:
Да, действительно, две деревни Антониха в Варнавинском районе Нижегородской области. И таких примеров по России сотня-другая, даже с разными типами. Но в нашей модели на такой случай получится несколько разных 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))
Модель почтовых адресов в реляционных БД