database - ps4 - cual es el codigo postal de estados unidos
¿Es una buena idea usar una columna entera para almacenar códigos postales de EE. UU. En una base de datos? (11)
¿Alguna vez va a almacenar códigos postales no estadounidenses? Canadá tiene 6 caracteres con algunas letras. Usualmente solo uso un campo de 10 caracteres. El espacio en disco es barato, tener que volver a trabajar su modelo de datos no lo es.
A primera vista, parece que tengo dos opciones básicas para almacenar códigos postales en una tabla de base de datos:
- Texto (probablemente el más común), es decir,
char(5)
ovarchar(9)
para admitir extensión +4 - Numérico, es decir, entero de 32 bits
Ambos cumplirían los requisitos de los datos, si asumimos que no existen preocupaciones internacionales. En el pasado, en general, solo hemos seguido la ruta del texto, pero me preguntaba si alguien hace lo contrario. Solo por una breve comparación, parece que el método entero tiene dos ventajas claras:
- Es, por su propia naturaleza, limitado automáticamente a los numéricos solamente (mientras que sin validación, el estilo de texto podría almacenar letras y las que, hasta donde sepa, no son válidas en un código postal). ¡Esto no significa que pudiéramos / quisiera / deberíamos renunciar a validar la entrada del usuario como normal, sin embargo!
- Se necesita menos espacio, con 4 bytes (que debería ser suficiente incluso para códigos postales de 9 dígitos) en lugar de 5 o 9 bytes.
Además, parece que no perjudicaría mucho la salida de la pantalla. Es trivial dar un ToString()
a ToString()
en un valor numérico, usar la manipulación simple de cadenas para insertar un guión o espacio o lo que sea para la extensión +4, y usar el formato de cadenas para restaurar ceros a la izquierda.
¿Hay algo que desalentaría el uso de int
como un tipo de datos para los códigos postales de solo EE. UU.?
A menos que tenga un requisito comercial para realizar cálculos matemáticos en los datos del código postal, no tiene sentido utilizar un INT. Estás sobre ingeniería.
Espero que esto ayude,
Cuenta
Desde un punto de vista técnico, algunos puntos planteados aquí son bastante triviales. Trabajo con la limpieza de datos de direcciones a diario , en particular, la limpieza de datos de direcciones de todo el mundo. No es una tarea trivial por ningún tramo de la imaginación. Cuando se trata de códigos postales, puede almacenarlos como un entero, aunque puede no ser "semánticamente" correcto. El hecho es que los datos son de forma numérica, ya sea que, estrictamente hablando, se considere de valor numérico.
Sin embargo, el verdadero inconveniente de almacenarlos como tipos numéricos es que perderá la capacidad de ver fácilmente si los datos se ingresaron incorrectamente (es decir, tiene valores faltantes) o si el sistema eliminó ceros iniciales que conducen a costosas operaciones para validar potencialmente no válido códigos postales que de otra manera eran correctos.
También es muy difícil obligar al usuario a ingresar los datos correctos si una de las repercusiones es una demora en el negocio. Los usuarios a menudo no tienen la paciencia para ingresar datos correctos si no es inmediatamente obvio. Usar una expresión regular es una forma de garantizar los datos correctos; sin embargo, si el usuario ingresa un valor que no se ajusta y se muestra un error, puede omitir este valor por completo o introducir algo que se ajuste, pero que de lo contrario es incorrecto. Un ejemplo [usando códigos postales canadienses] es que a menudo ve A0A 0A0 ingresado que no es válido, pero se ajusta a la expresión regular para códigos postales canadienses. En la mayoría de los casos, esto lo ingresan los usuarios que se ven obligados a proporcionar un código postal, pero o bien no saben qué es o no lo tienen todo correcto.
Una sugerencia es validar la totalidad de la entrada como una unidad que valida que el código postal sea correcto en comparación con el resto de la dirección. Si es incorrecto, ofrecer códigos postales válidos alternativos para la dirección les facilitará la entrada de datos válidos. Del mismo modo, si el código postal es correcto para la dirección de la calle, pero el número de calle queda fuera del dominio de ese código postal, entonces ofrezca números de calle alternativos para esa combinación de código postal / calle.
El código postal es realmente un espacio de nombres codificado, si lo piensas bien. Tradicionalmente, los dígitos, pero también un guión y mayúsculas:
"10022-SHOE"
http://www.saksfifthavenue.com/main/10022-shoe.jsp
Siendo realistas, muchas aplicaciones comerciales no necesitarán soportar este caso extremo, incluso si es válido.
El entero es bueno, pero solo funciona en los EE. UU., Por lo que la mayoría de las personas no lo hace. Usualmente uso un varchar (20) más o menos. Probablemente exagerado para cualquier localidad.
No porque
- Nunca haces funciones matemáticas en el código postal
- Podría contener guiones
- Podría comenzar con 0
- Los valores NULL a veces se interpretan como cero en el caso de tipos escalares como entero (por ejemplo, cuando se exportan los datos de alguna manera)
- El código postal, incluso si es un número, es una designación de un área, lo que significa que es un nombre en lugar de una cantidad numérica de cualquier cosa
Normalmente, utilizaría un tipo de datos no numérico, como varchar, que permitiría más tipos de código postal. Si está completamente configurado para solo permitir códigos postales de 5 dígitos [XXXXX] o 9 dígitos [XXXXX-XXXX], podría usar un char (5) o un char (10), pero no lo recomendaría. Varchar es la opción más segura y más sana.
Editar: También debe tenerse en cuenta que si no planea hacer cálculos numéricos en el campo, no debe usar un tipo de datos numéricos. El código postal no es un número en el sentido de que lo agregue o reste. Es solo una cadena que suele estar formada por números, por lo que debe abstenerse de utilizar tipos de datos numéricos para ello.
Si tuviera que usar un número entero para US Zips, debería multiplicar la parte inicial por 10,000 y agregar el +4. La codificación en la base de datos no tiene nada que ver con la validación de entrada. Siempre puede exigir que la entrada sea válida o no, pero el almacenamiento es cuestión de cuánto cree que cambiarán sus requisitos o el USPS. (Sugerencia: sus requisitos cambiarán)
Un código postal numérico es, en una pequeña medida, engañoso.
Los números deben significar algo numérico . Los códigos postales no agregan ni sustraen ni participan en ninguna operación numérica. 12309 - 12345 no calcula la distancia desde el centro de Schenectady a mi vecindario.
De acuerdo, para los códigos postales, nadie está confundido. Sin embargo, para otros campos similares a números, puede ser confuso.
Como los códigos postales no son números, simplemente están codificados con un alfabeto restringido, sugiero evitar un campo numérico. El ahorro de 1 byte no vale mucho. Y creo que ese significado es más importante que el byte.
Editar .
"En cuanto a los ceros a la izquierda ..." es mi punto. Los números no tienen ceros a la izquierda. La presencia de ceros iniciales significativos en los códigos postales es otra prueba más de que no son numéricos.
Use una cadena con validación Los códigos postales pueden comenzar con 0, por lo que el numérico no es un tipo adecuado. Además, esto se aplica claramente a los códigos postales internacionales (por ejemplo, Reino Unido, que tiene hasta 8 caracteres). En el caso improbable de que los códigos postales sean un cuello de botella, puede limitarlo a 10 caracteres, pero primero revise sus formatos de destino .
Aquí hay expresiones regulares de validación para el Reino Unido, EE. UU. Y Canadá.
Sí, puedes hacer pad para recuperar los ceros iniciales. Sin embargo, estás arrojando teóricamente información que podría ayudar en caso de errores. Si alguien encuentra 1235 en la base de datos, ¿es originalmente 01235, o se ha perdido otro dígito?
La mejor práctica dice que debes decir lo que quieres decir. Un código postal es un código, no un número. ¿Vas a add/subtract/multiply/divide códigos postales? Y desde una perspectiva práctica, es mucho más importante que excluyas las cremalleras extendidas.
Aprendí recientemente que en Ruby, una de las razones por las que querría evitar esto es porque hay algunos códigos postales que comienzan con ceros a la izquierda, que, si se almacenan como enteros, se convertirán automáticamente a octal.
De los documentos :
Puede usar un prefijo especial para escribir números en formato decimal, hexadecimal, octal o binario. Para números decimales use un prefijo de 0d, para números hexadecimales use un prefijo de 0x, para números octales use un prefijo de 0 o 0o ...