Какой универсальный способ сохранить географический адрес / местоположение в базе данных? [закрыто]

25

Какой правильный формат географического адреса / местоположения подходит для любого адреса на Земле? На данный момент у меня есть:

  • страна
  • город
  • улица
  • количество
  • текстовые данные (для простоты)
  • застежка-молния
  • Lat / LNG

Но я верю, что могу это улучшить: это может быть штат / регион страны или что-то вроде области. Или нет области / региона / штата, скажем, в Сингапуре или Гонконге.

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

Xwaro
источник
11
Вам необходимо объяснить, для какого приложения и кто предоставляет этот адрес. Например, в большинстве коммерческих интернет-магазинов / веб-сайтов я не набираю «широту / долготу», что, наоборот, необходимо для МБР (или GPS). Кроме того, высота (и время и дата) важна в некоторых случаях (например, какое-то судно в море или какой-нибудь путешественник на Эвересте). Поэтому я не уверен, что есть универсальный ответ.
Старынкевич,
61
Стоит прочитать: mjt.me.uk/posts/falsehoods-programmers-believe-about-addresses
высокой производительности
6
@BasileStarynkevitch: я думаю, что это не так важно "для какого приложения", но "для каких вариантов использования". Если, например, вариант использования - убедиться, что почтовые службы по всему миру могут доставлять почту, я думаю, что на этот вопрос можно ответить разумным образом. Однако для этого варианта использования "lat / lng" не потребуется.
Док Браун
34
Я думаю, что универсальный формат для адреса - одна строка.
Эрик Эйдт
12
Проблема, которую вы поднимаете, настолько болезненна, что некоторые компании разрабатывают свой универсальный способ ее решения, например: what3words.com (сводится к отображению координат местоположения в три слова). Они утверждают, что «с помощью what3words у каждого и везде есть адрес».
Роман Суси

Ответы:

51

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

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

mitchdav
источник
5
+1 за изучение существующих решений. AddressКласс из Android SDK может быть еще одним хорошим местом для начала.
Кевин Крумвиде,
4
Быстрое сканирование библиотеки Google показывает, что она основана на oasis-open.org/committees/ciq/download.shtml
grahamj42
@ grahamj42, лол, эта страница так испорчена.
Накилон
41

Универсальный способ сохранить географический адрес / местоположение в базе данных:

[Address] nvarchar(max) not null

Это требует наименьшего количества программного кода (и, следовательно, сокращает расходы на обслуживание) и полностью совместимо с любым адресом. Однако у него есть три большие проблемы:

  • Отсутствие проверки данных означает, что это поле можно использовать не для хранения адреса, а для других целей. Одной из целей является атака DOS, предназначенная для заполнения пространства вашей базы данных путем ввода 2 ГБ данных в поле адреса.

  • Данные, хранящиеся таким образом, делают невозможным их обработку в целях бизнес-аналитики и анализа данных. Например, сколько пользователей из Индии? Нет простого способа узнать, так как эти адреса не будут нормализованы.

  • Пользователи могут по ошибке ввести неполный или явно неправильный адрес.

Чтобы смягчить первую проблему, ограничьте поле тем, что вы считаете разумным. Лично я начну с 1000 символов, а затем уменьшу ее в зависимости от длины адресов, введенных первыми пользователями, когда вы получите достаточно большой набор данных.

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

Обратите внимание, что какой бы API вы ни использовали, он не будет идеальным. Он найдет большинство адресов, но не все из них. Это означает, что если API сообщает, что адрес не существует, но пользователь настаивает на том, что он существует, вам следует априори доверять пользователю, даже если он ошибается.

Это также означает, что вы все равно должны хранить исходные данные пользователя, параллельно с результатами API. Это означает, что схема становится:

[RawAddress] nvarchar(max) not null
[ParsedAddress] xml null
Арсений Мурзенко
источник
Примечание. По крайней мере, вы можете хранить страну отдельно, если это необходимо. Например, он может быть автоматически выведен из поля адреса с возможностью изменения пользователем.
Матье М.
«использовать API» означает, что у кого-то еще есть официальные форматы всех стран. Theres нет причин, вы не можете сделать это самостоятельно
Ewan
@ Иван Нет причин, кроме времени, денег, языка и других препятствий.
Эндрю говорит восстановить Монику
конечно, но мы даем ответы о том, как делать вещи или сравнивать цены других людей, которые делают вещи для вас?
Эван
@Ewan: вопрос касается формата хранения адресов. API не диктует этот формат: цель моего ответа - показать, что как только у вас есть поле с открытым текстом и поле XML / JSON / что угодно для проанализированных данных, вы можете сохранять и статистически обрабатывать адрес из любой точки мира. в мире.
Арсений Мурзенко
37

Там нет ни одного.

Каждая страна имеет разные форматы адресов. Если вам повезет, и у них есть формат вообще!

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

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

Например, в Великобритании есть такие вещи, как «двойной зависимый населенный пункт», но никто не узнает, что это значит, если вы спросите их.

Ewan
источник
3
Какой универсальный способ ...........
Xwaro
40
@Xwaro Они просто сказали : нет ни одного.
Зимус
6
Я думаю, Xwaro означает, что я принимаю адреса на земле.
Эван
3
Это официальный источник для печатных форматов адресов: Всемирный почтовый союз
grahamj42
3
интересный. Я думаю, что это соответствующая страница, хотя: upu.int/en/activities/addressing/s42-standard/… вы можете видеть, как A: это всего несколько стран, а B: отображение из s42 в формат адреса стран не 1 к 1
Юэн
21

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

JacquesB
источник
2
Отлично, теперь каждый может описать один и тот же адрес другим, несовместимым способом. Я полагаю, что вопрос не задавался о стандартах, так что это технически правильный ответ.
Майкл
@Michael: Адреса имеют разные и несовместимые по всему миру. Там нет никакого стандартного шаблона. Наличие многострочного поля позволяет пользователю фактически написать правильный адрес.
JacquesB
@Michael Отдельные поля часто вынуждают меня обрезать / сокращать одно или другое поле, что также приводит к противоречивым представлениям. (Обычно все еще работает, почтовые службы достаточно опытны в этом).
Халк
Подтверждено: en.wikipedia.org/wiki/Address_(geography)
Eric.Void
Просто интересная новость, это технически неверно. В некоторых районах стран части адресов изображены в виде рисунков.
KayakinKoder
9

Я занимаюсь разработкой программных решений для использования во многих странах. Мы решаем эту проблему, сначала начав с более крупного объекта, т. Е. Затем у страны есть поля до наименее общего или наименьшего. Это хорошо работает для всех стран, с которыми мы экспериментировали до сих пор. У нас также есть интеллектуальная система предотвращения дублирования и объединение для тех, кто каким-то образом попал в систему, поскольку пользователи очень «креативны». В разделе администратора у нас есть порядок полей адреса для каждой страны. т. е. в Японии сначала указан почтовый индекс, а в конце - Великобритания / США.

В общем, мы используем:

  • Страна
  • Post / Zip-код
  • Штат / Провинция / / префектура округа
  • Город / Город / деревня
  • Улица / Дорога / Block
  • Название здания / Номер
  • Конкретная / Пользовательская информация

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

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

Надеюсь, что это поможет или, по крайней мере, даст другое понимание.

Billsensei
источник
как вы называете столбец в вашей БД для "Штат / Провинция / Префектура / Округ"?
Xwaro
6
@Xwaro Неважно, назовите это слово, каким, по вашему мнению, ваши разработчики будут меньше всего смущены. Это потому, что имя является внутренним для вашего программного обеспечения и никогда не будет видно пользователям. Адрес никогда не отображается с названием поля. То есть ты никогда не видишь No 10 Street Downing Street, City Westminster, State London, Country UK. Вместо этого вы увидите10 Downing Street, Westminster, London, UK
slebetman
@slebetman Вопрос заключался в следующем: как вы называете колонку в вашей БД для "Штат / Провинция / Префектура / Округ"? Не «как вы порекомендуете мне назвать колонку в моей БД для« Штат / Провинция / Префектура / Округ »?
Дари
@Dari Неважно, я называю это словом, которое, по моему мнению, меньше всего смущает моих разработчиков. Это потому, что это имя является внутренним для моего программного обеспечения и никогда не будет видно пользователям. Так что это зависит от того, к чему привыкла моя команда.
Slebetman
@ Slebetman - как вы это называете?
Дари
0

Как уже говорилось, наиболее универсальным (но непрактичным для проверки и, возможно, наименее полезным) является одно большое поле Юникода.

Вы можете отделить страну от остальной части адреса и сохранить ее как код страны ISO. Это нормализовало бы страну и предложило бы некоторую полезность в проверке оставшейся части адреса.

Вы также можете отделить почтовый индекс или почтовый индекс от остальной части адреса. Это также может быть полезно при проверке оставшейся части адреса и может быть полезным (хотя и неточным) в геолокации. Например: в Канаде вы можете однозначно идентифицировать любой адрес, указав только почтовый индекс и номер улицы (он же номер дома); это не может быть правдой во всех странах.

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

Zenilogix
источник
0

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

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

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

анонимное
источник
-1

Как вы говорите, любой адрес на земле есть только широта или ...

https://what3words.com

То, что 3 слова, - это алгоритм (поэтому он не является базой данных, поэтому может быть встроен во что угодно), который может определять участок размером 3х3 метра в любой точке Земли.

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

RemarkLima
источник