Come dovrebbero indirizzi geografici internazionali essere memorizzati in un database relazionale?

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

  •  18-09-2019
  •  | 
  •  

Domanda

Dato il compito di memorizzare indirizzi geografiche internazionali in una tabella relazionale, ciò che è lo schema più flessibile? Nel caso in ogni parte dell'indirizzo essere scoppiata nelle loro campi, o dovrebbe essere più simile a testo libero?

C'è un senso di separazione indirizzo in modo diverso formattato in tabelle differenti? Per esempio, avere un tavolo per USAAddress, CanadianAddress, UKAddress ...?

È stato utile?

Soluzione

Vorrei riassumere il mio pensiero dal mio post sul blog - Una lezione in deposito indirizzo .

Il mio progetto in corso [Io lavoro per una società di logistica] stiamo memorizzare indirizzi internazionali. Ho fatto ricerche sugli indirizzi in tutto il mondo nella progettazione di questa porzione del database. C'è un sacco di formati diversi. Nel mondo occidentale si tende a utilizzare un formato abbastanza uniforme - alcune differenze, ma sono per lo più:

  • Via Numero - numerico
  • casa o edificio Nome - [VarChar - nel Regno Unito alcune case / edifici sono identificati per nome, non per numero]
  • Via Numero suffisso [VarChar, anche se nella maggior parte dei casi, Char (1) basterebbe]
    • A, B ecc
  • Via Nome [VarChar]
  • Via Tipo [VarChar o Int se si dispone di una tabella StreetTypes]
    • Finora, ho trovato 262 tipi unici al mondo di lingua inglese, ci sono probabilmente di più, e non dimenticare altre lingue cioè Strasse, Rue etc.
  • Via Direzione [VarChar (2)]
    • N, E, S, W, NE, SE, NW, SW
  • Tipo di indirizzo [VarChar o Int se si dispone di una tabella AddressTypes]
    • PO Box
    • Appartamento
    • Edificio
    • Piano
    • Ufficio
    • Suite
    • ecc ...
  • Indirizzo Identificazione Tipo [VarChar]
    • vale a dire. Numero Box, Appartamento, Piano Numero ricordare i numeri di appartamenti e uffici a volte hanno informazioni alfanumerica - come 1A
  • Comune Locale [VarChar o Int se si dispone di un tavolo Comuni]
    • Ad esempio, se il borgo / villaggio compare nell'indirizzo prima del paese.
  • Città / Paese [VarChar o Int se si dispone di una tabella Cities]
  • Distretto di amministrazione [VarChar o Int se si dispone di una tabella Distretti]
    • Stato (U.S..)
    • Provincia (Canada)
    • Distrito Federal (Messico)
    • County (U.K.)
    • ecc ...
  • Area postale [VarChar]
    • Zip (U.S..)
    • CAP (Canada, Messico)
    • CAP (U.K.)
  • Paese [VarChar o Int se si dispone di una tabella Paesi]

Questo sembra coprire la maggior parte dei paesi, ma l'ordinamento dei campi può essere visualizzato in modo diverso. È possibile trovare un elenco di formati di visualizzazione a http: //www.bitboost. com / ref / internazionali-indirizzo-formats.html # Formati

Per esempio, in molti paesi, il codice postale cade prima del nome della città e il numero civico cade dopo il nome della via. In Canada, Stati Uniti e il brevetto del Regno Unito il numero civico precede il nome della via e il codice postale (o ZIP) viene dopo il nome della città.

In risposta alla tua domanda circa la separazione degli indirizzi in diversi paesi, non vorrei suggerire che, sarà solo rendere la vita più difficile in altre aree - per la segnalazione di esempio. Il formato Ho fornito copre tutti gli indirizzi nel nostro database logistica che copre Stati Uniti d'America, Canada, Messico e Regno Unito senza alcun problema. Esso copre anche tutti i nostri indirizzi europei, cinesi, giapponesi e malesi. Non posso parlare per gli altri paesi, ma non ho ancora avuto per memorizzare un indirizzo da un paese che questi campi non sosterrà.

Io non suggerisco di andare con l'Address1, formato Indirizzo2, Indirizzo3 suggerito da altri e visto in molti database perché l'analisi le informazioni sugli indirizzi di una stringa alfanumerica non è così semplice come potrebbe sembrare a prima vista - soprattutto se isn di dati' t inserito correttamente, a causa di disinformazione, errore di battitura, errore d'ortografia ecc Se si separano i campi è possibile utilizzare distaalgoritmi SNO per verificare la presenza di significato probabile, utilizzare probabilità per verificare nome della via contro il numero di codice e la via postale o per controllare provincia e città contro nome della via, ecc Prova a fare niente di tutto questo quando hai una stringa che indica il tuo indirizzo intera strada. Non è una cosa da poco con uno sforzo d'immaginazione.

QA su un database di indirizzi è un mal di testa, punto. Il modo più semplice per semplificare la vita in questo settore è quello di assicurarsi che tutti i campi contengono solo un singolo pezzo di informazione che possono essere verificate automaticamente come corrette al momento dell'entrata. Probabilità, algoritmi distanza e regolari espressioni possono verificare la validità di entrata e fornire un feedback all'utente come a ciò che il loro errore è stato e suggerire correzioni adeguate.

Un avvertimento da tenere presente è strade con nomi che sono anche tipi di strada - se si sta coprendo il Canada è necessario essere a conoscenza di "Avenue Road" di Toronto che vi viaggio fino alla grande se si sta utilizzando il address1, 2, 3 formato. Questo probabilmente avviene in altri posti, anche se non sono a conoscenza di loro -?! Questo singolo caso era sufficiente per me per urlare WTF

Altri suggerimenti

Fare attenzione a non a un eccesso di analizzare i formati di indirizzo. Quando lo fai, sei molto probabile per finire con una specifica maggior parte degli utenti avranno bisogno di lavorare intorno , in modo efficace costringendoli a utilizzare i campi sbagliati, oppure solo compilando i campi primari e ignorando i campi aggiuntivi .

Mantenere le cose semplici.

Un StreetType come citato da BenAlabaster causerà problemi quando si inizia a lavorare con le lingue diverse da isolare lingue come inglese o spagnolo.

Per mostrare quanto male le cose possono ottenere in natura: il "Henriette Roland Holststraat" ad Amsterdam, costruito da "Henriette" + "Roland Holst" + "straat", che può essere abbreviato come "Roland Holststraat" , o "Roland Holststr.", o errato come "HRHolststr." o "Henriette Roland-Holst straat", seconda delle condizioni climatiche. A meno che non hai un registro di strada up-to-date per ogni paese del mondo, sarete andando da nessuna parte.

E, infine, fare attenzione che in alcuni paesi multilingue, i nomi possono essere diversi da una lingua all'altra! Per esempio a Bruxelles, dove molte strade hanno sia un francese e un nome olandese: "Avenu du Port" e "Havenlaan", seconda lingua preferita del destinatario. (Google Maps mostra entrambi i nomi alternativamente, solo per essere al sicuro.)

Si può cercare di elaborare tutti i tipi di trucchi intelligenti qui, ma sono i rappresentanti di vendita. andando a capire questo?

Dipende da cosa si vuole fare con esso.

Ho trovato sempre più facile da usare indirizzi per altri scopi (ad esempio la verifica con i dati di USPS o di ottenere tariffe di spedizione da UPS / FEDEX) se sono separati.

Ecco quello che di solito uso per gli indirizzi:

  • Indirizzo Linea 1
  • Indirizzo Linea 2
  • Indirizzo Linea 3
  • Città
  • Regione
  • Codice postale
  • County
  • Paese

in risposta alla modifica: Per la maggior parte delle situazioni non vedo l'uso. La tabella che ho elencato sopra ha abbastanza campi (ed è generico abbastanza) per gli indirizzi più del paese.

Indirizzo

Come polo opposto alla risposta eccellente @BenAlabaster ha fornito, si potrebbe semplicemente avere:

address       TEXT(300)
postal_code   VARCHAR(15)
country_code  VARCHAR(2)

I tuoi client-side layout modulo possono ancora essere così complesso come si vede in forma (o utilizzare un input multi-linea in cui l'utente può digitare manualmente il loro indirizzo). È quindi possibile aggiungere le interruzioni di riga l'indirizzo, se necessario.

Paese

La tabella paese apparirebbe come segue:

country_code  VARCHAR(2)
country_name  VARCHAR(255)

Inoltre, si potrebbe avere una di quanto segue:

postal_code_required  TINYINT(1)
postal_code_regex     VARCHAR(255) NULL DEFAULT NULL

Quindi utilizzare i seguenti elenchi per progettare la vostra tavola Paese:

Ecco un aneddoto per tutti coloro che si imbatte in questa domanda:

Io parlo come una persona che ha vissuto e lavorato su un sacco di continenti (Europa, Asia, America del Nord). Nella mia esperienza, e l'esperienza delle persone con cui lavoro, è stato molto più facile per noi da usare sistemi che fanno il seguente:

  1. Fornire tre linee in cui vi digitare un indirizzo. Passate queste tre linee sopra al vostro servizio postale locale come li ho tipo, parola per parola. Mi permetta di utilizzare qualsiasi set di caratteri che voglio; utilizzare UTF-8 o qualcosa di meglio.
  2. Se il sistema dispone di requisiti di business che hanno bisogno di me per specificare informazioni particolari (come il codice postale, prefettura, stato, ecc), per chiedere che separatamente. Con i requisiti di business, voglio dire le cose come analisi; questi bit di informazioni non devono essere condivisi con il vostro servizio postale locale (a meno che anche capitato di scrivere le stesse informazioni in una delle tre linee dal punto 1, sopra).
  3. Avere un menu a discesa che mi chiede di specificare la posizione categorica di indirizzo ho fornito nelle linee del punto 1 di cui sopra, forse Paese.
  4. Se è necessario analizzare le informazioni che fornisco nelle linee del punto 1, usare la mia risposta a punto 3 per selezionare regex. Run che regex contro le indicazioni al punto 1 di analizzarlo. Cercare di riempire gli elementi dell'interfaccia utente di punto 2 utilizzando l'uscita dal tuo regex. Se sono corretto che le informazioni autofilled - utilizzare il fatto che ho cambiato per migliorare la vostra regex. Allo stesso modo, per quanto possibile, mi danno l'opportunità di rivedere e correggere l'uscita del regex:. Nessuno sa meglio quello che avevo intenzione di comunicare di me

I sistemi costruiti in questo modo, trovo, rendono la mia vita più facile. In particolare, quando sto inviando la posta a un sistema postale su cui la vostra azienda non ha praticamente alcuna conoscenza interna funzionale.

Se la vostra azienda non ha conoscenze interne su particolari sistemi postali, usare la mia selezione nel punto 3 per informare che vista di visualizzare a me. Un sacco di gente sa ciò che il sistema postale degli Stati Uniti si aspetta che sulle confezioni; se seleziono Uniti nel punto 3, si sentono liberi di fare la vista sembrare appropriato per un indirizzo negli Stati Uniti. Se si seleziona un paese di cui la vostra azienda non sa nulla - visualizzare un generico tre righe e mi permetta di fare il resto; Non costringermi a usare ASCII.

E cerchiamo di essere reale qui - la costruzione di un database completo e enciclopedica di tutti i sistemi postali globali (pubblici e privati) è un compito erculeo nel migliore dei casi, se non impossibile. Ci sono, ad esempio, sistemi postali in cui solo locale, carrier dell'ultimo miglio sa davvero dove si trova un indirizzo. A volte essere in grado di passare le note a tale vettore sulla confezione è estremamente utile. E la mappatura della conoscenza locale di tutti i casi vettore bordo nel vostro database è davvero un compito impossibile.

Basta chiedere Gödel. (E poi chiedetevi se si sta tentando di utilizzare un sistema assiomatico per modellare un universo del discorso, più o meno una sorta di aritmetica come teoria degli insiemi o algebra relazionale.)

Commento di risposta di Ben Alabastro: Per formattare gli indirizzi in base al paese, è possibile utilizzare una tabella di formattazione che ha l'ordinamento delle colonne per ogni paese come righe separate.

  • ADDRESSFORMAT (CountryCode, NomeCampo, FieldOrder)

L'ordine campo può essere codificato da utilizzare layout griglia complesse anche.

Non v'è alcun punto nel separare gli indirizzi in base al paese. Questo sarà caotico come il numero dei paesi aumenta e si atterrerà nei guai se si desidera trovare tutti gli indirizzi di dire, un client internazionale. Avere un tipo di indirizzo suggerito da Ben potrebbe anche portare ad ambiguità quando si dispone di un indirizzo che ha sia un numero civico e un numero appartamento. Potrei essere in un complesso di appartamenti in cui ogni edificio ha un nome diverso. Questo è molto comune in India.

https://github.com/commerceguys/addressing biblioteca per formattare gli indirizzi internazionali e che utilizzare questi elementi:

Country
Administrative area
Locality (City)
Dependent Locality (in: BR, CN, IR, MY, MX, NZ, PH, KR, ZA, TH)
Postal code
Sorting code
Address line 1
Address line 2
Organization
Recipient

Questo aiuto doen't se si vuole analizzare la strada (nome, numero di casa, ...).

Btw. se siete alla ricerca di un elenco Paese multilingue: https://github.com/umpirsky/country-list

L'unico modo è quello di dividerli a:

Name varchar,
Title varchar,
StreetAddress varchar,
StreetAddressLine2 varchar,
zipCode varchar,
City varchar,
Province varchar,
Country lookup

dal momento che quasi tutti i paesi ha il proprio standard per avere i dati di indirizzo, e il paese Evey ha un formato diverso di zipcodes.
Si può avere un piccolo campione di problemi in il mio post da una domanda simile.

Questo non dovrebbe senso per separare gli indirizzi per tutti i paesi, dal momento che ci sono paesi in cui si hanno poche convenzioni di indirizzo. Alcune convenzioni popolari includono non avendo strade in piccoli villaggi, solo frazione e il numero, mentre le strade sono in indirizzi più grandi città. Ho imparato che nella capitale dell'Ungheria - Budapest, ci sono poche strade che hanno lo stesso nome (si distinta loro dal numero di distretto città), mentre le altre città non hanno tali indirizzi (qualcuno da Ungheria può effettivamente confermare se questo è vero). Così il numero totale dei formati di indirizzo sarà numer_of_countries moltiplicato per il numero di formati di indirizzo in questo paese ... Può essere fatto con le tabelle diverse, ma sarà il lavoro orribile da fare.

So che questo è estremamente un vecchio argomento che è già risposto, ma ho pensato che avrei gettare i miei due centesimi in pure. Tutto dipende da ciò che i vostri obiettivi del progetto e come ci si aspetta il tuo target di utenti di inserire gli indirizzi. Il suggerimento di Ben vi permetterà di analizzare gli indirizzi con precisione, ma d'altra parte potrebbe fare per un processo di immissione dei dati utente più lungo (e forse più frustrante). il suggerimento di Stephen Wrighton è più semplice, e potrebbe essere più facile per gli utenti di inserire gli indirizzi di conseguenza.

Ho visto anche alcuni modelli che semplicemente avevano una colonna "Indirizzo" che cattura un numero tipica strada, tipo, nome della strada, unità / numero di appartamento, ecc tutti in una sola colonna, mantenendo Città, Stato, Regione , ecc all'interno di altre colonne. Simile al modello di Stephen, tranne Address1, Indirizzo2 e Address3 tutto consolidati in una colonna.

La mia opinione è che i modelli più flessibili tendono ad essere quelli che sono meno restrittivo, a seconda della interpretazione flessibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top