Existem boas referências de melhores práticas para armazenar endereços postais em um RDBMS? Parece que há muitas compensações que podem ser feitas e muitos prós e contras para cada um a ser avaliado - certamente isso já foi feito repetidas vezes? Talvez alguém tenha pelo menos escrito algumas lições aprendidas em algum lugar?
Exemplos das vantagens e desvantagens de que estou falando são armazenar o CEP como um número inteiro versus um campo char, se o número da casa for armazenado como um campo separado ou parte da linha de endereço 1, se os números de suíte / apartamento / etc forem normalizados ou apenas armazenados como um pedaço de texto na linha de endereço 2, como você lida com zip +4 (campos separados ou um campo grande, inteiro vs texto)? etc.
Estou principalmente preocupado com os endereços dos EUA neste momento, mas imagino que haja algumas práticas recomendadas em relação à preparação para a eventualidade de se tornar global também (por exemplo, nomear campos apropriadamente como região em vez de estado ou código postal em vez de código postal, etc.
Respostas:
Para um uso mais internacional, um esquema a ser considerado é o usado pelo Drupal Address Field . É baseado no padrão xNAL e parece cobrir a maioria dos casos internacionais. Um pouco de aprofundamento nesse módulo revelará algumas belas pérolas para interpretar e validar endereços internacionalmente. Ele também tem um bom conjunto de áreas administrativas (província, estado, oblast, etc) com códigos ISO.
Esta é a essência do esquema, copiado da página do módulo:
Uma lição que aprendi:
locality
&thoroughfare
.fonte
Como um usuário 'internacional', não há nada mais frustrante do que lidar com um site voltado apenas para endereços no formato dos EUA. É um pouco rude no início, mas se torna um problema sério quando a validação também é excessivamente zelosa.
Se você está preocupado em se tornar global, o único conselho que tenho é para manter a forma livre. Diferentes países têm diferentes convenções - em alguns, o número da casa vem antes do nome da rua, em alguns, vem depois. Alguns têm estados, algumas regiões, alguns condados, algumas combinações desses. Aqui no Reino Unido, o código postal não é um código postal, é um código postal que contém letras e números.
Aconselharia simplesmente ~ 10 linhas de strings de comprimento variável, junto com um campo separado para um código postal (e seja cuidadoso como você descreve isso para lidar com as sensibilidades nacionais). Deixe o usuário / cliente decidir como escrever seus endereços.
fonte
Se você precisar de informações abrangentes sobre como outros países usam endereços postais, aqui está um link de referência muito bom (Universidade de Columbia):
Guia Compulsivo de Frank para Endereçamento Eficaz de Endereços Postais
para Correio Internacional
fonte
Definitivamente, você deve considerar armazenar o número da casa como um campo de caractere em vez de um número, por causa de casos especiais como "meios-números" ou meu endereço atual, que é algo como "129A" - mas o A não é considerado um apartamento número para serviços de entrega.
fonte
Eu fiz isso (modelar estruturas de endereço rigorosamente em um banco de dados) e nunca faria isso novamente. Você não pode imaginar como são loucas as exceções que você terá que levar em consideração como regra.
Lembro-me vagamente de algum problema com os códigos postais noruegueses (eu acho), que eram todas as 4 posições, exceto Oslo, que tinha 18 ou mais.
Tenho certeza absoluta de que, a partir do momento em que começamos a usar os CEPs geograficamente corretos para todos os nossos endereços nacionais, algumas pessoas começaram a reclamar de que suas correspondências chegaram tarde demais. Acontece que essas pessoas viviam perto de uma fronteira entre áreas postais e, apesar do fato de alguém realmente viver na área postal, digamos, 1600, na realidade sua correspondência deveria ser enviada para a área postal 1610, porque na realidade era aquela área postal vizinha que realmente o serviu, então enviar sua correspondência para a área postal correta demoraria alguns dias a mais para chegar, por causa da intervenção indesejada que foi necessária na estação postal correta para encaminhá-la para a área postal incorreta ...
(Acabamos cadastrando aquelas pessoas com endereço no exterior no país com o código ISO 'ZZ'.)
fonte
Você certamente deve consultar " Esta é uma boa maneira de modelar informações de endereço em um banco de dados relacional ", mas sua pergunta não é uma duplicata direta disso.
Certamente há muitas respostas pré-existentes (verifique os exemplos de modelos de dados em DatabaseAnswers , por exemplo). Muitas das respostas pré-existentes são defeituosas em algumas circunstâncias (não escolhendo respostas do banco de dados de forma alguma).
Uma questão importante a considerar é o escopo dos endereços. Se o seu banco de dados deve lidar com endereços internacionais, você deve ser mais flexível do que se só tivesse que lidar com endereços em um país.
Na minha opinião, é frequentemente (o que não significa sempre ) sensato registar a 'imagem da etiqueta de endereço' do endereço e analisar separadamente o conteúdo. Isso permite que você lide com as diferenças entre a colocação de códigos postais, por exemplo, entre diferentes países. Claro, você pode escrever um analisador e um formatador que lida com as excentricidades de diferentes países (por exemplo, os endereços dos EUA têm 2 ou 3 linhas; em contraste, os endereços britânicos podem ter consideravelmente mais; um endereço para o qual escrevo periodicamente tem 9 linhas). Mas pode ser mais fácil fazer com que os humanos façam a análise e a formatação e deixar o DBMS apenas armazenar os dados.
fonte
A menos que você vá fazer matemática sobre os números das ruas ou códigos postais / postais, você está apenas convidando a dor futura ao armazená-los como números.
Você pode economizar alguns bytes aqui e ali, e talvez obter um índice mais rápido, mas o que você faz quando a US postal, ou qualquer outro país com o qual você está lidando, decide a introdução de alfas nos códigos?
O custo do espaço em disco vai ser muito mais barato do que o custo de consertá-lo mais tarde ... y2k, alguém?
fonte
Adicionando ao que @ Jonathan Leffler e @ Paul Fisher disseram
Se você já previu a adição de endereços postais do Canadá ou do México aos seus requisitos, o armazenamento
postal-code
como string é obrigatório. O Canadá tem códigos postais alfanuméricos e não me lembro como eram os do México na minha cabeça.fonte
Eu descobri que listar todos os campos possíveis, da menor unidade discreta à maior, é a maneira mais fácil. Os usuários preencherão os campos que considerarem adequados. Minha tabela de endereços é parecida com esta:
fonte
Onde está a "troca" em armazenar o ZIP como um NÚMERO ou VARCHAR? Isso é apenas uma escolha - não é uma troca, a menos que haja benefícios para ambos e você tenha que abrir mão de alguns benefícios para obter outros.
A menos que a soma dos zips tenha algum significado, Zips como número não é útil.
fonte
Isso pode ser um exagero, mas se você precisar de uma solução que funcione com vários países e precisar processar programaticamente partes do endereço:
você poderia ter tratamento de endereço específico de país usando duas tabelas: uma tabela genérica com 10 colunas VARCHAR2, 10 colunas de número, outra tabela que mapeia esses campos para prompts e tem uma coluna de país que vincula uma estrutura de endereço a um país.
fonte
Se alguma vez você tiver que verificar um endereço ou usá-lo para processar pagamentos com cartão de crédito, precisará de pelo menos um pouco de estrutura. Um bloco de texto de formato livre não funciona muito bem para isso.
O código postal é um campo opcional comum para validar transações de cartão de pagamento sem usar o endereço completo. Portanto, tenha um campo separado e de tamanho generoso para isso (pelo menos 10 caracteres).
fonte
Inspirado por respostas de banco de dados
fonte
Gostaria apenas de colocar todos os campos juntos em um grande campo NVARCHAR (1000), com um elemento textarea para o usuário inserir o valor (a menos que você queira realizar análises em, por exemplo, códigos postais). Todas essas entradas de linha de endereço 1, linha de endereço 2, etc. são muito irritantes se você tiver um endereço que não se encaixa bem nesse formato (e, você sabe, há outros países além dos EUA).
fonte