Нормализация адресов в реляционной БД: как разложить адрес на GUID-ы
В офисе аналитик открывает таблицу с адресами, которые записаны в одном поле как «ул. Ленина, д. 5, кв. 12».
В статье предлагается разбить адрес на отдельные элементы, привязать каждый к GUID из государственного реестра ГАР ФИАС и хранить в таблице как отдельные колонки.
Это позволяет быстро находить дубликаты, выполнять геокодирование и делать запросы по отдельным компонентам адреса.
Перед внедрением стоит проверить, есть ли у вас доступ к SDK Pullenti Address и как покрытие ФИАС выглядит для ваших регионов.
Источник: Habr
Что изменилось в практике
- Нормализованный формат: вместо одного текста адреса создаётся таблица с полями
COUNTRY_CODE,REGION_MNEM,REGION_GUID,CITY_MNEM,CITY_GUID,DISTRICT_MNEM,DISTRICT_GUID,LOCATION_MNEM,LOCATION_GUID,TERRITORY_MNEM,TERRITORY_TYPE,TERRITORY_GUID,STREET_MNEM,STREET_TYPE,STREET_GUID,HOUSE_MNEM,HOUSE_GUID,APARTMENT_MNEM,APARTMENT_GUID, а такжеGPS_LATиGPS_LONпри наличии привязки к ФИАС. - GUID‑привязка: каждый элемент может иметь массив GUID‑ов (PostgreSQL
uuid[]), что отражает дублирование в реестре и позволяет точно сопоставлять записи. - SQL‑операции: благодаря разложению на поля можно писать простые
JOIN‑запросы,GROUP BYпо GUID‑ам иWHERE‑условия для поиска дубликатов.
Почему это важно сейчас
- Проблемы ручных адресов: вариативность написания, пропуски, искажения затрудняют поиск и анализ.
- Дублирование данных: без нормализации одинаковые адреса могут храниться в разных строках, что приводит к ошибкам в отчетах и расходу ресурсов.
- Геокодирование: наличие координат позволяет интегрировать адреса в карты, логистику и сервисы доставки.
- Стабильность ФИАС: покрытие домов в России сейчас около 67 %, но оно растёт, и привязка к реестру повышает надёжность данных.
Как превратить это в повторяемый workflow
- Сбор исходных данных
- Экспортируйте адреса из существующей системы в CSV/JSON.
- Парсинг и нормализация
- Запустите SDK Pullenti Address (Python/Java) на каждом адресе.
- Получите структуру:
country,region,city,street,house,apartmentи т.д. - Сохранение в БД
- Создайте таблицу
addressesс полями, перечисленными выше. - Для каждого адреса вставьте нормализованные строки и массив GUID‑ов.
- Проверка дубликатов
sql SELECT COUNT(*) AS cnt, STRING_AGG(id::text, ', ') AS ids, city_guid FROM addresses GROUP BY city_guid HAVING COUNT(*) > 1; - Геокодирование
- Если
GPS_LAT/GPS_LONпусты, запустите запрос к ФИАС через API или используйте локальный сервис для получения координат. - Регулярное обновление
- Периодически запускайте синхронизацию с ФИАС, обновляя GUID‑ы и координаты.
Где ограничения и риски
- Зависимость от ФИАС: модель работает только для России; в других странах потребуется аналогичный реестр.
- Коммерческий SDK: Pullenti Address – платный продукт; лицензия и стоимость могут стать препятствием для небольших команд.
- Покрытие ФИАС: 67 % домов покрыто, но в некоторых регионах покрытие ниже, что может оставить адреса без координат.
- Сложность интеграции: требуется написать парсер, настроить БД и обучить команду работе с GUID‑ами.
Что делать дальше
- Проверить доступ
- Убедитесь, что у вас есть лицензия Pullenti Address и доступ к API ФИАС.
- Тестовый запуск
- Выберите 100–200 адресов из вашей базы, запустите парсинг и сохраните в тестовую таблицу.
- Оценить покрытие
- Сравните количество заполненных
GPS_LAT/GPS_LONс общим числом записей. - Сравнить дубликаты
- Выполните примерный запрос на дубликаты и посчитайте, сколько записей можно объединить.
- Решить
- Если покрытие > 70 % и дублирующиеся адреса уменьшаются более чем на 30 %, стоит продвигать модель в продакшн.
- Если покрытие низкое или лицензия слишком дорогая, рассмотрите альтернативы (libpostal, собственный парсер).
Источники
Дополнительные соображения
При внедрении модели стоит учитывать, что нормализация адресов — это не разовая задача, а постоянный процесс. Регулярное обновление данных из ФИАС и проверка качества парсинга помогут поддерживать актуальность и точность адресной информации. Также рекомендуется документировать все этапы workflow и проводить обучение команды для минимизации ошибок при интеграции.
Практический пример: от сырых данных к нормализованному адресу
Рассмотрим конкретный пример преобразования адреса. Исходная строка: "г. Москва, ул. Тверская, д. 7, кв. 15". После парсинга с помощью Pullenti Address получаем структуру: регион — "Москва" (GUID: 0c5b2444-70a0-4932-980c-b4dc0d3f02b5), город — "Москва" (GUID: 0c5b2444-70a0-4932-980c-b4dc0d3f02b5), улица — "Тверская" (GUID: 9d136253-4b92-4e1c-9cf4-8c7b0f7a8e3d), дом — "7" (GUID: 1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d), квартира — "15". В таблицу записываются соответствующие мнемоники и GUID-ы. Если в ФИАС дом имеет дублирующую запись, в поле HOUSE_GUID сохраняется массив из двух GUID-ов. Это позволяет в будущем корректно объединять данные из разных источников.
Сравнение подходов: нормализованная модель vs. текстовая строка
Для наглядности сравним два подхода к хранению адресов. Текстовая строка "г. Москва, ул. Тверская, д. 7, кв. 15" занимает около 40 байт, но поиск всех адресов на улице Тверская требует LIKE-запроса с шаблоном '%Тверская%', что медленно и ненадёжно. Нормализованная модель с отдельными колонками занимает больше места (около 200 байт с учётом GUID-ов), но позволяет выполнять точный поиск по STREET_MNEM = 'Тверская' с использованием индекса. При объёме базы в 1 миллион записей время выполнения запроса сокращается с нескольких секунд до миллисекунд. Дополнительно, нормализация упрощает обнаружение дубликатов: два адреса с одинаковым набором GUID-ов гарантированно идентичны, даже если исходные строки различаются (например, "ул. Тверская, д. 7" и "Тверская ул., дом 7").
Метрики успеха внедрения
Для оценки эффективности модели рекомендуется отслеживать следующие показатели. Процент дубликатов: после нормализации количество повторяющихся адресов должно снизиться на 30–50%. Время выполнения запросов: среднее время поиска по адресу должно уменьшиться в 5–10 раз. Покрытие геокодированием: доля адресов с заполненными GPS-координатами должна превышать 70% для регионов с хорошим покрытием ФИАС. Точность парсинга: не менее 95% адресов должны корректно разбиваться на компоненты. Регулярный мониторинг этих метрик позволит своевременно выявлять проблемы и корректировать workflow.
Что почитать дальше
- Где есть бензин в Ростове-на-Дону: 4 сервиса, которые спасут от пустой колонки
- Где есть бензин в июле 2026: карты Т-Банка и Яндекса для поиска топлива
- 8 сервисов для проверки бензина: где есть топливо сейчас
- LLM-агенты Text-to-SQL: как автоматизировать запросы к БД без ручного кода
- MiMo Code: открытая модель для генерации кода — как локальный 7B-агент заменяет закрытые API