2008-09-24 1142 views
23

¿Existen mejores prácticas (o incluso estándares) para almacenar direcciones de forma consistente y completa en una base de datos?Mejores prácticas para el almacenamiento de direcciones coherente y completo en una base de datos

Para ser más específicos, creo que en esta etapa que hay dos casos de almacenamiento de direcciones:

  • sólo tiene que asociar una dirección de una persona, un edificio o cualquier artículo (el caso más frecuente) Entonces, es probable que una mesa plana con columnas de texto (dirección1, dirección2, zip, ciudad) sea suficiente. Este no es el caso en el que estoy interesado.
  • desea ejecutar estadísticas sobre sus direcciones: cuántos elementos en una calle específica, o ciudad o ... Entonces desea evitar errores ortográficos de cualquier tipo, y garantizar la coherencia . Mi pregunta es sobre las mejores prácticas en este caso específico: ¿cuáles son las mejores formas de modelar una base de datos de direcciones coherente?

Un diseño/solución específico para el país sería un excelente comienzo.

RESPUESTA: No parece haber existir una respuesta perfecta a esta pregunta todavía, pero:

  • xAL, como suggested by Hank, es lo más parecido a un estándar global que apareció. Sin embargo, parece ser bastante exagerado, y no estoy seguro de que muchas personas quieran implementarlo en su base de datos ...
  • Para iniciar el propio diseño (para un país específico), Dave's link en el sitio Universal Postal Union (UPU) es un muy buen punto de partida
  • En cuanto a Francia, existe una norma (no oficial, pero estándar de facto) para las direcciones, que lleva el hermoso nombre de AFNOR XP Z10-011 (solo francés), y tiene que ser pagado. La descripción de UPU para Francia se basa en esta norma.
  • Encontré la norma equivalente para Suecia: SS 613401.
  • A nivel europeo, se han hecho algunos esfuerzos, lo que da como resultado la norma EN 14142-1. Se puede obtener a través del CEN national members.
+0

¿En qué país/países? El formato y composición de las direcciones varía mucho entre los diferentes países. Si solo está tratando con un solo país, el modelo puede ser mucho más simple que si quiere almacenar direcciones de cualquier país de forma estructurada ... – KristoferA

+0

Francia sería perfecta ;-) Tiene razón: país único direcciones (Estados Unidos sería el más común, creo) sería un excelente punto de partida. – Mac

Respuesta

3

que haría uso de una tabla de Address, como se ha sugerido, y me baso en los datos registrados por xAL.

0

normalice su esquema de base de datos y tendrá la estructura perfecta para una consistencia correcta. y esta es la razón: http://weblogs.sqlteam.com/mladenp/archive/2008/09/17/Normalization-for-databases-is-like-Dependency-Injection-for-code.aspx

+0

Sí, pero ¿sabe usted de un diseño/normalización comprobada para una base de datos así, o todos tienen que reinventar lo que creo que es una rueda muy necesaria? – Mac

+0

bien puede google para el diseño de la dirección. pero usualmente el diseño depende de las necesidades de su negocio. no todos ellos necesitan el mismo modelo. – Mladen

1

En el Reino Unido hay un producto llamado PAF from Royal Mail

Esto le da una clave única por cada dirección - hay aros para saltar a través, sin embargo.

+1

Existen problemas con PAF, ya que solo contiene las direcciones a las que se entrega la publicación. El equivalente de la Encuesta Ordnance (OSAPR) es en teoría superior, ya que debe incluir todas las direcciones, pero en la práctica es propenso a errores y no se actualiza con frecuencia. Muchas autoridades locales terminan usando su propio sistema interno – Cruachan

1

básicamente veo 2 opciones si quieres consistencia:

  1. Limpieza de datos
  2. la tabla de datos básicos arriba aspecto de

ad 1.Trabajo con SAS System, y SAS Institute ofrece una herramienta para la limpieza de datos, básicamente realiza algunas comprobaciones y validaciones de sus datos, y sugiere que "Abram Lincoln Road" y "Abraham Lincoln Road" se fusionen en la misma calle. También creo que se basa en bases de datos nacionales que contienen coincidencias del código postal de la ciudad y así sucesivamente.

Anuncio 2. Crea una lista de opciones múltiples (es decir, datos básicos) y las personas que añaden nuevas entradas eligen entre las entradas existentes en sus datos básicos. En tu tabla de hechos, almacenas las claves de los nombres de las calles en lugar de los nombres de las calles. Si detecta un error ortográfico, simplemente corríjalo en sus datos básicos, y todas las instancias se corrigen con él, a través de la relación clave.

Tenga en cuenta que estas opciones no se excluyen entre sí, puede utilizar ambos enfoques al mismo tiempo.

0

Pregunté algo bastante similar anteriormente: Dynamic contact information data/design pattern: Is this in any way feasible?.

La respuesta corta: almacenar adderres o cualquier tipo de información de contacto en una base de datos es compleja. El enlace de Lenguaje Extensible de Dirección (xAL) de arriba tiene información interesante que es la más cercana a una práctica estándar/mejor que he encontrado ...

0

En los Estados Unidos, sugiero elegir un Cambio Nacional de Dirección proveedor y modele el DB después de lo que devuelven.

1

Las autoridades en cómo se construyen las direcciones son en general los servicios postales, por lo que para empezar me gustaría examinar los datos usados ​​por los servicios postales para los principales mercados en los que operan.

Ver la página web del universal Postal Union para información muy específica y detallada en formatos de direcciones postales internacionales: http://www.upu.int/post_code/en/postal_addressing_systems_member_countries.shtml

28

He estado pensando en esto yo también. Aquí están mis pensamientos sueltos hasta ahora, y me pregunto qué piensan los demás.

xAL (y su hermana, que incluye nombres personales, XNAL) es utilizado tanto por los servicios de geocodificación de Google como de Yahoo, lo que le da algo de peso. Pero dado que la misma dirección se puede describir en xAL de muchas maneras diferentes, algunas más específicas que otras, entonces no veo cómo xAL en sí es un formato aceptable para el almacenamiento de datos. Algunos de sus nombres de campo se podrían utilizar, sin embargo, pero en realidad el único formato básico que se puede utilizar entre los 16 países que mis compañía envía a es la siguiente:

 

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 
} 
 

Eso es bastante fácil para trazar en una sola tabla de base de datos, permitiendo solo NULL en la mayoría de las columnas. Y parece que así es como Amazon y muchas organizaciones almacenan datos de direcciones. Entonces, la pregunta que queda es cómo debería modelar esto en un modelo de objetos que sea fácilmente utilizado por los programadores y por cualquier código GUI. ¿Tenemos un tipo base Address con subclases para cada tipo de dirección, como AmericanAddress, CanadianAddress, GermanAddress, etc.? Cada uno de estos tipos de direcciones sabría cómo formatear ellos mismos y, opcionalmente, sabría un poco sobre la validación de los campos.

También podrían regresar algún tipo de metadatos acerca de cada uno de los campos, tales como la estructura de datos siguiente pseudocódigo:

 

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 
} 
 

De hecho, en lugar de tener objetos de direcciones individuales para cada país, que podría tomar la un enfoque ligeramente menos orientado a objetos de tener un objeto Address que evita.propiedades NET y utiliza un AddressStrategy para determinar las reglas de formateo y de validación:

 

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) 
} 
 

Al configurar un campo, que Address objeto sería invocar el método apropiado en su AddressStrategy objeto interno.

El motivo de utilizar un método SetField() en lugar de propiedades con getters y setters es tal que es más fácil para el código establecer estos campos de forma genérica sin recurrir a sentencias de reflexión o cambio.

se puede imaginar el proceso va algo como esto:

  1. código de interfaz gráfica de usuario llama a un método de fábrica o algo parecido para crear una dirección sobre la base de un país. (El menú desplegable del país, entonces, es lo primero que el cliente selecciona, o tiene una buena conjetura preseleccionada para ellos según la información cultural o la dirección IP.)
  2. La GUI llama a address.GetMetadata() o un método similar y recibe una lista de las estructuras AddressFieldMetadata como se describió anteriormente. Puede usar estos metadatos para determinar qué campos mostrar (ignorando aquellos con is-applicable establecidos en false), qué etiquetar esos campos (usando el miembro field-name), mostrar esos campos en un orden particular y realizar una validación superficial, de nivel de presentación en esos datos (usando los miembros is-required, validation-regex y allowed-values).
  3. La GUI llama al método address.SetField() utilizando field-number (que corresponde a la enumeración anterior) y sus valores dados. El objeto Address o su estrategia puede entonces realizar una validación avanzada de direcciones en esos campos, invocar a los limpiadores de dirección, etc.

Puede haber pequeñas variaciones respecto a lo anterior, si queremos hacer que el objeto en sí Address se comportan como un inmutable objeto una vez que se crea. (Lo cual probablemente intentaré hacer, ya que el objeto Address es realmente más como una estructura de datos, y probablemente nunca tenga ningún comportamiento verdadero asociado a sí mismo.)

¿Tiene algo de esto sentido? ¿Me estoy alejando demasiado de la ruta OOP? Para mí, esto representa un compromiso bastante sensato entre ser tan abstracto que la implementación es casi imposible (xAL) versus estar estrictamente predispuesto por los EE. UU.


Actualización 2 años más tarde: que finalmente terminó con un sistema similar a este y escribió sobre él en my defunct blog.

Creo que esta solución es el equilibrio correcto entre los datos heredados y el almacenamiento de datos relacionales, al menos para el mundo del comercio electrónico.

+0

El enlace de su blog es el código 410 "Ido". ¿Tienes un enlace actualizado? –

+0

Gracias, actualicé el enlace a una copia archivada –

0

1% del problema con las direcciones es su formato: suficientes campos correctamente etiquetados y ordenados del tamaño requerido. 99% es su contenido: números inválidos, errores ortográficos, abreviaturas y errores de ortografía, palabras faltantes o superfluas, etc. No se preocupe por el 1% (que se cambia fácilmente en cualquier momento) hasta que tenga el 99% bajo control.

www.upu.int tiene los estándares de formato para direcciones internacionales. La publicación 28 en usps.com tiene los estándares de formato de EE. UU. El software CASS como http://semaphorecorp.com realiza la validación para direcciones de EE. UU.

1

"XAL es lo más parecido a un estándar global que apareció. Parece ser toda una exageración sin embargo, y no estoy seguro de que mucha gente quiere ponerlo en práctica en su base de datos ..."

Este no es un argumento relevante. La implementación de direcciones no es una tarea trivial si el sistema debe ser "integral y consistente" (es decir, a nivel mundial). Implementar un estándar de este tipo lleva mucho tiempo, pero cumplir con el requisito especificado es obligatorio.

Cuestiones relacionadas