Jaki jest uniwersalny sposób przechowywania adresu / lokalizacji geograficznej w bazie danych? [Zamknięte]

25

Jaki jest prawidłowy format adresu / lokalizacji geograficznej, który pasuje do każdego adresu na Ziemi? W tej chwili mam:

  • kraj
  • Miasto
  • ulica
  • numer
  • dane tekstowe (dla uproszczenia)
  • zamek błyskawiczny
  • lat / lng

Ale wierzę, że mogę to poprawić: może istnieć stan / region kraju lub coś w rodzaju obszaru. Lub żaden obszar / region / stan, powiedzmy, w Singapurze lub Hongkongu.

Może nie być ulicy, ale droga, bulwar lub coś innego. Pewna liczba budynków może być złożona. Może być podłoga. Numer pokoju Itp....

Xwaro
źródło
11
Musisz wyjaśnić, dla jakiej aplikacji i kto podaje ten adres. Np. W większości internetowych sklepów / witryn internetowych nie wpisuję żadnej „szerokości / długości geograficznej”, która wręcz przeciwnie jest niezbędna dla ICBM (lub GPS). Również wysokość (oraz czas i data) jest ważna w niektórych przypadkach (pomyśl o statku na morzu lub o podróżniku na Everest). Nie jestem więc pewien, czy istnieje jakaś uniwersalna odpowiedź.
Basile Starynkevitch,
61
Warto przeczytać: mjt.me.uk/posts/falsehoods-programmers-believe-about-addresses
High Performance Mark
6
@BasileStarynkevitch: Myślę, że nie jest to tak ważne „dla jakiej aplikacji”, ale „dla jakich przypadków użycia”. Jeśli na przykład przypadek użycia ma zapewnić, że światowe usługi pocztowe mogą dostarczać pocztę, myślę, że na to pytanie można odpowiedzieć w rozsądny sposób. Jednak w tym przypadku użycia „lat / lng” nie będzie wymagane.
Doc Brown
34
Myślę, że uniwersalnym formatem adresu jest pojedynczy ciąg.
Erik Eidt,
12
Problem, który poruszasz, jest tak bolesny, że niektóre firmy opracowują uniwersalny sposób rozwiązania tego problemu, na przykład: what3words.com (sprowadza się do mapowania współrzędnych lokalizacji na trzy słowa). Twierdzą, że „Dzięki what3words każdy i wszędzie ma teraz adres”.
Roman Susi

Odpowiedzi:

51

Google opracował bibliotekę, która pomaga sprawdzać adresy pocztowe dla każdego kraju na świecie, których można użyć do zaprojektowania schematu do przechowywania tych danych.

Aby rozpocząć, poszukaj najczęściej wymaganych pól we wszystkich adresach od docelowej bazy klientów, a gdy identyfikujesz kolejne kraje o różnych wymaganiach, możesz nadal dostosowywać swój schemat.

Mitchdav
źródło
5
+1 za badanie istniejących rozwiązań. AddressKlasa z Android SDK może być kolejnym dobrym miejscem, aby rozpocząć.
Kevin Krumwiede
4
Szybki skan biblioteki Google pokazuje, że opiera się ona na oasis-open.org/committees/ciq/download.shtml
grahamj42 24.09.17
@ grahamj42, lol, ta strona jest taka zepsuta.
Nakilon
41

Uniwersalny sposób przechowywania adresu / lokalizacji geograficznej w bazie danych jest następujący:

[Address] nvarchar(max) not null

Wymaga to najmniejszej ilości kodu programowania (a więc obniża koszty utrzymania) i jest w pełni kompatybilny z dowolnym adresem. Ma jednak trzy duże problemy:

  • Brak walidacji danych oznacza, że ​​pole może być wykorzystane do celów innych niż zapisanie adresu. Jednym z celów jest atak DOS, którego celem jest wypełnienie przestrzeni bazy danych poprzez wprowadzenie 2 GB danych w polu adresu.

  • Przechowywane w ten sposób dane uniemożliwiają ich przetwarzanie do celów analizy biznesowej i eksploracji danych. Na przykład ilu użytkowników pochodzi z Indii? Nie ma łatwego sposobu na określenie, ponieważ adresy te nie zostaną znormalizowane.

  • Użytkownicy mogą omyłkowo wprowadzić niepełny lub po prostu zły adres.

Aby złagodzić pierwszy problem, ogranicz pole do tego, co uważasz za rozsądny limit. Osobiście zaczynałbym od 1000 znaków, a następnie zmniejszałbym go na podstawie długości adresów wprowadzonych przez pierwszych użytkowników, gdy tylko dostaniesz wystarczająco duży zestaw danych.

Aby złagodzić pozostałe dwa problemy, możesz użyć interfejsu API innej firmy, który analizuje adresy i przedstawia dane zawierające kraj, miasto, kod pocztowy itp. Jeśli to możliwe, interfejs API powinien być w stanie wyświetlać adres na mapa z powrotem do użytkownika, aby zmniejszyć ryzyko wprowadzenia niekompletnego lub niewłaściwego adresu: większość użytkowników wie, gdzie mieszkają, a zobaczenie innej pozycji na mapie dałoby od razu wskazówkę, że powinni sprawdzić swój wkład.

Pamiętaj, że bez względu na to, jakiego interfejsu API używasz, nie będzie on idealny. Znajduje większość adresów, ale nie wszystkie. Oznacza to, że jeśli interfejs API mówi, że adres nie istnieje, ale użytkownik nalega, aby tak było, a priori należy mu ufać, nawet jeśli może się mylić.

Oznacza to również, że nadal powinieneś przechowywać dane oryginalnego użytkownika, obok wyników API. Oznacza to, że schemat staje się:

[RawAddress] nvarchar(max) not null
[ParsedAddress] xml null
Arseni Mourzenko
źródło
Uwaga: jeśli to konieczne, możesz przynajmniej przechowywać kraj osobno. Na przykład można to wywnioskować automatycznie z pola adresu, z opcją zmiany tego przez użytkownika.
Matthieu M.,
„użyj interfejsu API” oznacza po prostu, że ktoś ma oficjalne formaty wszystkich krajów. Nie ma powodu, dla którego nie możesz tego zrobić sam
Ewan
@Ewan Brak powodów oprócz czasu, pieniędzy, języka i innych barier.
Andrew mówi Przywróć Monikę
jasne, ale czy udzielamy odpowiedzi na temat robienia rzeczy lub porównywania cen innych osób, które robią coś dla Ciebie?
Ewan
@Ewan: pytanie dotyczy formatu przechowywania adresów. Interfejs API nie dyktuje tego formatu: celem mojej odpowiedzi jest pokazanie, że jak tylko masz zwykłe pole tekstowe i pole XML / JSON / cokolwiek dla analizowanych danych, możesz zarówno przechowywać, jak i przetwarzać statystycznie adres z dowolnego miejsca na świecie.
Arseni Mourzenko
37

Nie ma jednego

Każdy kraj ma inny format adresu. Jeśli masz szczęście, a one w ogóle mają format!

Oczywiście szerokość / długość geograficzna da ci punkt na kuli ziemskiej, ale nie jest tak naprawdę przydatna do identyfikacji poszczególnych domów. Rozważmy na przykład wieżowiec.

Najlepiej jest sprawdzić oficjalny format usługi pocztowej w każdym kraju. Może to być świetne dla bazy danych zaplecza. Ale prawdopodobnie będziesz musiał go uprościć dla użytkowników końcowych, ponieważ będzie on zawierał o wiele więcej pól niż większość ludzi jest przyzwyczajona.

Na przykład w Wielkiej Brytanii znajdują się takie rzeczy, jak „podwójnie zależna lokalizacja”, ale nikt nie wiedziałby, co to znaczy, jeśli je zapytasz.

Ewan
źródło
3
Jaki jest uniwersalny sposób ...........
Xwaro,
40
@Xwaro Powiedzieli właśnie: Nie ma jednego.
Zymus
6
Myślę, że Xwaro oznacza, że ​​przyjmuję adresy na ziemi.
Ewan
3
To oficjalnym źródłem dla formatów drukowanych adres: Związek Pocztowy
grahamj42
3
ciekawy. Myślę, że jest to jednak odpowiednia strona: upu.int/en/activities/addressing/s42-standard/ ... możesz zobaczyć, jak A: to tylko kilka krajów, a B: odwzorowanie z s42 na format adresów krajów nie jest 1 do 1
Ewan
21

Jedynym uniwersalnym formatem jest posiadanie pojedynczego pola tekstowego, które może zawierać wiele wierszy tekstu. Umożliwi to każdy możliwy adres na ziemi.

JacquesB
źródło
2
Świetnie, teraz każdy może opisać ten sam adres w inny, niezgodny sposób. Przypuszczam, że pytanie nie dotyczyło standardów, więc jest to technicznie poprawna odpowiedź.
Michael
@Michael: Adresy różne i niekompatybilne na całym świecie. Nie ma żadnego standardowego szablonu. Posiadanie pola z wieloma wierszami pozwala użytkownikowi faktycznie wpisać poprawny adres.
JacquesB
@ Michael Oddzielne pola często zmuszają mnie do skracania / skracania jednego lub drugiego pola, co również prowadzi do niespójnych reprezentacji. (Nadal działa zwykle, usługi pocztowe są w tym dość doświadczone).
Hulk,
Po prostu ciekawy smakołyk, to technicznie nieprawda. W niektórych obszarach krajów części adresów są rysowane jako obrazy.
KayakinKoder
9

Pracuję nad oprogramowaniem dla wielu krajów. Rozwiązujemy ten problem, zaczynając od większego podmiotu, tzn. Kraj ma pola do najmniejszej wspólnej lub najmniejszej. Działa dobrze we wszystkich krajach, z którymi do tej pory eksperymentowaliśmy. Mamy również inteligentny system zapobiegania duplikatom i łączenie się z tymi, którzy w jakiś sposób dostali się do systemu, ponieważ użytkownicy są bardzo „kreatywni”. W sekcji administracyjnej mamy ustawienie pola adresu w zależności od kraju. tj. Japonia ma najpierw kod pocztowy / pocztowy, a jako ostatni - UK / US.

Ogólnie używamy:

  • Kraj
  • Kod pocztowy
  • Stan / Prowincja / Prefektura / Hrabstwo
  • Miasto / miejscowość / wieś
  • Ulica / droga / blok
  • Nazwa / numer budynku
  • Informacje szczegółowe / niestandardowe

Po wprowadzeniu i zapisaniu może zostać wyświetlona wersja sprzężona, z pominięciem pól niepotrzebnych.

Jak powiedziałem, działa to we wszystkich krajach, w których mamy oprogramowanie, i jest wynikiem rozwoju od 1989 roku.

Mam nadzieję, że to jakoś pomaga lub przynajmniej zapewnia inny wgląd.

Billsensei
źródło
jak nazwać kolumnę w db dla „State / Province / Prefecture / County”?
Xwaro,
6
@Xwaro To nie ma znaczenia, nazwij to słowo, które Twoim zdaniem programiści będą najmniej zdezorientowani. Wynika to z faktu, że nazwa jest wewnętrzna dla twojego oprogramowania i nigdy nie będzie widoczna dla użytkowników. Adres nigdy nie jest wyświetlany z nazwą pola. To znaczy, nigdy nie widzisz No 10 Street Downing Street, City Westminster, State London, Country UK. Zamiast tego zobaczysz10 Downing Street, Westminster, London, UK
slebetman
@slebetman Pytanie brzmiało: jak nazwać kolumnę w db dla „State / Province / Prefecture / County”? Nie „jak polecasz mi nazwać kolumnę w mojej bazie danych„ Stan / Prowincja / Prefektura / Hrabstwo ”?
Dari,
@Dari To nie ma znaczenia, nazywam to słowo, które według mnie jest najmniej skomplikowane dla moich programistów. Wynika to z faktu, że nazwa jest wewnętrzna dla mojego oprogramowania i nigdy nie będzie widoczna dla użytkowników. To zależy od tego, do czego mój zespół jest przyzwyczajony.
slebetman
@slebetman - jak się nazywasz?
Dari
0

Jak już wspomniano, najbardziej uniwersalnym (ale niepraktycznym do sprawdzenia i być może najmniej użytecznym) jest pojedyncze duże pole Unicode.

Możesz oddzielić kraj od reszty adresu i zapisać go jako kod kraju ISO. Normalizowałoby to kraj i oferowało pewną użyteczność w sprawdzaniu reszty adresu.

Możesz także oddzielić kod pocztowy, czyli kod pocztowy, od reszty adresu. Byłoby to również przydatne w sprawdzaniu poprawności pozostałej części adresu i mogłoby być pomocne (choć nieprecyzyjne) w geolokalizacji. Na przykład: w Kanadzie możesz jednoznacznie zidentyfikować dowolny adres, podając tylko kod pocztowy i numer ulicy (inaczej numer domu); może nie być to prawdą we wszystkich krajach.

Dedykowanie pól stanom / prowincjom lub miastom staje się coraz bardziej problematyczne z powodu różnic w sposobie formułowania adresu przez każdy kraj. Skonfigurowałem tabele adresowe zawierające takie pola, ponieważ początkowa grupa odbiorców skupia się na Ameryce Północnej, wiedząc, że publiczność międzynarodowa stanowiłaby problem z dopasowaniem się. W większości przypadków mogą być „rogaci w buty”, ale jest to niewygodny i potencjalnie podatny na kompromisy - zdecydowanie nie uniwersalny.

Zenilogix
źródło
0

W przeciwieństwie do odpowiedzi Mitchdava odradzam korzystanie z biblioteki Google. Przeszukałem repozytorium w poszukiwaniu różnych miejsc międzynarodowych z niekonwencjonalnymi schematami adresowania, mając nadzieję na znalezienie danych z testu jednostkowego, ale niepokojąco znalazłem zero trafień w całym repozytorium.

Myślę, że najlepszym rozwiązaniem jest traktowanie adresu jako tekstu wielowierszowego o dowolnym kształcie. Boli mnie to, że może nie można zweryfikować wszystkich adresów, ale niektóre formaty adresowania są naprawdę dziwne i być może nieprzewidziane, a na końcu odpowiedzialność za wypełnienie prawidłowego adresu spoczywa na użytkowniku, aw większości aplikacji użytkownik ponosi wszelkie negatywne konsekwencje wypełnienia formularza błędny adres.

Być może możesz użyć walidatora, aby uzyskać ostrzeżenie , ale nic więcej. Ale nie odrzucaj adresów, które nie sprawdzają poprawności, ponieważ w przeciwnym razie możesz stracić niektórych klientów. Co prowadzi do pytania, w jaki sposób przekazać ostrzeżenie użytkownikowi w taki sposób, aby poinformował, że jeśli użytkownik mieszka w obszarze o dziwnym formacie adresu, można bezpiecznie zignorować ostrzeżenie ...

Anonimowy
źródło
-1

Jak mówisz, każdy adres na Ziemi jest tylko długi lub ...

https://what3words.com

To, co 3 słowa, to algorytm (więc nie baza danych, więc można go osadzić w czymkolwiek), który może zdefiniować łatę 3x3 metrów w dowolnym miejscu na Ziemi.

Tonga i kilka innych stanów przyjęło go jako swój system kodów pocztowych, chociaż nie zastąpi go jako nakładka, jest dość fajny, bardzo dobrze zbudowany i przemyślany.

RemarkLima
źródło