¿Las mejores prácticas para almacenar direcciones postales en una base de datos (RDBMS)? -- database campo con database-design campo con types campo con street-address campo con postal-code camp Relacionados El problema

Best practices for storing postal addresses in a database (RDBMS)?


116
vote

problema

Español

¿Hay buenas referencias para las mejores prácticas para almacenar direcciones postales en un RDBMS? Parece que hay muchas compensaciones que se pueden hacer y muchos pros y contras para ser evaluados, seguramente esto se ha hecho una y otra vez. Tal vez alguien ha escrito al menos haciendo algunas lecciones aprendidas en alguna parte?

Ejemplos de las compensaciones con las que estoy hablando están almacenando el código postal como un entero frente a un campo de caracteres, si el número de la casa se almacena como un campo separado o parte de la línea de dirección 1, debe ser normalizado o simplemente los números de suite / apartamento / etc. Almacenado como un trozo de texto en la línea de dirección 2, ¿cómo maneja la cremallera +4 (campos separados o un gran campo, entero vs text)? etc.

Estoy preocupado principalmente por las direcciones de los EE. UU. En este punto, pero me imagino que hay algunas mejores prácticas con respecto a prepararse para la eventualidad de ir global también (por ejemplo, nombramientos de campos adecuadamente como región en lugar de código de estado o postal en lugar de Código postal, etc.

Original en ingles

Are there any good references for best practices for storing postal addresses in an RDBMS? It seems there are lots of tradeoffs that can be made and lots of pros and cons to each to be evaluated -- surely this has been done time and time again? Maybe someone has at least written done some lessons learned somewhere?

Examples of the tradeoffs I am talking about are storing the zipcode as an integer vs a char field, should house number be stored as a separate field or part of address line 1, should suite/apartment/etc numbers be normalized or just stored as a chunk of text in address line 2, how do you handle zip +4 (separate fields or one big field, integer vs text)? etc.

I'm primarily concerned with U.S. addresses at this point but I imagine there are some best practices in regards to preparing yourself for the eventuality of going global as well (e.g. naming fields appropriately like region instead of state or postal code instead of zip code, etc.

              
   
   

Lista de respuestas

44
 
vote

Para obtener más uso internacional, un esquema a considerar es el utilizado por Campo de dirección DRUPAL . Se basa en la Standard XNAL , y parece cubrir la mayoría de los casos internacionales. Un poco de excavación en ese módulo revelará algunas perlas bonitas para interpretar y validar las direcciones a nivel internacional. También tiene un buen conjunto de áreas administrativas (provincia, estado, oblast, etc.) con códigos ISO.

Aquí está la esencia del esquema, copiado de la página del módulo:

  country => Country (always required, 2 character ISO code) name_line => Full name (default name entry) first_name => First name last_name => Last name organisation_name => Company administrative_area => State / Province / Region (ISO code when available) sub_administrative_area => County / District (unused) locality => City / Town dependent_locality => Dependent locality (unused) postal_code => Postal code / ZIP Code thoroughfare => Street address premise => Apartment, Suite, Box number, etc. sub_premise => Sub premise (unused)   

Lecciones que he aprendido:

  • no almacenar nada numéricamente.
  • Tienda País y área administrativa como códigos ISO donde sea posible.
  • Cuando no lo sabes, sé laxa sobre requiriendo campos. Es posible que algunos países no utilicen campos que dan por sentado, incluso cosas básicas como constexpr double myPow(double x, int exp) { double pow = 1.0; for (int i = 0; i < exp; ++i) pow *= x; for (int i = 0; i > exp; --i) pow /= x; return pow; } template < int exp > struct DoubleValue { static constexpr double value = myPow(10.0, exp); }; 0 & amp; constexpr double myPow(double x, int exp) { double pow = 1.0; for (int i = 0; i < exp; ++i) pow *= x; for (int i = 0; i > exp; --i) pow /= x; return pow; } template < int exp > struct DoubleValue { static constexpr double value = myPow(10.0, exp); }; 1111 .
 

For more international use, one schema to consider is the one used by Drupal Address Field. It's based on the xNAL standard, and seems to cover most international cases. A bit of digging into that module will reveal some nice pearls for interpreting and validating addresses internationally. It also has a nice set of administrative areas ( province, state, oblast, etc ) with ISO codes.

Here's the gist of the schema, copied from the module page:

country => Country (always required, 2 character ISO code) name_line => Full name (default name entry) first_name => First name last_name => Last name organisation_name => Company administrative_area => State / Province / Region (ISO code when available) sub_administrative_area => County / District (unused) locality => City / Town dependent_locality => Dependent locality (unused) postal_code => Postal code / ZIP Code thoroughfare => Street address premise => Apartment, Suite, Box number, etc. sub_premise => Sub premise (unused) 

A lessons I've learned:

  • Don't store anything numerically.
  • Store country and administrative area as ISO codes where possible.
  • When you don't know, be lax about requiring fields. Some country may not use fields you take for granted, even basic things like locality & thoroughfare.
 
 
     
     
24
 
vote

Como usuario 'internacional', no hay nada más frustrante que tratar con un sitio web que está orientado alrededor de solo las direcciones de formato de los Estados Unidos. Es un poco grosero al principio, pero se convierte en un problema grave cuando la validación también es demasiado celosa.

Si está preocupado por ir global, el único consejo que tengo es mantener las cosas de forma libre. Diferentes países tienen diferentes convenciones: en algunos, el número de la casa se presenta antes del nombre de la calle, en algunos que viene después. Algunos tienen estados, algunas regiones, algunos condados, algunas combinaciones de aquellos. Aquí en el Reino Unido, el código postal no es un código postal, es un código postal que contiene letras y números.

Aconsejaría simplemente ~ 10 líneas de cadenas de longitud variable, junto con un campo separado para un código postal (y tenga cuidado de cómo describe eso para hacer frente a las sensibilidades nacionales). Deje que el usuario / cliente decida cómo escribir sus direcciones.

 

As an 'international' user, there is nothing more frustrating than dealing with a website that is oriented around only US-format addresses. It's a little rude at first, but becomes a serious problem when the validation is also over-zealous.

If you are concerned with going global, the only advice I have is to keep things free-form. Different countries have different conventions - in some, the house number comes before the street name, in some it comes after. Some have states, some regions, some counties, some combinations of those. Here in the UK, the zipcode is not a zipcode, it's a postcode containing both letters and numbers.

I'd advise simply ~10 lines of variable-length strings, together with a separate field for a postcode (and be careful how you describe that to cope with national sensibilities). Let the user/customer decide how to write their addresses.

 
 
   
   
20
 
vote

Si necesita información completa sobre cómo otros países utilizan las direcciones postales, aquí hay un enlace de referencia muy bueno (Universidad de Columbia):

Frank's Compulsive Guide de las direcciones postales
DIRECCIÓN EFECTIVA PARA EL CORREO INTERNACIONAL

 

If you need comprehensive information about how other countries use postal addresses, here's a very good reference link (Columbia University):

Frank's Compulsive Guide to Postal Addresses
Effective Addressing for International Mail

 
 
17
 
vote

Definitivamente debe considerar almacenar el número de casa como un campo de caracteres en lugar de un número, debido a casos especiales, como "medios numeros", o mi dirección actual, que es algo así como "129a", pero el A es No se considera como un número de apartamento para servicios de entrega.

 

You should definitely consider storing house number as a character field rather than a number, because of special cases such as "half-numbers", or my current address, which is something like "129A" xe2x80x94 but the A is not considered as an apartment number for delivery services.

 
 
12
 
vote

He hecho esto (estructuras de dirección rigurosamente modelo en una base de datos), y nunca lo haría de nuevo. No se puede imaginar lo loca que son las excepciones que tendrá que tener en cuenta como regla.

Recuerdo vagamente algún problema con los códigos postales noruegos (creo), que eran las 4 posiciones, excepto Oslo, que tenía 18 años.

Estoy positivamente seguro de que desde el momento en que comenzamos a usar los códigos postales geográficamente correctos para todas nuestras propias direcciones nacionales, algunas personas comenzaron a quejarse que su correo llegó demasiado tarde. Resultó que aquellas personas vivían cerca de un límite entre las zonas posteriores, y a pesar del hecho de que alguien realmente vivía en el área postal, por ejemplo, en realidad, en realidad, su correo debe dirigirse al área postal 1610, porque en realidad fue la del área postal vecina. Eso realmente le sirvió, así que enviando su correo a su área postal correcta tomaría ese correo un par de días más en llegar, debido a la intervención no deseada que se requirió en la oficina postal correcta para reenviarla al área postal incorrecta ...

(Terminamos registrando a aquellas personas con una dirección en el extranjero en el país con el código ISO 'ZZ').

 

I've done this (rigorously model address structures in a database), and I would never do it again. You can't imagine how crazy the exceptions are that you'll have to take into account as a rule.

I vaguely recall some issue with Norwegian postal codes (I think), which were all 4 positions, except Oslo, which had 18 or so.

I'm positively sure that from the moment we started using the geographically correct ZIP codes for all of our own national addresses, quite a few people started complaining that their mail arrived too late. Turned out those people were living near a borderline between postal areas, and despite the fact that someone really lived in postal area, say, 1600, in reality his mail should be addressed to postal area 1610, because in reality it was that neighbouring postal area that actually served him, so sending his mail to his correct postal area would take that mail a couple of days longer to arrive, because of the unwanted intervention that was required in the correct postal office to forward it to the incorrect postal area ...

(We ended up registering those people with an address abroad in the country with ISO-code 'ZZ'.)

 
 
8
 
vote

A menos que vaya a hacer matemáticas en los números de la calle o los códigos postales / postal, solo está invitando al dolor futuro al almacenarlos como numéricos.

Puede ahorrar algunos bytes aquí y allá, y tal vez obtener un índice más rápido, pero ¿qué es lo que postal de los Estados Unidos, o cualquier otro país con el que está tratando, decida los alfas introducidos en los códigos?

El costo del espacio en disco va a ser mucho más barato que el costo de arreglarlo más tarde ... Y2K ¿Alguien?

 

Unless you are going to do maths on the street numbers or zip / postal codes, you are just inviting future pain by storing them as numerics.

You might save a few bytes here and there, and maybe get a faster index, but what do you when US postal, or whatever other country you are dealing with, decides the introduce alphas into the codes?

The cost of disk space is going to be a lot cheaper than the cost of fixing it later on... y2k anybody?

 
 
8
 
vote

Agregando a What @ Jonathan Leffler y @ Pablo Fisher ha dicho

Si alguna vez anticipa tener direcciones postales para Canadá o México agregadas a sus requisitos, almacenar postal-code como una cadena es una necesidad. Canadá tiene códigos postales alfanuméricos y no recuerdo lo que México se parece a la parte superior de mi cabeza.

 

Adding to what @Jonathan Leffler and @Paul Fisher have said

If you ever anticipate having postal addresses for Canada or Mexico added to your requirements, storing postal-code as a string is a must. Canada has alpha-numeric postal codes and I don't remember what Mexico's look like off the top of my head.

 
 
8
 
vote

Ciertamente debe consultar " ¿Es esta una buena manera de modelar la información de direcciones en una base de datos relacional ", pero su pregunta no es un duplicado directo de eso.

Seguramente hay muchas respuestas preexistentes (echa un vistazo a los modelos de datos de ejemplo en Databaseanwerswers , por ejemplo). Muchas de las respuestas preexistentes están defectuas en algunas circunstancias (sin elegir en las respuestas de DB).

Un problema importante a considerar es el alcance de las direcciones. Si su base de datos debe lidiar con las direcciones internacionales, debe ser más flexible que si solo tiene que lidiar con las direcciones en un país.

En mi opinión, es a menudo (que no significa siempre ) sensible para registrar la "imagen de la etiqueta de dirección" de la dirección y analizar por separado el contenido. Esto le permite lidiar con las diferencias entre la colocación de los códigos postales, por ejemplo, entre los diferentes países. Claro, puede escribir un analizador y un formateado que maneje las excentricidades de los diferentes países (por ejemplo, las direcciones de los EE. UU. Tienen 2 o 3 líneas; Por el contrario, las direcciones británicas pueden tener considerablemente más; una dirección que escribo a 9 líneas). Pero puede ser más fácil tener a los humanos el análisis y el formato y deje que los DBMS estén almacenando los datos.

 

You should certainly consult "Is this a good way to model address information in a relational database", but your question is not a direct duplicate of that.

There are surely a lot of pre-existing answers (check out the example data models at DatabaseAnswers, for example). Many of the pre-existing answers are defective under some circumstances (not picking on DB Answers at all).

One major issue to consider is the scope of the addresses. If your database must deal with international addresses, you have to be more flexible than if you only have to deal with addresses in one country.

In my view, it is often (which does not mean always) sensible to both record the 'address label image' of the address and separately analyze the content. This allows you to deal with differences between the placement of postal codes, for example, between different countries. Sure, you can write an analyzer and a formatter that handle the eccentricities of different countries (for instance, US addresses have 2 or 3 lines; by contrast, British addresses can have considerably more; one address I write to periodically has 9 lines). But it can be easier to have the humans do the analysis and formatting and let the DBMS just store the data.

 
 
7
 
vote

He encontrado que enumerando todos los campos posibles de la unidad discreta más pequeña a la más grande es la forma más fácil. Los usuarios completarán los campos que ven en forma. Mi mesa de direcciones se ve así:

  *********************************   Field              Type *********************************   address_id (PK)    int   unit               string   building           string           street             string   city               string   region             string   country            string   address_code       string *********************************   
 

Ive found that listing all possible fields from smallest discrete unit to largest is the easiest way. Users will fill in the fields they see fit. My address table looks like this:

*********************************   Field              Type *********************************   address_id (PK)    int   unit               string   building           string           street             string   city               string   region             string   country            string   address_code       string ********************************* 
 
 
   
   
3
 
vote

¿Dónde está el "intercambio" en el almacenamiento de la cremallera como un número o varchar? Eso es solo una opción: no es un intercambio a menos que haya beneficios para ambos y tenga que renunciar a algunos beneficios para obtener otros.

A menos que la suma de las cremalleras tenga algún significado en absoluto, las cremalleras como número no son útiles.

 

Where's the "trade off" in storing the ZIP as a NUMBER or VARCHAR? That's just a choice -- it's not a trade off unless there are benefits to both and you have to give up some benefits to get others.

Unless the sum of zips has any meaning at all, Zips as number is not useful.

 
 
         
         
2
 
vote

Esto podría ser una exageración, pero si necesita una solución que funcione con varios países y necesita procesar las partes de la dirección:

Puede tener un manejo de direcciones específicas de país con dos tablas: una tabla genérica con 10 columnas VarChar2, 10 columnas de números, otra tabla que asigna estos campos a las solicitudes y tiene una columna de país que ata una estructura de dirección a un país.

 

This might be an overkill, but if you need a solution that would work with multiple countries and you need to programmatically process parts of the address:

you could have country specific address handling using two tables: One generic table with 10 VARCHAR2 columns, 10 Number columns, another table which maps these fields to prompts and has a country column tying an address structure to a country.

 
 
 
 
1
 
vote

Si alguna vez tiene que verificar una dirección o usarla para procesar los pagos con tarjeta de crédito, al menos necesitará una pequeña estructura. Un bloque de texto de forma libre no funciona muy bien para eso.

Código postal es un campo opcional común para validar las transacciones de la tarjeta de pago sin usar toda la dirección. Así que tenga un campo separado y de tamaño generoso para eso (al menos 10 caracteres).

 

If you ever have to verify an address or use it to process credit card payments, you'll at least need a little structure. A free-form block of text does not work very well for that.

Zip code is a common optional field for validating payment card transactions without using the whole address. So have a separate and generously sized field for that (at least 10 chars).

 
 
1
 
vote

inspirado en Respuestas de la base de datos

  Line1 Line2 Line3 City Country_Province PostalCode CountryId OtherDetails   
 

Inspired by Database Answers

Line1 Line2 Line3 City Country_Province PostalCode CountryId OtherDetails 
 
 
-1
 
vote

Simplemente colocaría todos los campos juntos en un gran campo NVARCHAR (1000), con un elemento de texto de texto para que el usuario ingrese el valor para (a menos que desee realizar un análisis, por ejemplo, códigos postales). Todas esas direcciones 1, Dirección de la línea 2, etc. Las entradas son tan molestas si tiene una dirección que no encaja bien con ese formato (y, ya sabe, hay otros países que los EE. UU.).

 

I would just put all the fields together in a large NVARCHAR(1000) field, with a textarea element for the user to enter the value for (unless you want to perform analysis on eg. zip codes). All those address line 1, address line 2, etc. inputs are just so annoying if you have an address that doesn't fit well with that format (and, you know, there are other countries than the US).

 
 
         
         

Relacionados problema

1  Código POSTAL ERROR PAYPAL (PHP)  ( Postal code error paypal php ) 
Quiero integrar PayPal en mi sitio web con Asistente de integración de PayPal. Yo uso PayPal API y expressCheckout.php, PayPalFunctions.php generado por el as...

3  ¿Cómo utilizo los valores de longitud / latitud de manera eficiente en MySQL?  ( How do i utilise longitude latitude values efficiently in mysql ) 
Gracias a Wikileaks, en el Reino Unido que ahora pueden acceder a nuestro longitud y latitud coordenadas para cada código postal WikiLeaks Postcodes Reino Un...

0  Base de datos de suburbios del Reino Unido  ( Uk suburb database ) 
Esta no es una pregunta realmente técnica, pero se requiere para un sistema que estoy construyendo. Estoy después de una base de datos del Suburbio / Postcode...

213  ¿Cuál es el código postal definitivo y ZIP REGEX?  ( What is the ultimate postal code and zip regex ) 
Estoy buscando el código postal definitivo y el código postal REGEX. Estoy buscando algo que cubra la mayoría (con suerte, todos) del mundo. ...

2  Formateo de códigos postales del Reino Unido para el almacenamiento  ( Formatting uk postal codes for storage ) 
Quiero almacenar códigos postales del Reino Unido en la base de datos. ¿Está bien almacenar esos códigos postales sin los espacios? ...

0  Consulta MySQL para que coincida con los códigos postales del Reino Unido independientemente del número de espacios  ( Mysql query to match uk postcodes regardless of the number of spaces ) 
Tengo la tabla más sencilla del mundo, por buscar valores de Lat / LNG para un código postal del Reino Unido (cargado con datos de código postal completo en e...

3  Reino Unido Royal Mail PAF Dirección Finder vía alternativas de código postal? [cerrado]  ( Uk royal mail paf address finder via postcode alternatives ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

196  Regex para coincidir los códigos postales del Reino Unido  ( Regex for matching uk postcodes ) 
Estoy después de una regularidad que validará un código postal complejo complejo en el Reino Unido solo dentro de una cadena de entrada. Todos los formularios...

3  WebRequest: Cómo encontrar un código postal usando un webrequest contra este contenidoType = "Aplicación / XHTML + XML, texto / XML, texto / HTML; Charset = UTF-8 "?  ( Webrequest how to find a postal code using a webrequest against this contenttyp ) 
Publicado por primera vez esto: httpwebrequest: ¿Cómo encontrar un código postal en Canadá Publicar a través de un webRequest con X-www-formulario-adjunto? ....

0  Cálculo de la distancia del código postal  ( Postcode distance calculation ) 
Acabo de estar desarrollando una calculadora de distancia postal para My Dads Company, donde todos nuestros clientes se mantienen archivados y cada vez que un...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos