2008-09-24 6 views
23

Esistono best practice (o anche standard) per archiviare gli indirizzi in modo coerente e completo in un database?Best practice per l'archiviazione di indirizzi coerente e completa in una banca dati

Per essere più precisi, credo che in questa fase che ci sono due casi per la conservazione indirizzo:

  • è sufficiente associare un indirizzo a una persona, un edificio o qualsiasi elemento (il caso più comune). Quindi una tabella piatta con colonne di testo (indirizzo1, indirizzo2, zip, città) è probabilmente sufficiente. Questo non è il caso che mi interessa.
  • si desidera eseguire statistiche sui propri indirizzi: quanti elementi in una determinata strada, o città o ... Quindi si desidera evitare errori di ortografia di qualsiasi tipo, e garantire la coerenza . La mia domanda riguarda le migliori pratiche in questo caso specifico: quali sono i modi migliori per modellare un database di indirizzi coerente?

Un progetto/soluzione specifico per paese sarebbe un ottimo inizio.

RISPOSTA: non sembra esistere una risposta perfetta a questa domanda ancora, ma:

  • xAL, come suggested by Hank, è la cosa più vicina ad uno standard globale che spuntato. Sembra essere piuttosto eccessivo, e non sono sicuro che molte persone vorrebbero implementarlo nel loro database ...
  • Per avviare il proprio design (per un paese specifico), Dave's link sul sito Universal Postal Union (UPU) è un ottimo punto di partenza.
  • Per quanto riguarda la Francia, esiste una norma (non ufficiale, ma di fatto standard) per gli indirizzi, che reca il bel nome di AFNOR XP Z10-011 (solo francese), e deve essere pagata. La descrizione di UPU per la Francia si basa su questa norma.
  • Mi è capitato di trovare la norma equivalente per la Svezia: SS 613401.
  • A livello europeo, sono stati fatti alcuni sforzi, con conseguente norma EN 14142-1. È ottenibile tramite CEN national members.
+0

In quale paese/paesi? La formattazione e la composizione degli indirizzi varia molto tra i diversi paesi. Se hai a che fare con un solo paese, il modello può essere molto più semplice di quello che vuoi se memorizzi gli indirizzi di qualsiasi paese in modo strutturato ... – KristoferA

+0

La Francia sarebbe perfetta ;-) Hai ragione: un solo paese gli indirizzi (credo che gli Stati Uniti sarebbero i più comuni, credo) sarebbero un ottimo punto di partenza. – Mac

risposta

3

userei una tabella Address, come hai suggerito, e mi piacerebbe basarlo sui dati rilevati da xAL.

0

normalizza lo schema del database e avrai la struttura perfetta per la coerenza corretta. e questo è il motivo per cui: http://weblogs.sqlteam.com/mladenp/archive/2008/09/17/Normalization-for-databases-is-like-Dependency-Injection-for-code.aspx

+0

Sì, ma conosci un design/normalizzazione comprovato per un database di questo tipo, oppure tutti devono reinventare quella che ritengo essere una ruota di uso comune? – Mac

+0

bene puoi google per la progettazione dell'indirizzo. ma solitamente il design dipende dalle esigenze della tua azienda. non tutti hanno bisogno dello stesso modello. – Mladen

1

Nel Regno Unito c'è un prodotto chiamato PAF from Royal Mail

Questo vi dà una chiave univoca per indirizzo - non ci sono cerchi di saltare attraverso, però.

+1

Ci sono problemi con PAF in quanto contiene solo indirizzi a cui viene consegnato il post. L'equivalente di Ordnance Survey (OSAPR) è in teoria superiore in quanto dovrebbe includere tutti gli indirizzi, ma in pratica è soggetto a errori e non aggiornato spesso. Molte autorità locali finiscono per utilizzare il proprio sistema interno. – Cruachan

1

Io fondamentalmente vedere 2 scelte se si vuole coerenza:

  1. pulizia dei dati
  2. base della tabella dati look up

Ad 1.Lavoro con SAS System e SAS Institute offre uno strumento per la pulizia dei dati, fondamentalmente esegue alcuni controlli e convalida sui dati e suggerisce che "Abram Lincoln Road" e "Abraham Lincoln Road" siano unite nella stessa strada. Penso anche che si basi su basi di dati nazionali contenenti le corrispondenze di codici di città-città e così via.

Ad 2. Si crea un elenco a scelta multipla (cioè dati di base) e le persone che aggiungono nuove voci scelgono da voci esistenti nei dati di base. Nella tabella dei fatti, le chiavi vengono memorizzate sui nomi delle strade anziché sui nomi delle strade. Se si rileva un errore di ortografia, è sufficiente correggerlo nei dati di base e tutte le istanze vengono corrette con esso, tramite la relazione chiave.

Si noti che queste opzioni non si escludono a vicenda, è possibile utilizzare entrambi gli approcci allo stesso tempo.

0

Ho chiesto qualcosa di molto simile in precedenza: Dynamic contact information data/design pattern: Is this in any way feasible?.

La risposta breve: la memorizzazione di componenti aggiuntivi o qualsiasi tipo di informazioni di contatto in un database è complessa. Il collegamento XAL (Extendible Address Language) sopra ha alcune informazioni interessanti che sono il più vicino a uno standard/best practice che ho visto attraverso ...

0

Negli Stati Uniti, suggerirei di scegliere un cambio di indirizzo nazionale fornitore e modella il DB dopo quello che restituiscono.

1

Le autorità su come gli indirizzi sono costruiti sono generalmente i servizi postali, quindi per cominciare vorrei esaminare gli elementi di dati utilizzati dai servizi postali per i principali mercati si opera in.

consultare il sito web del Universale Postal Union per informazioni molto specifiche e dettagliate sui formati di indirizzo postale internazionale: http://www.upu.int/post_code/en/postal_addressing_systems_member_countries.shtml

28

Ho pensato anche a me stesso. Ecco i miei pensieri vaghi finora, e mi chiedo cosa pensano gli altri.

xAL (e la sua sorella che include nomi personali, XNAL) viene utilizzato da entrambi i servizi di geocodifica di Google e Yahoo, dandogli un certo peso. Ma poiché lo stesso indirizzo può essere descritto in xAL in molti modi diversi, alcuni più specifici di altri, allora non vedo come xAL stesso sia un formato accettabile per l'archiviazione dei dati. Alcuni dei suoi nomi di campo potrebbe essere utilizzato, tuttavia, ma in realtà l'unico formato di base che può essere utilizzato tra i 16 paesi che le mie navi aziendali a è la seguente:

 

enum address-fields 
{ 
    name, 
    company-name, 
    street-lines[], // up to 4 free-type street lines 
    county/sublocality, 
    city/town/district, 
    state/province/region/territory, 
    postal-code, 
    country 
} 
 

Questo è abbastanza facile per mappare in un unico tabella di database, consentendo solo NULL sulla maggior parte delle colonne. E sembra che questo sia il modo in cui Amazon e molte organizzazioni conservano effettivamente i dati degli indirizzi. Quindi la domanda che rimane è come dovrei modellare questo in un modello di oggetto che è facilmente utilizzato dai programmatori e da qualsiasi codice della GUI. Abbiamo un tipo Address di base con sottoclassi per ogni tipo di indirizzo, ad esempio AmericanAddress, CanadianAddress, GermanAddress e così via? Ognuno di questi tipi di indirizzo saprebbe come formattare se stessi e opzionalmente saprebbe un po 'sulla convalida dei campi.

Essi potrebbero anche tornare un certo tipo di metadati su ognuno dei campi, come ad esempio la seguente struttura di dati pseudocodice:

 

structure address-field-metadata 
{ 
    field-number,  // corresponds to the enumeration above 
    field-index,  // the order in which the field is usually displayed 
    field-name,  // a "localized" name; US == "State", CA == "Province", etc 
    is-applicable, // whether or not the field is even looked at/valid 
    is-required,  // whether or not the field is required 
    validation-regex, // an optional regex to apply against the field 
    allowed-values[] // an optional array of specific values the field can be set to 
} 
 

Infatti, invece di avere oggetti di indirizzi singoli per ogni paese, potremmo prendere la un approccio leggermente meno orientato all'oggetto di avere un oggetto Address che si rifiuta.Proprietà NET e utilizza un AddressStrategy stabilire regole di formattazione e convalida:

 

object address 
{ 
    set-field(field-number, field-value), 
    address-strategy 
} 

object address-strategy 
{ 
    validate-field(field-number, field-value), 
    cleanse-address(address), 
    format-address(address, formatting-options) 
} 
 

Quando si imposta un campo, che Address oggetto avrebbero richiamare il metodo appropriato sul suo AddressStrategy oggetto interno.

Il motivo dell'utilizzo di un approccio al metodo SetField() anziché di proprietà con getter e setter è che è più semplice che il codice imposti effettivamente questi campi in modo generico senza ricorrere a istruzioni di riflessione o di commutazione.

si può immaginare il processo in corso qualcosa di simile:

  1. codice della GUI chiama un metodo factory o qualcosa del genere per creare un indirizzo basato su un paese. (Il menu a discesa paese, quindi, è la prima cosa che il cliente seleziona, o ha una buona preselezione preselezionata per loro in base alle informazioni sulla cultura o all'indirizzo IP.)
  2. GUI chiama address.GetMetadata() o un metodo simile e riceve un elenco di le strutture AddressFieldMetadata come descritto sopra. Può utilizzare questi metadati per determinare quali campi visualizzare (ignorando quelli con is-applicable impostato su false), cosa etichettare quei campi (utilizzando il membro field-name), visualizzare quei campi in un ordine particolare ed eseguire la convalida di livello di presentazione rapida su tali dati (utilizzando i membri is-required, validation-regex e allowed-values).
  3. La GUI chiama il metodo address.SetField() utilizzando field-number (che corrisponde all'enumerazione precedente) e ai relativi valori. L'oggetto Address o la sua strategia possono quindi eseguire alcune convalida degli indirizzi avanzata su quei campi, richiamare pulitori di indirizzo, ecc

Ci potrebbero essere lievi variazioni su quanto sopra, se vogliamo rendere l'oggetto in sé Address comportarsi come un immutabile oggetto una volta creato. (Che probabilmente cercherò di fare, dato che l'oggetto Address è davvero più simile a una struttura dati e probabilmente non avrà mai alcun vero comportamento associato a se stesso.)

Tutto ciò ha senso? Mi sto allontanando troppo dal percorso OOP? Per me, questo rappresenta un compromesso piuttosto ragionevole tra l'essere così astratti che l'implementazione è quasi impossibile (xAL) rispetto a essere rigorosamente di stampo americano.


Update 2 anni dopo: alla fine ho finito con un sistema simile a questo e ha scritto su di esso a my defunct blog.

Mi sento come se questa soluzione fosse il giusto equilibrio tra dati legacy e archiviazione dati relazionali, almeno per il mondo dell'e-commerce.

+0

Il collegamento del blog è il codice 410 "Via". Hai un link aggiornato? –

+0

Grazie, ho aggiornato il collegamento a una copia archiviata –

0

L'1% del problema con gli indirizzi è il loro formato: campi sufficientemente etichettati e ordinati della dimensione richiesta. Il 99% è il loro contenuto: numeri non validi, errori di battitura, abbreviazioni e errori di ortografia, parole mancanti o superflue, ecc. Non preoccuparti dell'1% (che può essere cambiato facilmente in qualsiasi momento) finché non hai il 99% sotto controllo.

www.upu.int ha gli standard di formato per gli indirizzi internazionali. La pubblicazione 28 su usps.com ha gli standard di formato degli Stati Uniti. Il software CASS come http://semaphorecorp.com esegue la convalida per gli indirizzi degli Stati Uniti.

1

"XAL è la cosa più vicina ad uno standard globale che è saltato fuori. Sembra essere piuttosto un eccessivo però, e io non sono sicuro che molte persone vorrebbero per la sua attuazione nel loro database ..."

Questo non è un argomento pertinente. Implementare gli indirizzi non è un compito banale se il sistema deve essere "completo e coerente" (vale a dire in tutto il mondo). L'implementazione di tale standard richiede molto tempo, ma è comunque necessario soddisfare il requisito specificato.