Melhores práticas para armazenamento de endereços consistente e abrangente em um banco de dados [fechado]

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Existem práticas recomendadas (ou mesmo padrões) para armazenar endereços de forma consistente e abrangente em um banco de dados?

Para ser mais específico, acredito que nesta fase existem dois casos para armazenamento de endereços:

  • basta associar um endereço a uma pessoa, um edifício ou qualquer item (o caso mais comum).Então, uma tabela plana com colunas de texto (endereço1, endereço2, CEP, cidade) provavelmente será suficiente.Este não é o caso que me interessa.
  • você deseja executar estatísticas sobre seus endereços:quantos itens em uma rua específica, ou cidade ou...Então você deseja evitar erros ortográficos de qualquer tipo e garantir a consistência.Minha pergunta é sobre as melhores práticas neste caso específico:quais são as melhores maneiras de modelar um banco de dados de endereços consistente?

Um projeto/solução específico para cada país seria um excelente começo.

RESPONDER :Parece que ainda não existe uma resposta perfeita para esta pergunta, mas:

  • xAL, como sugerido por Hank, é a coisa mais próxima de um padrão global que surgiu.Parece ser um exagero, e não tenho certeza se muitas pessoas gostariam de implementá-lo em seu banco de dados ...
  • Para iniciar o seu próprio design (para um país específico), Link de Dave para o União Postal Universal (UPU) é um excelente ponto de partida.
  • Quanto à França, existe uma norma (não oficial, mas padrão de facto) para endereços, que leva o lindo nome de AFNOR XP Z10-011 (somente em francês) e deve ser pago.O UPU a descrição para a França é baseada nesta norma.
  • Acontece que encontrei a norma equivalente para a Suécia: SS613401.
  • A nível europeu, algum esforço tem sido feito, resultando na norma EN 14142-1.Pode ser obtido através Membros nacionais do CEN.
Foi útil?

Solução

Eu usaria um Address tabela, como você sugeriu, e eu basearia -o nos dados rastreados por xal.

Outras dicas

Eu tenho pensado sobre isso também. Aqui estão meus pensamentos soltos até agora, e estou me perguntando o que as outras pessoas pensam.

Xal (e sua irmã que inclui nomes pessoais, XNal) é usada pelos serviços de geocodificação do Google e do Yahoo, dando um pouco de peso. Mas como o mesmo endereço pode ser descrito em Xal de muitas maneiras diferentes-algumas mais específicas que outras-, não vejo como o próprio Xal é um formato aceitável para o armazenamento de dados. Alguns de seus nomes de campo podem ser usados, no entanto, mas, na realidade, o único formato básico que pode ser usado entre os 16 países para os quais minha empresa é enviada é a seguinte:


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
}

Isso é fácil o suficiente para mapear em uma única tabela de banco de dados, apenas permitindo nulas na maioria das colunas. E parece que é assim que a Amazon e muitas organizações armazenam dados de endereços. Portanto, a pergunta que resta é como devo modelar isso em um modelo de objeto que é facilmente usado pelos programadores e por qualquer código da GUI. Temos uma base Address digite com subclasses para cada tipo de endereço, como AmericanAddress, CanadianAddress, GermanAddress, e assim por diante? Cada um desses tipos de endereço saberia como se formatar e, opcionalmente, saberia um pouco sobre a validação dos campos.

Eles também poderiam retornar algum tipo de metadados sobre cada um dos campos, como a seguinte estrutura de dados pseudocode:


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 fato, em vez de ter objetos individuais de endereço para cada país, poderíamos adotar a abordagem um pouco menos orientada a objetos de ter um Address objeto que evita propriedades .NET e usa um AddressStrategy Para determinar as regras de formatação e validação:


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

Ao definir um campo, isso Address objeto invocaria o método apropriado em seu interno AddressStrategy objeto.

A razão para usar um SetField() A abordagem do método, em vez de propriedades com getters e setters, é para que seja mais fácil para o código definir esses campos de maneira genérica sem recorrer a instruções de reflexão ou alternar.

Você pode imaginar o processo indo algo assim:

  1. O código da GUI chama um método de fábrica ou algo para criar um endereço com base em um país. (O suspensão do país, então, é a primeira coisa que o cliente seleciona ou tem um bom palpite pré-selecionado para eles com base nas informações da cultura ou no endereço IP.)
  2. GUI liga address.GetMetadata() ou um método semelhante e recebe uma lista do AddressFieldMetadata estruturas como descrito acima. Pode usar este metadados para determinar quais campos exibir (ignorando aqueles com is-applicable definido como false), o que rotular esses campos (usando o field-name membro), exiba esses campos em uma ordem específica e execute a validação superficial e no nível da apresentação nesses dados (usando o is-required, validation-regex, e allowed-values membros).
  3. A GUI liga para o address.SetField() método usando o field-number (que corresponde à enumeração acima) e seus valores dados. o Address O objeto ou sua estratégia podem realizar alguma validação avançada de endereços nesses campos, invocar a limpeza de endereços etc.

Pode haver pequenas variações acima se quisermos fazer o Address O próprio objeto se comporta como um objeto imutável depois de criado. (O que provavelmente tentarei fazer, já que o Address O objeto é realmente mais parecido com uma estrutura de dados e provavelmente nunca terá nenhum comportamento verdadeiro associado a si mesmo.)

Algum disso faz sentido? Estou afastando muito do caminho da OOP? Para mim, isso representa um compromisso bastante sensato entre ser tão abstrato que a implementação é quase impossível (XAL), versus ser estritamente tendenciosa nos EUA.


Atualizar 2 anos depois: Acabei com um sistema semelhante a este e escrevi sobre ele em Meu blog extinto.

Sinto que esta solução é o equilíbrio certo entre dados herdados e armazenamento de dados relacionais, pelo menos para o mundo do comércio eletrônico.

No Reino Unido, há um produto chamado PAF do Royal Mail

Isso oferece uma chave única por endereço - há aros para pular.

Eu basicamente vejo 2 opções se você quiser consistência:

  1. Limpeza de dados
  2. Tabela de dados básica Look Ups

AD 1. Trabalho com o sistema SAS, e o SAS Institute oferece uma ferramenta para limpeza de dados - isso basicamente executa algumas verificações e validações em seus dados e sugere que "Abram Lincoln Road" e "Abraham Lincoln Road" sejam mesclados no mesmo rua. Eu também acho que se baseia em bases de dados nacionais contendo correspondências de código-postal da cidade e assim por diante.

Anúncio 2. Você cria uma lista de múltiplas opções (ou seja, dados básicos) e as pessoas que adicionam novas entradas escolhem de entradas existentes em seus dados básicos. Na sua tabela de fatos, você armazena as chaves dos nomes das ruas em vez dos nomes das ruas. Se você detectar um erro de ortografia, basta corrigi -lo em seus dados básicos e todas as instâncias serão corrigidas com ele, através da relação chave.

Observe que essas opções não se descartam, você pode usar as duas abordagens ao mesmo tempo.

As autoridades sobre a forma como os endereços são construídos são geralmente os serviços postais, por isso, para começar, examinaria os elementos de dados utilizados pelos serviços postais para os principais mercados em que operam.

Consulte o site da União Postal Universal para obter informações muito específicas e detalhadas sobre formatos de endereços postais internacionais:http://www.upu.int/post_code/en/postal_addressing_systems_member_countries.shtml

"Xal é a coisa mais próxima de um padrão global que apareceu. Parece ser um exagero, e não tenho certeza de que muitas pessoas gostariam de implementá -lo em seu banco de dados ..."

Este não é um argumento relevante. A implementação de endereços não é uma tarefa trivial se o sistema precisar ser "abrangente e consistente" (ou seja, em todo o mundo). A implementação desse padrão é realmente demorada, mas para atender ao requisito especificado, no entanto, obrigatório.

Normalize seu esquema de banco de dados e você terá a estrutura perfeita para a consistência correta. E é por isso:http://weblogs.sqtteam.com/mladenp/archive/2008/09/17/normalization-for-databases-is-tike-dependency-injection-for-code.aspx

Eu perguntei algo bastante semelhante antes: Informações de contato dinâmico Dados/padrão de design: isso é de alguma forma viável?.

A resposta curta: armazenar Adderres ou qualquer tipo de informação de contato em um banco de dados é complexa. O link Extendível Endereço (XAL) acima tem algumas informações interessantes que são as mais próximas de uma prática padrão/recomendada que eu vi ...

NOS eua, eu sugiro escolher um Nacional de Mudança de Endereço do fabricante e do modelo da base de dados após o que eles retornam.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top