Моделирование географических местоположений в реляционной базе данных

StackOverflow https://stackoverflow.com/questions/50252

  •  09-06-2019
  •  | 
  •  

Вопрос

Я разрабатываю систему управления контактами и столкнулся с интересной проблемой, касающейся последовательного моделирования географических местоположений.Я хотел бы иметь возможность записывать местоположения, связанные с конкретным человеком (почтовые адреса для работы, школы, дома и т.д.). Моя мысль состоит в том, чтобы создать таблицу локалей, такую как следующая:

Локали (ID, LocationName, ParentID) где автономные местоположения (такие как страны, напр.США) сами являются родителями.Таким образом, я могу иметь произвольно глубокую вложенность "политических единиц" (СТРАНА> ШТАТ > ГОРОД или COUNTRY > STATE > CITY > UNIVERSITY).Некоторые запросы обязательно будут включать рекурсию.

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

Это было полезно?

Решение

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

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

Другие советы

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

Я думаю, вы, возможно, слишком много об этом думаете.Есть причина, по которой большинство систем просто хранят адреса и, возможно, таблицу стран.Вот несколько вещей, на которые следует обратить внимание:

  1. Будет ли адрес в Бронксе включать район в качестве уровня иерархии?Устранит ли адрес в некорпоративном районе "городской" уровень иерархии?Как вы сравниваете адрес внутри университета с адресом, которого в нем нет?В итоге вы получите неровную иерархию, которая заставит вас проходить по дереву каждый раз, когда вам нужно будет отобразить адрес в вашем приложении.Если у вас есть страница "адресной книги", снижение производительности может быть значительным.

  2. Я не уверен, что у вас вообще есть только одна иерархия.Университет Брауна располагает филиалами в Провиденсе, штат РИ, и Бристоле, штат РИ.Единственным чистым решением было бы создать двойную иерархию с двумя кампусами, каждый из которых принадлежит своему соответствующему городу в одной иерархии, но оба принадлежат Университету Брауна в другой иерархии.(Университет принципиально не похож на политический регион.На самом деле вам не стоит их смешивать.)

  3. А как насчет почтовых индексов?Некоторые почтовые индексы охватывают несколько городов, в других случаях город разбит на несколько почтовых индексов.И (редко) некоторые почтовые индексы даже пересекают границы штатов.(По крайней мере, согласно Википедии...)

  4. Как вы будете вводить эти данные?Создание базы данных путем синтаксического анализа адресов в обычном формате может быть затруднено, если вы принимаете во внимание рекламные адреса, альтернативные названия определенных улиц, различные международные форматы и т.д.И я думаю, что иерархический ввод каждого адреса был бы подобен ЛАВАШУ.

  5. Похоже, вы пытаетесь смоделировать весь мир в своем приложении.Вы действительно хотите или нуждаетесь в ведении таблицы, которая могла бы содержать все города, штаты, провинции, почтовый индекс и страну в мире?(Или, по крайней мере, все, где вы кого-то знаете?) Единственное, что я могу предложить вам по этой схеме, - это близость, но если это то, что вы хотите, я бы просто сохранил штат и страну отдельно (и, возможно, почтовый индекс) и добавил данные о широте и долготе из Google.

Извините за крайний пессимизм, но я сам пошел по этому пути.Это логически красиво и элегантно, но на практике работает не так хорошо.

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

Расположение (LocationID, LocationName) -- Базовый строительный блок

LocationGroup (LocationGroupID, LocationGroupName, ParentLocationGroupID) -- Это может эффективно инкапсулировать несколько иерархий.У вас есть один корневой узел, и затем вы можете создать несколько независимых ветвей.Например.вы можете сначала разделить по состояниям, а затем создать несколько иерархий, напримерПочтовый индекс/город/xxxx

LocationGroupLocation (LocationID, LocationGroupID) -- Вот как связать местоположение с одной или несколькими иерархиями.Например.вы можете привязать свой дом к почтовому индексу, а также к городу...Что вам нужно реализовать, так это ограничение, согласно которому вы не должны иметь возможности связать местоположение с любыми двумя иерархиями, где одна из них является родительской для другой (поскольку связь уже неявна).

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

Помните о Принцип ПОЦЕЛУЯ (Будь проще, Глупый).

Я согласен с другими постами в том, что вам нужно быть очень осторожными в своих требованиях.Местоположение может стать сложной проблемой, и именно поэтому ГИС-системы настолько сложны.

Если вы уверены, что вам просто нужна базовая иерархическая структура, у меня есть следующие предложения:

  • Я поддерживаю предыдущий комментарий о том, что элементы корневого уровня не должны иметь самих себя в качестве родительских.Элементы корневого уровня должны иметь нулевое значение для родительского элемента.Всегда будьте осторожны при вводе данных в поле, которое не имеет значения (т. е."специальное" значение для представления данных).Эта практика редко бывает обязательной и способ чрезмерно используется в сообществе разработчиков.
  • Рассмотрим XPath / XML.Это то, что следует учитывать при записи структуры иерархии, а также при обработке / синтаксическом анализе данных при извлечении.Если вы используете MSSQL Server, выражения XPath в операторах select идеально подходят для таких задач, как возврат полного пути к местоположению / иерархии записи, поскольку код прост, а результаты получаются быстро.

Для географических местоположений вы можете преобразовать адрес в массив широты, долготы (возможно, используя Google Maps и т.д.) Для расчета близости и т.д..Для геополитического закрепления ...Я бы предпочел ответный ПОЦЕЛУЙ.

Если вы действительно хотите смоделировать это, возможно, вам нужно, чтобы типы были более универсальными ...Страна -> Штат -> Округ -> Район -> Населенный пункт -> Город -> Пригород -> Улица или почтовый ящик -> Номер -> -> Квартира и т.д.-> Учреждение (Университет или работодатель) -> Подразделение -> Subdivision-1 -> подразделение-n ...Ты уверена, что не умеешь ЦЕЛОВАТЬСЯ?

Я моделирую приложения для глобальных пользователей, и у меня те же проблемы, но я думаю, что этот подход уже мог бы использоваться на многих предприятиях.Но почему у этой проблемы нет универсального решения?Или у этой проблемы есть одно лучшее решение, которое может стать отправной точкой, или кому-нибудь в мире нужно подумать над решением этой проблемы с самого начала?К сожалению, в IT мы делаем одно и то же в любое время и во многих местах.Например, вы не создали базу данных более чем одного пользователя, клиента или продукта?И самое худшее, что все предприятия в мире добились этого.Я думаю, что это могло бы дать универсальные решения для универсальных проблем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top