¿Cómo se deben almacenar direcciones geográficas internacionales en una base de datos relacional?

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

  •  18-09-2019
  •  | 
  •  

Pregunta

Teniendo en cuenta la tarea de almacenar direcciones geográficas internacionales en una tabla relacional, ¿cuál es el esquema más flexible? En caso de que cada parte de la dirección de romperse a cabo en sus propios campos, o debería ser más como texto libre?

¿Hay algún sentido en la separación de dirección diferente formato en diferentes mesas? Por ejemplo, tener una mesa para USAAddress, CanadianAddress, direccionUK ...?

¿Fue útil?

Solución

Voy a resumir mis pensamientos de mi blog - Una lección en el almacenamiento de direcciones .

En mi proyecto actual [Yo trabajo para una empresa de logística] que está almacenando las direcciones internacionales. He hecho investigaciones sobre las direcciones de todo el mundo en el diseño de esta parte de la base de datos. Hay una gran cantidad de diferentes formatos. En el mundo occidental se tiende a utilizar un formato bastante uniforme - algunas diferencias, pero la mayoría son:

  • Número de la calle - Numérico
  • casa o edificio Nombre - [VarChar - en el Reino Unido algunas casas / edificios se identifican por su nombre, no por el número]
  • Número Calle sufijo [VarChar, aunque en la mayoría de los casos, Char (1) sería suficiente]
    • A, B, etc.
  • nombre de calle [VarChar]
  • Tipo de la calle [VarChar o Int si usted tiene una mesa StreetTypes]
    • Hasta ahora, he encontrado 262 tipos únicos en el mundo de habla Inglés, que es probable más, y no se olvide de otros idiomas es decir Strasse, la calle, etc.
  • dirección de la calle [VARCHAR (2)]
    • N, E, S, W, NE, SE, NW, SW
  • Tipo de dirección [VarChar o Int si tiene una mesa de AddressTypes]
    • PO Box
    • Apartamento
    • Edificio
    • piso
    • Oficina
    • suite
    • etc ...
  • Tipo de dirección Identificador [VarChar]
    • es decir. Número de caja, número de apartamento, Número del piso recordar números de apartamentos y oficinas a veces tienen información alfanumérica - como 1A
  • Municipio local [VarChar o Int si tienen una mesa municipios]
    • Por ejemplo, si su aldea / pueblo aparece en la dirección antes de la ciudad.
  • Ciudad / Pueblo [VarChar o Int si usted tiene una mesa ciudades]
  • Administración del Distrito [VarChar o Int si tienen una mesa distritos]
    • Estado (U.S.)
    • Provincia (Canadá)
    • Distrito Federal (México)
    • Condado (U.K.)
    • etc ...
  • Zona Postal [VarChar]
    • Zip (U.S.)
    • Código Postal (Canadá, México)
    • Código postal (U.K).
  • País [VarChar o Int si usted tiene una mesa de Países]

Esto parece cubrir la mayoría de los países, pero el orden de los campos puede aparecer de forma diferente. Puede encontrar una lista de los formatos de visualización en http: //www.bitboost. com / REF / dirección-formats.html internacionales # formatos

Por ejemplo, en muchos países, el código postal cae antes de que el nombre de la ciudad y el número de la calle cae después de que el nombre de la calle. En Canadá, EE.UU. y el Reino Unido el número de la calle precede al nombre de la calle y el código postal (o ZIP) viene después del nombre de la ciudad.

En respuesta a su pregunta acerca de la separación de las direcciones en diferentes países, no sugeriría que, se acaba de hacer la vida más difícil en otras áreas - para informar ejemplo. El formato que he proporcionado cubre todas las direcciones en nuestra base de datos de logística que cubre EE.UU., Canadá, México y el Reino Unido sin ningún problema. También cubre todas nuestras direcciones europeos, chinos, japoneses y malayos. No puedo hablar por otros países, pero aún no he tenido que almacenar una dirección de un país que estos campos no apoyarán.

No sugiero ir con la Dirección 1, Dirección 2 formato, Address3 sugerido por otros y visto en muchas bases de datos, ya analizar la información de la dirección de una cadena alfanumérica no es tan sencillo como podría parecer - especialmente si los datos ISN' t introduce correctamente, debido a la falta de información, error tipográfico, faltas de ortografía, etc. Si se separa sus campos puede utilizar distaNCE algoritmos para comprobar si hay probabilidades sentido, utilizar la probabilidad para comprobar el nombre de la calle contra el número de código y la calle postal o para comprobar la provincia y una ciudad a nombre de la calle, etc. Trate de hacer nada de eso cuando se tiene una cadena que indica la dirección de la calle entera. No es una cuestión trivial por cualquier tramo de la imaginación.

control de calidad en una base de datos de direcciones es un dolor de cabeza, y punto. La forma más fácil para simplificar su vida en esta área es asegurarse de que todos los campos tienen sólo una única pieza de información que puede ser verificada automáticamente como correctos en el momento de entrada. De probabilidad, los algoritmos de distancia y expresiones regulares pueden comprobar la validez de la entrada y proporcionar información al usuario sobre lo que era su error y sugerir correcciones adecuadas.

Una advertencia a tener en cuenta es que las carreteras con nombres también son tipos de la calle - si usted está cubriendo Canadá tiene que ser consciente de "Avenue Road" en Toronto que tropezar a lo grande si usted está utilizando el Dirección 1, 2, 3 formato. Esto probablemente ocurre en otros lugares también, aunque no estoy al tanto de ellos - esta única instancia fue suficiente para mí a gritar WTF

Otros consejos

Tenga cuidado de no sobre-analizar formatos de dirección. Cuando lo haga, usted es muy probable que termine con una especificación de la mayoría de los usuarios tendrán que trabajar alrededor , forzando efectivamente utilizar los campos incorrectos o sólo llenar los campos primarios y haciendo caso omiso de los campos extra .

Mantener las cosas simples.

A StreetType como se ha mencionado por BenAlabaster causará problemas a la hora de empezar a trabajar con lenguajes diferentes de aislar idiomas como Inglés o Español.

Para mostrar lo mal que se puede obtener en la naturaleza: el "Henriette Roland Holststraat" en Amsterdam, construido a partir de "Roland Holst" "Straat" "Henriette" + +, que puede abreviarse como "Roland Holststraat" o "Roland Holststr.", o mal escrito como "HRHolststr." o "Henriette Roland-Holst Straat", dependiendo del clima. A menos que tenga un registro de calle hasta a la fecha de cada país de la tierra, podrás ir a ninguna parte.

Y, por último, tener cuidado de que en algunos países multilingües, los nombres pueden ser diferentes de un idioma a otro! Por ejemplo, en Bruselas, donde muchas calles tienen tanto una francesa y un nombre holandés: "Avenu du Port" y "Havenlaan", según el idioma preferido del destinatario. (Google Maps muestra ambos nombres alternativamente, sólo para estar en el lado seguro.)

Puede intentar idear todo tipo de trucos inteligentes aquí, pero son los representantes de ventas. va a entender esto?

Eso depende de lo que quieres hacer con ella.

He encontrado que es siempre más fácil de usar direcciones para otros fines (como la verificación respecto a los datos de USPS o conseguir tasas de envío de UPS / FEDEX) si están separados.

Esto es lo que suelen utilizar para las direcciones:

  • Dirección Línea 1
  • Dirección Línea 2
  • Dirección Línea 3
  • Ciudad
  • Región
  • Código Postal
  • Condado
  • País

En respuesta a la edición: Para la mayoría de las situaciones, no veo el uso. La tabla que se enumeran más arriba tiene suficientes campos (y es lo suficientemente genérico) para las direcciones de la mayoría de los países.

Dirección

Como se ha proporcionado un polo opuesto a la excelente @BenAlabaster respuesta, simplemente podría tener:

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

Tu forma diseños del lado del cliente todavía puede ser tan complejo como mejor le parezca (o utilizar una entrada multi-línea en la que el usuario puede escribir manualmente la dirección). A continuación, puede añadir los saltos de línea en la dirección cuando sea necesario.

País

Su tabla de país se vería de la siguiente manera:

country_code  VARCHAR(2)
country_name  VARCHAR(255)

Además, usted podría tener un de los siguientes:

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

A continuación, utilice las siguientes listas para diseñar su tabla de país:

Esto es una anécdota para cualquier persona que se topa con esta pregunta:

Hablo como una persona que ha vivido y trabajado en una gran cantidad de continentes (Europa, Asia, América del Norte). En mi experiencia, y la experiencia de las personas con las que trabajo, que ha sido mucho más fácil para nosotros usar sistemas que hacen lo siguiente:

  1. proporcionan tres líneas en el que me va a escribir una dirección. Pasar estas tres líneas en que su servicio postal local como yo las escribo, palabra por palabra. Permítanme utilizar cualquier conjunto de caracteres que quiero; utilizar UTF-8 o algo mejor.
  2. Si el sistema dispone de los requerimientos del negocio que me necesitan para especificar información en particular (como el código postal, prefectura, estado, etc.), pida que por separado. Por requerimientos del negocio, me refiero a cosas como la analítica; estos bits de información no deben ser compartidos con su servicio postal local (a menos que también pasó a escribir la misma información en una de las tres líneas desde el punto 1, arriba).
  3. Tener un desplegable que me pide que especifique la ubicación de la dirección categórica que proporcioné en las líneas del punto 1 anterior, quizá País.
  4. Si tiene que analizar la información que proporciono en las líneas de punto 1, utilice mi respuesta al punto 3 para seleccionar expresiones regulares. Ejecución que regex con la información en el punto 1 a analizarlo. Trata de llenar los elementos de la interfaz de usuario del punto 2 utilizando la salida de su expresión regular. Si en lo cierto que la información autorrellenará - utilizar el hecho de que lo cambié a mejorar su expresión regular. Del mismo modo, en lo posible, me dan la oportunidad de revisar y corregir la salida de su expresión regular:. Nadie sabe mejor lo que tenía la intención de comunicar que yo

Los sistemas construidos de esta manera, me parece, hacen mi vida más fácil. En particular, cuando estoy enviando correo a un sistema postal de la que su empresa no tiene prácticamente ningún conocimiento interno funcional.

Si su empresa tiene conocimiento interno sobre los sistemas postales en particular, utilice mi selección en el punto 3 para informar a la vista que se visualiza a mí. Mucha gente sabe lo que el sistema postal de Estados Unidos espera en los envases; si selecciono los Estados Unidos en el punto 3, no dude en hacer la vista más apropiada para una dirección en Estados Unidos. Si selecciono un país sobre el que su empresa no sabe nada - mostrar un genérico tres líneas y déjame hacer el resto; no me obligan a utilizar ASCII.

Y seamos realistas aquí - la construcción de una base de datos completa, enciclopédico de todos los sistemas postales globales (públicos y privados) es una tarea hercúlea, en el mejor, si no imposible. Hay, por ejemplo, los sistemas postales en las que sólo el, operador local de última milla realmente sabe donde se encuentra una dirección. A veces ser capaz de pasar notas a esa portadora en el envase es extremadamente útil. Y el mapeo de los conocimientos locales de cada portadora caso extremo en su base de datos es de hecho una tarea imposible.

Sólo hay que preguntar Gödel. (Y entonces preguntarse si usted está tratando de utilizar un sistema axiomático para modelar un universo de discurso, más o menos una especie de aritmética como la teoría de conjuntos o el álgebra relacional.)

Comentario de respuesta de Ben Alabaster: Para dar formato a direcciones en función del país, se puede utilizar una tabla de formato que tiene el orden de las columnas para cada país en filas separadas.

  • AddressFormat (countryCode, FieldName, FieldOrder)

El orden de los campos puede ser codificado para utilizar diseños de cuadrícula complejos también.

No hay ningún punto en la separación de las direcciones según el país. Esta será caótico como el número de países aumenta y que aterrizará en problemas si usted quiere encontrar todas las direcciones de, por ejemplo, un cliente internacional. Tener un tipo de dirección sugerida por Ben también podría dar lugar a ambigüedades cuando se tiene una dirección que tiene tanto un número de edificio y un número de apartamento. Podría estar en un complejo de apartamentos, donde cada edificio tiene un nombre diferente. Esto es muy común en la India.

https://github.com/commerceguys/addressing biblioteca para dar formato a las direcciones internacionales y se utilizar estos elementos:

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

Esto ayuda doen't si desea analizar la calle (nombre, número de casa, ...).

Por cierto. si usted está buscando una lista de países en varios idiomas: https://github.com/umpirsky/country-list

La única manera de hacerlo es dividir a:

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

ya que casi todos los países tiene su propio estándar para tener datos de la dirección, y el país evey tiene un formato diferente de los códigos postales.
Puede tener una pequeña muestra de los problemas en mi post de una pregunta similar.

Esto no debería tener sentido para separar las direcciones de todos los países, ya que hay países donde hay pocas convenciones de dirección. Algunas convenciones populares incluyen no tienen calles en pequeños pueblos, sólo el nombre y el número del pueblo, mientras que las calles están en direcciones ciudades más grandes. He aprendido que en la capital de Hungría - Budapest, hay pocas calles que tienen el mismo nombre (que se distinga por su número de distrito de la ciudad de), mientras que otras ciudades no tienen ese tipo de direcciones (alguien de Hungría puede confirmar en realidad si esto es cierto). Por lo que el número total de formatos de dirección será numer_of_countries multiplicado por el número de formatos de dirección en este país ... Se puede hacer con diferentes tablas, pero va a ser horrible trabajo que hacer.

Sé que esto es un tema muy antiguo que ya ha sido respondida, pero pensé que me gustaría tirar mis dos centavos adentro también. Todo depende de cuáles son sus objetivos del proyecto y cómo espera que los usuarios de destino para introducir direcciones. La sugerencia de Ben le permitirá analizar las direcciones con precisión, pero por otro lado podría hacer para un proceso de entrada de datos de usuario ya (y posiblemente más frustrante). La sugerencia de Stephen Wrighton es más simple, y podría ser más fácil para los usuarios introducir direcciones como resultado.

También he visto algunos modelos que simplemente tenían una columna "Dirección" que captura un número típico de la calle, tipo, nombre de la calle, la unidad / número de apartamento, etc., todo en una sola columna, mientras se mantiene la Ciudad, País, Región , etc. dentro de otras columnas. Al igual que en el modelo de Stephen, excepto Dirección 1, Dirección 2, y Address3 toda consolidadas en una columna.

Mi opinión es que los modelos más flexibles tienden a ser aquellos que son menos restrictivas, dependiendo de su interpretación de flexible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top