2009-05-30 13 views
102

Sono un programmatore e ad essere sincero non conosco le strutture di indirizzi stradali del mondo, solo come nel mio paese è strutturato :) quindi qual è il progetto di database migliore e comune per la memorizzazione degli indirizzi? Dovrebbe essere così semplice da usare, veloce da interrogare e dinamico per memorizzare tutti gli indirizzi stradali del mondo che si identifica solo con un id
Grazie milleEsiste una progettazione di database di indirizzi stradali comuni per tutti gli indirizzi del mondo?

+0

Vedere anche: http://stackoverflow.com/a/21023793/59087 –

+0

Hai chiesto informazioni sugli indirizzi stradali, ma tutte le risposte riguardano gli indirizzi postali ([qual è la differenza?] (Http://painintheenglish.com/ caso/3604)). Forse il titolo dovrebbe essere cambiato? – wrygiel

risposta

103

È possibile rappresentare indirizzi da un sacco di paesi diversi in un insieme standard di campi. L'idea di base di una via d'accesso denominata (arteria stradale) su cui si trovano gli edifici nominati o numerati è piuttosto standard, tranne che a volte in Cina. Altri concetti quasi universali includono: nominare l'insediamento (città/città/villaggio), che può essere generalmente indicato come località; nominando la regione e assegnando un codice postale alfanumerico. Tieni presente che i codici postali, noti anche come codici postali, sono puramente numerici solo in alcuni Paesi. Avrai bisogno di molti campi se vuoi davvero essere generico.

L'UPU Universal Postal Union fornisce dati di indirizzo per molti paesi in un standard format. Si noti che il formato UPU mantiene tutti gli indirizzi (fino alla precisione del campo disponibile) per un intero paese, quindi è relazionale. Se si memorizzano gli indirizzi dei clienti, dove verrà archiviata solo una piccola parte di tutti gli indirizzi possibili, è meglio usare una singola tabella (o un formato flat) contenente tutti i campi e un indirizzo per riga.

Un formato ragionevole per memorizzare indirizzi sarebbe la seguente:

  • Indirizzo Lines 1-4
  • Località
  • Regione
  • CAP (o codice postale)
  • Paese

Le righe di indirizzo 1-4 possono contenere componenti come:

  • costruzione
  • Sotto-Costruzione
  • numero
  • Premessa (numero civico)
  • Gamma Premessa
  • transitabile
  • Sotto transitabile
  • doppio Dependent Località
  • Località secondaria

Spesso vengono usate solo 3 linee di indirizzo, ma questo è spesso insufficiente. È ovviamente possibile richiedere più righe per rappresentare tutti gli indirizzi nel formato ufficiale, ma le virgole possono sempre essere utilizzate come separatori di riga, il che significa che le informazioni possono comunque essere acquisite.

In genere l'analisi dei dati viene eseguita da località, regione, codice postale e paese e questi elementi sono abbastanza facili da comprendere per l'utente durante l'immissione dei dati. Questo è il motivo per cui questi elementi dovrebbero essere memorizzati come campi separati. Tuttavia, non obbligare gli utenti a fornire codice postale o regione, non possono essere utilizzati localmente.

La località non è chiara, in particolare la distinzione tra località della mappa e località postale. La località postale è quella considerata da un'autorità postale che a volte può essere una grande città vicina. Tuttavia, il codice postale di solito risolverà eventuali problemi o discrepanze, per consentire la consegna corretta anche se la post-località ufficiale non viene utilizzata.

+1

Puoi fornire un URL per l'UPU? (Sì, so che potrei trovarlo - ma le migliori risposte non fare in modo che le persone effettuino la ricerca.) –

+0

Prova http://www.upu.int/post_code/en/postal_addressing_systems_member_countries.shtml e seleziona il paese appropriato nel menu a discesa – barrowc

+0

URL aggiunto per Post UPU * Codice prodotto –

39

Dai un'occhiata allo Database Answers. In particolare, questo riguarda molti casi:

(Tutti carattere tipo di dati di lunghezza variabile)

AddressId 
Line1 
Line2 
Line3 
City 
ZipOrPostcode 
StateProvinceCounty 
CountryId 
OtherAddressDetails 

enter image description here

+0

Non l'ho fatto a valle, ma penso che l'unico modo in cui questo potesse funzionare era se tutti i campi, ma AddressId e Line1 fossero facoltativi. In tal caso, non è troppo utile. –

+7

I tipi di dati sono importanti - non tutti i paesi hanno codici postali interi! Se un collega avesse trovato questo rapidamente con un cliente in Canada. – Eric

+0

@Eric: oltre ai campi Id tutti questi campi sono tipi di dati carattere –

1

No, assolutamente no. Se confronti il ​​modo in cui US e Japanese addresses funzionano, vedrai che non è possibile.

UPDATE:

A pensarci bene, qualsiasi cosa si può fare, ma c'è un trade-off.

Un approccio consiste nel modellare il problema con le tabelle indirizzo e indirizzo_attributo, con una relazione di 1: m tra di esse, qualsiasi cosa può essere modellata. La tabella address_attribute avrebbe un pk, un nome, un valore e un fk che punta al suo indirizzo pk del suo indirizzo. È quasi come usare una mappa con il nome, coppie di valori.

Il trade-off è dover fare un JOIN ogni volta che si desidera un indirizzo. Devi anche interrogare i nomi degli attributi di indirizzo per capire di cosa hai a che fare ogni volta.

Un altro approccio sarebbe quello di fare una ricerca più completa su come gli indirizzi sono modellati in tutto il mondo. In un mondo orientato agli oggetti si potrebbe avere la classe di indirizzo occidentale (street1/street2/city/state/zip) e altri per il Giappone, la Cina, quanti ne occorrono per affiancare lo spazio degli indirizzi. Quindi avresti una tabella indirizzi principale e tabelle figlio per gli altri tipi con una relazione 1: 1 tra di loro.

Come fa Amazon o eBay? Spediscono a livello internazionale. Hanno funzionalità di interfaccia utente specifiche della locale? Ho usato solo le impostazioni locali degli Stati Uniti.

+1

cosa succede se ho bisogno della maggior parte degli indirizzi? –

+0

Scusa, non ti seguo qui. – duffymo

2

Dipende da come si è preparati per andare con i campi. Ovviamente, un campo di indirizzi in formato libero farà sempre, ma sarà relativamente poco utile per restringere la geografia.

Il problema è che ci sono troppe variazioni nel livello della gerarchia geografica tra i paesi. Diamine, alcuni paesi non hanno nemmeno "indirizzi" ovunque.

Vi consiglio di non provare a renderlo troppo intelligente.

3

Diversamente da altre risposte qui, credo sia possibile avere un database di indirizzi strutturato.

Appena fuori dal cappello, mi viene in mente la seguente struttura:

  • Paese
  • Regione (Stato/Provincia)
  • Località (Città/Comune)
  • Località secondaria (Contea/altra suddivisione di una località)
  • Via

Ma come interrogarlo abbastanza velocemente?

Un modo in cui penso sempre che sia possibile ottenere è il codice di avviamento postale (o codice postale) che varia da paese a paese, ma è solido all'interno del paese.

In questo modo è possibile strutturare i dati in base alle informazioni fornite dagli uffici postali di tutto il mondo.

2

Len Silverston di Universal Data Model fama raccomanda una gerarchia separata di GEOGRAPHIC BOUNDARIES e seconda di quanto privi di formato-ness si è disposti ad accettare sia semplici STREET ADDRESS LINE s o derivati ​​per-paese.

+1

Il modello è pazzo complesso però ... –

+4

La realtà è anche un pazzo complesso ... –

+1

Vero, e le modelle che Silverston ha escogitato sono piuttosto buone e coprono molto terreno ma non penso che tale complessità sia applicata al web (a questo punto), specialmente dal punto di vista dell'utente finale Alla fine, l'usuabilità (quasi) vince sempre –

23

Chiediti quale è lo scopo principale di memorizzare questi dati? Intendi davvero inviare una mail alla persona all'indirizzo? Tieni traccia dei dati demografici, delle popolazioni? Essere in grado di chiedere ai chiamanti il ​​loro indirizzo corretto come parte di qualche autenticazione/verifica di base? Tutti i precedenti? Nessuno dei precedenti?

A seconda delle esigenze effettive, si determinerà a) non ha molta importanza, e si può optare per un approccio a testo libero, oppure b) campi strutturati/specifici per tutti i paesi, o c) specifici per paese architettura.

+0

Significa che sto cercando una buona soluzione a questo problema, ma ce ne sono molti diversi. Probabilmente è meglio scegliere tra i requisiti effettivi – displayname

9

Per gli indirizzi internazionali, è molto difficile trovare un modo per formattare le informazioni se sono suddivise in campi. Come per esempio, un indirizzo italiano utilizza:

<street address> 
<zip> <town> <region> 
<country> 

Come

Via Eroi della Repubblica 
89861 Tropea VV 
Italy 

Questo è piuttosto diverso dall'ordine di rivolge a noi - sulla seconda riga.

Vedere anche i SO domande:

Verificate anche tag 'postal-code'.


Edit: ordine di regione e città Reverse - per UPU

1

Il design deve essere fortemente dipendente dal proprio scopo. Alcune persone hanno pubblicato come strutturare i dati. Quindi, se vuoi semplicemente inviare un messaggio di posta elettronica a qualcuno, lo farà. Le cose cominciano a complicarsi se si desidera utilizzare questi dati per la navigazione. La navigazione in auto richiederà strutture aggiuntive per contenere informazioni sul traffico (ad es. Strade a senso unico), mentre la navigazione a piedi richiederà molti dati aggiuntivi. Ecco un piccolo esempio: nella mia città, il mio quartiere è vicino al parco. Accanto al parco si trova l'ex aeroporto (infatti, uno dei più antichi d'Europa) trasformato in museo dell'aviazione. Accanto al museo dell'aviazione è un parco commerciale. Il numero civico per il museo è 39, mentre i numeri del business park iniziano con 39A. Quindi può sembrare che 39 e 39A siano vicini - ma ci vuole circa un miglio per camminare dall'uno all'altro (e anche di più se si va in macchina).
Questo è solo un piccolo esempio tratto dalla mia città, penso che probabilmente si possano trovare molte eccezioni (specialmente nelle zone rurali o più selvagge di ogni paese).

8

A volte il più vicino possibile ottenere un indirizzo è la città.

Una volta ho avuto un progetto per mettere tutte le scuole secondarie in India in Google Maps. Ho scritto un programma spiffy usando l'API di Google e ho pensato che sarebbe stato abbastanza facile.

Quindi ho ricevuto i dati dal client. Alcuni indirizzi di scuola erano cose come "Dall'altra parte del mercato, vicino al barbiere" o "Vicino alla vecchia fermata dell'autobus".

Ha reso il mio compito molto più difficile poiché, sfortunatamente, l'API di Google non supporta quel formato.

5

Forse questo è utile: https://gist.github.com/259744 Per un progetto ho raccolto una tabella di informazioni su tutti i paesi del mondo, compresi i codici ISO, dominio di primo livello, telefono cellulare il codice, segno dell'automobile, la lunghezza e regex zip. Nomi e commenti di paesi purtroppo solo in tedesco ...

+0

Grazie @Hraban ottimo link –

2

No, non esiste uno schema di indirizzamento standard. Di solito varia da paese a paese. Anche l'unione postale ha dichiarato che il numero Adressing the world, an address for everyone non è presente. La soluzione migliore è utilizzare gli standard dei codici paese a 2/3 lettere noto come ISO 3166 e trattare tutto il resto in base agli standard nazionali.

Tuttavia, se sei davvero disperato di utilizzare strumenti facilmente accessibili per il tuo progetto, puoi provare Google Place API.

+0

Mi piace molto l'idea di vedere come l'API di Google Place gestisce le cose! –

Problemi correlati