Yuego / django-fias

Other
112 stars 70 forks source link

Фильтрация и сортировки по адресу #4

Open stelzzz opened 11 years ago

stelzzz commented 11 years ago

Сохранить адрес возможность есть, а как обстоят дела с фильтрацией и сортировкой по адресному полю? То есть можно ли например найти в тестовой CachedAddress все записи с городом N и тому подобное?

Yuego commented 11 years ago

С фильтрацией всё обстоит сложнее. В поле address сохраняется ссылка на конкретный объект в таблице AddrObj. А это есть одна сущность - улица, город, район и т. п.

Все сущности хранятся в виде дерева, представленного как Adjacency List. Так что с поиском всё довольно сложно.

В двух других полях содержится текстовое представление адреса - чтобы не дёргать каждый раз таблицу AddrObj, когда нужно вывести адрес, т. к. там получается 3-4 запроса каждый раз.

Т. е., чтобы найти всё, что есть в каком-то городе, надо собрать идентификаторы всех подчинённых городу объектов и затем уже фильтровать по этому списку. Но, ИМХО, это как гланды через задний проход удалять...

Можно денормализовать модель и хранить ссылки на все уровни иерархии в ней. Или только на нужные. К примеру добавить дополнительно поле со ссылкой на город (кстати в своём проекте я так и поступил).

Это что касается фильтрации.

Сортировать же можно как раз по полю full_address/short_address, нужно только добавить ему индекс. Тут, правда, тоже есть НО - нельзя по понятным причинам отсортировать, например, по улице внутри города.

Есть предложения?

Yuego commented 11 years ago

Вообще, думаю, можно что-то почерпнуть вот из этого проекта: https://github.com/garakh/kladrapi

Правда, они, зачем-то на КЛАДР завязались, но, какие-то их идеи вполне можно будет перенять.

stelzzz commented 11 years ago

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

Yuego commented 11 years ago

И такая мысль проскакивала.

Попадалась мне на глаза одна система - пришлось сильно поковыряться в её БД. Там вот как адреса хранились:

Есть справочник адресных объектов. Там был КЛАДР, тут ФИАС. А есть еще справочник адресов - довольно большая таблица с кучей полей. По полю на каждый уровень иерархии: Индекс, Регион, Область, Нас. пункт, Район, Улица, Дом, Корпус, Квартира и т. п.

При добавлении объекта заполняется этот справочник данными из КЛАДР(ФИАС), а на него ссылается уже модель.

Можно из него ссылаться на самый нижний уровень иерархии. Тогда при необходимости всегда можно восстановить всю иерархию.

И с домами проблема снимается тогда - Модели нужно ссылаться на единственную таблицу, где хранится вся информация об его адресе включая номер дома, и т. п.

Разумно, в общем. Полагаю, именно в эту сторону и стоит дальше думать.

Yuego commented 11 years ago

Я вот всё думаю, а нужна ли отдельная таблица? Может, стоит просто добавить все поля непосредственно в модель?

stelzzz commented 11 years ago

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

stelzzz commented 11 years ago

Еще один момент - помимо ФИАС есть еще аналогичные справочники для других стран. Класификатор объектов административно-териториального устроя Украины (КОАТУУ), к примеру. (Еще всякое-всякое http://www.dvbi.ru/en-us/references ) Лучше не привязываться только к ФИАС и иметь возможность работать со справочником, где адреса не только из России.

Yuego commented 11 years ago

Кстати, я не смог этот самый КОАТУУ найти хотя бы в каком-нибудь вменяемом формате. Только вроде в xls и то версия древнее динозавров. А он мне нужен.

А не привязываться просто так не выйдет - есть тому множество причин. Если пытаться сделать что-то универсальное - это сильно утяжелит приложение. Я думаю, лучше отдельное приложение сделать под конкретный тип справочника. Какие-то функции можно попробвать вынести в отдельное reusable app, но не более того.

stelzzz commented 11 years ago

Официальная версия КОАТУУ на сайте Національні (державні) статистичні класифікації (класифікатори) http://www.ukrstat.gov.ua/work/klass200n.htm http://www.ukrstat.gov.ua/klasf/klasif/koatuu.rar Формат xls только.

Yuego commented 11 years ago

Да, он самый. Ну хоть правят его, судя по всему. Дата файла 2013.04.16 - не так уж и давно. Но вот парсить xls... В принципе можно его в CSV выгрузить и уже с ним работать.

Но беда в том, что содержимое этого файла никак не вяжется этим приложением. Всю логику нужно реализовывать иначе.

Хотя, если очень постараться, можно распарсить этот файлик и запихать в БД формата ФИАС. По крайней мере, возможно, мне придётся так сделать в ближайшем будущем :)

Надо только описание формата на русский перевести...