Я построил что-то очень похожее и нашел два совершенно разных способа, которые оба работали хорошо.
Способ 1: Страна »Подгород» Город »Окрестности
Первый способ, который сработал для меня, это сделать это с помощью Country, Subcountry, City, Neighborhood. Это хорошо сопоставляется с основными службами геокодирования и является достаточным для большинства простых применений. Это может быть STI (как в вашем примере) или с несколькими таблицами (как я это сделал).
В вашем примере вы написали "Подразделение / Штат". Мои два цента - избегать использования этих терминов и использовать вместо этого «Subcountry», потому что это стандарт ISO, и вы избавите себя от некоторой путаницы, когда другой разработчик считает, что подразделение является крошечным соседством с домами, или когда у вас неамериканская страна который не использует штаты, а использует провинции.
Это то, на чем я остановился после многих экспериментов с попытками использовать названия моделей, таких как Регион, Район, Область, Зона и т. Д., И оставил их как слишком расплывчатые или слишком конкретные. В вашем случае ИППП может быть хорошо использовать больше имен.
Одним сюрпризом является то, что это большая помощь в написании ассоциаций, которые имеют многоуровневый характер, например, например, country.cities (пропуская субстрану). Это связано с тем, что иногда посреднической модели не существует (т. Е. Нет субстран). В вашей ИППП это может быть сложнее.
Кроме того, вы значительно ускоряетесь, если денормализуете свои таблицы, например, в моей таблице городов есть поле страны. Это делает обновление информации немного сложнее, но оно того стоит. Ваша ИППП может быть эквивалентна этому при использовании тегов.
Способ 2: зоны, представляющие собой списки фигур широты / ширины с ограничивающими прямоугольниками
Второй способ - использовать произвольную модель зоны и сохранять формы широты и долготы. Это дает вам огромную гибкость, и вы можете предварительно рассчитать, когда фигуры содержат другие фигуры, или пересекать их. Таким образом, ваше "углубление" становится "покажи мне фигуры прямо внутри этого".
В Postgres есть несколько хороших помощников для геокодирования, и вы можете ускорить поиск, выполнив ограничивающие рамки min / max lat / lng. Мы также сохранили данные, такие как ожидаемая центральная точка зоны (в которой мы будем указывать булавку на карте) и радиус (полезно для расчета запросов типа «показать мне все элементы х в пределах расстояния y).
При таком подходе мы смогли создать интересные зоны, такие как «Бродвей в Нью-Йорке», который на самом деле не столько соседство, сколько длинная улица, и «Бассейн Амазонки», который определяется рекой, а не страной.