Я устанавливаю приложение с учетом местоположения, как упоминалось здесь . С тех пор я узнал намного больше о приложениях ГИС и решил изменить несколько вещей в настройке, которую я первоначально предложил - теперь я собираюсь использовать базу данных postgresql с использованием расширения postgis для учета геометрических полей и использовать TIGER / Линия данных для ее заполнения. Данные TIGER / Line, кажется, предлагают разные наборы данных в разных разрешениях (слоях) - есть данные для состояний, округов, почтовых индексов, блоков и т. Д. Мне нужен способ связать сообщение с адресом, используя максимально возможное разрешение зерна .
Например, если возможно, я бы хотел связать пост с определенной улицей (наилучшее разрешение). Если не улица, то конкретный почтовый индекс (менее конкретный). Если не почтовый индекс, то конкретный округ (менее конкретный) и так далее. Sidenote: Я хочу в конечном итоге показать все это на карте.
Вот что я предлагаю:
Местонахождение
id -- int
street_name -- varchar -- NULL
postal_code_id -- int -- NULL
county_id -- int -- NULL
state_id -- int
Почтовые индексы
id -- int
code -- varchar
geom -- geometry
графства
id -- int
name -- varchar
geom -- geometry
Таблица состояний похожа, и так далее ...
Как вы можете видеть, таблица местоположений будет определять уровень специфичности в зависимости от того, какие поля установлены. Почтовые индексы, графства и таблица состояний не связаны друг с другом внешним ключом (слишком сложным, чтобы определить правильную иерархию, которая действует везде), однако я считаю, что существует способ определить их взаимосвязь, используя поле геометрии (например, запросить, в каком состоянии содержится определенный почтовый индекс или какие почтовые индексы принадлежат определенному состоянию).
Я думаю, что это хорошая установка, потому что если база данных растет (скажем, я решаю включить данные для районов или блоков в базу данных), тогда я могу добавить еще одну таблицу для этих данных, а затем добавить еще один внешний ключ в таблицу местоположений. (например, block_id).
Кто-нибудь знает лучший способ сделать это?