Адреса Фиас В Среде Postgresql. Часть 4. Эпилог

Это четвертая и последняя часть статьи, в которой приведены примеры создания таблицы fias_AddressObjects в базе данных под управлением PostgreSQL, а также загрузки в нее данных об адресообразующих элементах ФИАС.

После этих шагов вы можете опробовать функции, описанные в разделе первый , второй , И третий частей путем копирования и выполнения сценариев их создания.



Адреса ФИАС в среде PostgreSQL. Часть 4. ЭПИЛОГ

Полный текст статьи состоит из 4 частей.

Первая половина этой части статьи содержит комментарии по реализации скриптов создания таблицы адресообразующих элементов и заполнения ее данными.

Второй содержит исходные тексты сценариев.

Тем читателям, которых интересуют только исходные тексты, мы предлагаем сразу перейти к Приложение .



Эпилог



Когда начать

Начать необходимо с посещения официального сайта Федеральной налоговой службы, раздел «Федеральная информационная адресная система» (ФИАС) страница.

«Обновления» .

Загрузите последнее обновление или полную базу данных ФИАС на свой компьютер, если вы только начинаете работать с ФИАС.

Переместите архивный файл в рабочую папку.

Распакуйте файлы архива и найдите файл ADDROBJ.DBF. Далее предполагается, что скачан архив файлов с обновлением ФИАС в формате dbf. Преобразуйте загруженный файл ADDROBJ.DBF в формат csv. Для этого откройте исходный файл с помощью MS Excel и пересохраните его в формате csv, не забыв удалить строку с названиями полей записи.

Далее конвертированный в формат csv будет называться «ADDROBJ24_20161020.csv», где 24 — код Красноярского края, а 20161020 — дата загрузки файла.

Создайте таблицу fias_AddressObjects. Для этого можно использовать скрипт, приведенный в приложение «Создание таблицы адресообразующих элементов ФИАС fias_AddressObjects» .



Загрузка ADDROBJ24_20161020.csv в базу данных



Адреса ФИАС в среде PostgreSQL. Часть 4. ЭПИЛОГ

Рис.

7 Непосредственная загрузка данных в таблицу fias_AddressObjects. Вы можете напрямую загрузить данные из файла ADDROBJ24_20161020.csv в таблицу fias_AddressObjects, как показано на рис.

7. Но, к сожалению, простой путь не для нас.

Во-первых, помимо основного списка адресообразующих элементов предоставляется также список адресообразующих элементов, которые необходимо удалить из основного списка (DADDROBJ.DBF); Во-вторых, в основном списке присутствуют разъединения, например, ссылки, которые никуда не ведут, т.е.

в списке нет элемента или записи с указанным в ссылке идентификатором.

Поэтому я не хочу восстанавливать ошибки, которые уже однажды были исправлены.

В-третьих, я не хочу каждый раз работать с полным перечнем адресообразующих элементов ФИАС, а лишь скачивать изменения, которые появляются на официальном сайте ФНС два-три раза в неделю.

Поэтому в процессе загрузки обновления ФИАС используются две временные таблицы:

  • fias_AddressObjects_temp – для обновления основного списка адресообразующих элементов;
  • fias_DeletedAddressObjects_temp – для записей, которые необходимо удалить из основного списка.



Адреса ФИАС в среде PostgreSQL. Часть 4. ЭПИЛОГ

Рис.

8. Предварительная загрузка адресообразующих элементов во временные таблицы.

Далее данные из таблицы fias_AddressObjects_temp используются для замены (UPDATE) значений в существующих записях и добавления (INSERT) вновь созданных записей в основную таблицу.

Подробный текст этих операторов можно найти в разделе «Загрузка обновлений адресообразующих элементов ФИАС в таблицу fias_AddressObjects».

Поскольку в процессе обновления могут возникнуть нарушения целостности, можно загружать записи, в которых следующая (NEXTID) или предыдущая (PREVID) ссылка на запись истории указывает на несуществующую запись.

Такая ситуация весьма вероятна.

Вот, например, данные по результатам загрузки полной базы данных по состоянию на 10 октября 2016 года.

Всего нарушений:

  • в значениях NEXTID
  • в ПРЕДЫДУЩИХ значениях
Поэтому перед обновлением основной таблицы необходимо отключить ограничения:
  
   

ALTER TABLE IF EXISTS fias_AddressObjects DROP CONSTRAINT IF EXISTS fk_fias_AddressObjects_AddressObjects_PREVID; ALTER TABLE IF EXISTS fias_AddressObjects DROP CONSTRAINT IF EXISTS fk_fias_AddressObjects_AddressObjects_NEXTID.

После завершения обновления основной таблицы необходимо присвоить значения NULL полям NEXTID или PREVID, где их значения указывают на несуществующую запись.

Например, вот так:

UPDATE fias_AddressObjects ao SET NEXTID=NULL WHERE ao.NEXTID IS NOT NULL AND NOT EXISTS(SELECT * FROM fias_AddressObjects nao WHERE nao.AOID=ao.NEXTID); UPDATE fias_AddressObjects ao SET PREVID=NULL

Теги: #fias #postgresql #хранимая процедура #postgresql

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.