Quais problemas são resolvidos dividindo os endereços em colunas individuais?

24

Temos uma equipe que cria as tabelas e relações para desenvolvedores de software. Em nossa organização, eles são bastante rigorosos quanto ao cumprimento da normalização da 3NF - com a qual, honestamente, concordo com o tamanho da nossa organização e como as necessidades ou nossos clientes mudam ao longo do tempo. Há apenas uma área em que não estou claro sobre os motivos por trás de sua decisão de design: endereços.

Enquanto isso se concentra principalmente nos endereços nos Estados Unidos, acho que isso pode se aplicar a qualquer país que faça isso. Cada parte de um endereço recebe sua própria coluna na tabela de endereços. Por exemplo, considere este endereço gnarly dos EUA:

Attn: Jane Doe
485 1/2 N Smith St SW, APT 300B
Chicago, IL 11111-2222

Seria dividido no banco de dados como este:

  • Rua: 485
  • Fração da rua: 1/2
  • Rua pré-direcional: N (norte)
  • Nome da rua: Smith
  • Tipo de rua: ST (rua)
  • Rua pós-direcional: SW (sudoeste)
  • Cidade: Chicago
  • Estado: IL (Illinois)
  • Código Postal: 11111
  • Código Postal: 2222
  • País (supostamente EUA)
  • Atenção: Jane Doe
  • Caixa postal: NULL
  • Tipo de habitação: APT (Apartamento)
  • Número da habitação: 300B

E haveria algumas outras colunas relacionadas a rotas rurais e rotas de contrato. Além disso, nosso aplicativo específico provavelmente terá alguns endereços internacionais. Os modeladores de dados disseram que adicionariam colunas específicas para endereços internacionais, que seriam os campos normais da linha 1, linha 2.

No começo eu pensei que isso era muito exagerado. Pesquisando on-line repetidamente refere-se ao uso das linhas de endereço 1, 2, 3 e possivelmente 4, e depois dividindo a cidade, região e código postal. Temos um caso de uso para o nosso novo aplicativo em que essa granularidade é benéfica. Temos que validar que o usuário não está criando um negócio duplicado e verificar o endereço é uma das validações. Nós podemos fazê-lo funcionar com a linha de endereço 1 e 2, mas seria mais difícil.

Quanto à nossa aplicação específica, precisamos armazenar vários tipos de endereços para empresas e pessoas (físico, correspondência, remessa etc.). Nós pode precisar gerar imprimíveis cartas de formulário, mas esta exigência não foi discutido até agora.

Outras coisas que os aplicativos da nossa organização precisam oferecer suporte:

  • Auditoria (com tabelas completas do histórico)
  • Impressão de etiquetas de endereçamento
  • Gerando formulários impressos
  • Relatórios (para governos nacionais e regionais)

Embora nosso aplicativo possa não estar fazendo tudo o que todos os outros aplicativos estão fazendo, dividir endereços em vários componentes é um padrão corporativo em que trabalho. Independentemente de nosso aplicativo se beneficiar, somos forçados a fazer isso.

Pergunta Semi-relacionada do StackOverflow: Onde está um bom Analisador de Endereços que foi fechado, mas ilustra como os endereços de análise podem ser difíceis.

Para que eu possa entender melhor sua decisão de design e vender nosso cliente sobre a ideia ...

Quais problemas são resolvidos dividindo o endereço em colunas individuais?

Pontos de bônus para quem implementou um sistema como esse, porque eles tiveram problemas.

Greg Burghardt
fonte
11
E lembre-se de que alguns endereços ainda não se encaixam no seu modelo - vi alguns endereços reais nas linhas "abaixo da rua da fábrica de cimento" dos países em desenvolvimento.
duskwuff
11
@duskwuff: Eu trouxe isso até eles e é por isso que eles adicionam os "campos de endereços internacionais" - linha_1, linha_2, linha_3. Eles realmente querem apenas dividir os endereços nos EUA. E para ser justo,> 90% dos endereços nesses aplicativos são endereços nos EUA. Mas eu entendo totalmente de onde você é .
Greg Burghardt 28/03

Respostas:

10

Os problemas que podem ser resolvidos dividindo-se incluem

Validação Qualquer parte do nome pode ser comparada a uma lista principal. Aqueles que não coincidem podem ser rejeitados. Código postal / CEP é um exemplo óbvio. Estes são emitidos e mantidos por uma autoridade independente. Os únicos válidos são aqueles emitidos por essa autoridade.

Classificação e seleção Já vi casos em que as tarifas postais são reduzidas se o correio for entregue ao serviço de entrega já organizado em certa medida. Ter as colunas correspondentes produz um valor comercial tangível.

Análise Pode ser útil saber para onde seus pedidos estão indo, de uma maneira geograficamente hierárquica. Isso pode impulsionar iniciativas de vendas, desenvolvimento de produtos ou pagamentos de comissões, etc.

Duplicação de código Ao fazer com que todos os aplicativos em uma organização adotem o mesmo modelo de dados (o do consumidor mais complexo), uma única base de código pode ser adotada em toda a empresa e mantida de forma consistente. A divisão de cabelo duplicada sem fim pode ser evitada ou, pelo menos, delegada às cabeças de hélice. Os endereços mantidos por diferentes partes da organização podem ser atualizados consistentemente. O atendimento e a satisfação do cliente podem ser aumentados. O esforço de desenvolvimento pode se concentrar nas partes únicas e de alto valor de um sistema.

Questões legais leis e os impostos variam de acordo com a jurisdição. Ao capturar os valores detalhados do endereço separadamente, é mais fácil fazer referência cruzada dos dados transacionais aos requisitos de conformidade.

Duplicação É simples falsificar endereços mantidos como texto movendo um elemento para a próxima linha ou reequilibrando algumas partes. Endereços totalmente analisados ​​são mais fáceis de comparar. Isso pode ser um simples problema de qualidade de dados ou pode ter implicações de conformidade ou crédito se, por exemplo, várias empresas shell fizerem grandes pedidos no mesmo endereço de entrega ou se um cartão de crédito for usado para entregar em vários locais dispersos em um curto período.

Formatação As peças mantidas separadamente podem ser combinadas da maneira que melhor se adequar às necessidades atuais. Se, por exemplo, etiquetas longas e com impressão fina ficarem baratas, você poderá reformatar para usá-las.

Obviamente, nada disso pode se aplicar a qualquer aplicação específica. Dados desse tipo são muito mais fáceis de analisar e validar na fonte, quando coletados, do que nunca em análises posteriores. Portanto, mesmo que a YAGNI seja melhor colocar o esforço extra na frente por pouco custo e uma economia potencial grande e futura.

Finalmente, eu não descartaria o fator humano. O modelo de dados é produzido por modeladores de dados. É o que eles fazem. Essa é a profissão deles. Eles não vão dizer para você simplesmente despejar em um BLOB, não é?

Michael Green
fonte
3
Eu acho que essa é uma resposta muito subestimada. A maioria das respostas aborda os muitos problemas que podem surgir da divisão de endereços em colunas, mas acho que essa resposta faz o melhor trabalho de resumir os problemas resolvidos. Eu poderia postar uma pergunta semelhante perguntando sobre os problemas introduzidos. Toda solução tem vantagens e desvantagens. Sua resposta aborda os melhores benefícios.
Greg Burghardt
17

Passei 7 anos desenvolvendo software para uma editora e um dos problemas mais difíceis que já enfrentamos foi analisar os endereços nas listas de assinaturas. É útil dividir endereços em campos distintos, mas você nunca pode, NUNCA projetar, para todas as aberrações patológicas possíveis de formatos e componentes de endereços que o cérebro humano possa conceber.

Toda localidade pode ter suas peculiaridades, e isso é apenas nos EUA. Lance em outros países e as coisas ficam incontroláveis ​​muito rapidamente para qualquer abordagem que queira analisar todos os endereços. Apenas dois exemplos:

Na Espanha, o número da rua sempre vem após o nome da rua e uma vírgula, e muitos endereços contêm um número de andar ordinal, como 1 ° ou 3ª, juntamente com abreviações para "left" ("Izda", que significa porta à esquerda após você sobe as escadas), "certo" ("Dcha") ou outras possibilidades. Agora multiplique essa peculiaridade pelo número de diferentes países e áreas com diferentes costumes históricos para endereços ... (Japão? Inglaterra rural? Coréia? China?)

Em Portland, OR, existem eixos NS e EW que dividem a cidade em quadrantes NW, NE, SW e SE (assim como um N "quadrante", mas discordo). As ruas NS são numeradas incrementalmente a leste e oeste a partir deste eixo, e os endereços nas ruas EW são ditados pelo número da rua NS como sendo o "cem quarteirões" do número (ou seja, uma casa em uma rua EW entre as avenidas 11 e 12 teria um número como 1123). Material bastante padrão para endereços nos EUA.

De vez em quando você topar com um endereço de Portland como 0205 SW Nebraska St . Um zero à esquerda? WTF? Lá se vai minha integercoluna para o número da casa.

Quando a grade foi montada, o eixo NS foi definido pelo rio Willamette. Tudo a leste do rio era NE ou SE, e oeste do rio NW ou SW. À medida que a cidade crescia para o sul, eles se deparavam com o inconveniente fato de que o rio serpenteia para o leste. Assim, ao projetar o eixo sul, você tem essa área problemática que fica no lado "oeste" do rio, mas a leste do eixo. A solução foi adicionar um zero à esquerda, com efeito um sinal de menos , com os números aumentando para o leste a partir da linha do eixo.

Se eu fosse você, perderia a esperança de projetar o sistema definitivo. Você não pode cobrir todas as possibilidades, e novas serão criadas à medida que a humanidade avançar para terras anteriormente não desenvolvidas.

Para endereços nos EUA, dê uma olhada no que o USPS já fez na padronização de endereços e lembre-se de criar a house_numbercoluna a varchar. Enquanto você está nisso descobrir como você está indo para analisar 1.634 EN Fort pista Ave .

Para o resto do mundo, eu provavelmente tentaria abstrair campos adicionais para cobrir 80-90% do que provavelmente virá e fornecer um conjunto de campos não interpretados que podem lidar com todo o resto quando necessário. Ou seja, se o seu analisador falhar ao manipular um endereço, salve-o sem análise e sinalize como tal. Se você conseguir analisar um endereço, lembre-se da ordem em que encontrou os vários campos para poder montá-lo novamente em algo que possa ser entregue.

Eu diria que o campo mais importante será o código postal, mas mesmo isso não é um dado em muitos lugares.

Boa sorte. Esse pode ser um empreendimento divertido e extremamente frustrante, mas a chave para a sanidade é saber quando parar de tentar e apenas armazenar a entrada não analisada ou parcialmente analisada com a entrada original como backup.

Jim Garrison
fonte
Follow interessante para zeros à esquerda em números de rua: O número do elemento HTML INPUT vai postar zeros à esquerda de volta ao servidor: <input type="number">. Eu temia que não (pelo menos no Firefox).
Greg Burghardt 29/03
Então, por que é útil dividir? Que tal apenas fornecer três "linhas" de string para o endereço?
usr
E há também o padrão 137 SE Chestnut Ave SW , comum de IN a WI.
Ross Presser
@usr Nem todos os endereços se encaixam em três linhas - basta usar um varcharcampo de texto de várias linhas de forma livre e já!
user253751
Limitei-me a dois exemplos, mas há muito mais. 22 Essex House, Portman Square, Londres NW1 . O "22" é um número de apartamento.
Jim Garrison
8

Como todas as questões de design, há um "depende" altamente qualificado. Depende da sua história de dados - como os dados são coletados, como são usados, como são atualizados etc. Todos os meus comentários devem ser tomados como pontos de discussão, e não como respostas.

Parece que * você pode se beneficiar mais do uso de um serviço de validação de endereço do que tentar criar um para si mesmo. Embora sejam caros, muitos desses serviços oferecem descontos significativos para correspondência.

Obviamente, há um compromisso aqui, para determinadas histórias de dados. Você pode manter as partes de endereço analisadas e criar uma coluna computada (provavelmente um conjunto de colunas) para o endereço combinado. Esta é uma resposta de implementação, com todas as advertências normais implícitas.

Eu implementei o design de endereço analisado. É absolutamente necessário para qualidade e processamento de dados. Mas esse era um negócio que tinha endereços físicos, endereços postais, endereços virtuais etc.

A outra questão que pode surgir é que diferentes serviços postais exigem que as mesmas informações sejam apresentadas em diferentes formatos / pedidos / etc. Portanto, ter as peças modeladas suporta a apresentação das mesmas informações em vários formatos e layouts.

Finalmente, você não precisa ter operações comerciais internacionais para suportar dados internacionais. Até empresas norte-americanas precisam oferecer suporte a endereços internacionais. É um erro enorme de dados supor que você nunca terá isso. Os clientes mudam, os fornecedores mudam de sede, as informações de contato do fornecedor podem ser internacionais, mesmo que tenham uma sede nos EUA. Mesmo que seus sistemas atuais tenham cometido esse erro, você não deseja levar adiante este.

Eu recomendo os escritos e blogs de Graham Rhind. Ele é o especialista no campo de dados sobre endereços de todos os tipos e as compensações associadas a eles.


* Tudo o que eu disse aqui é uma generalização grosseira. Há tantas perguntas que eu teria que ajudar a chegar a uma solução de design que pode levar algumas horas de bate-papo. Provavelmente algumas fotos e alguns dados também. E depois muitas histórias de dados realmente peculiares sobre endereços.

Karen Lopez
fonte
"você não precisa ter operações comerciais internacionais para suportar dados internacionais" - é verdade. Além disso, estamos localizados fisicamente perto da fronteira de outro país. A equipe de modelagem que dar uma solução para endereços internacionais, que é fornecer linha 1, linha 2 e linha 3 campos no banco de dados.
Greg Burghardt 28/03
Embora você tenha dito que "é uma generalização grosseira", a solução unificada para endereços que temos em toda a empresa torna sua resposta ainda mais aplicável.
Greg Burghardt 28/03
5

Deixando totalmente de lado o enorme desafio de analisar corretamente a linguagem imprevisível que as pessoas fornecem, o benefício da análise é que ela oferece dimensões para agrupar e classificar. Código postal, por exemplo. No entanto, não há retorno da análise de uma dimensão específica até que você precise agrupar ou classificar nessa dimensão.

O que é um endereço, afinal? Você pode argumentar que é um identificador de local, mas também pode ser uma instrução de entrega - "Na rua da fábrica de cimento". Na Austrália, as pessoas pensam que os códigos postais são identificadores de local, mas não são, são códigos de roteamento - instruções de entrega. O 4702 é o Rockhampton Mail Centre, um importante nó de distribuição que atende uma região que se estende do mar até Emerald, uma cidade mineira a 300 km do interior.

Se você deseja identificar locais, o Bing e o Google podem geocodificar diretamente da sequência não analisada em coordenadas GPS, que podem ser armazenadas em uma tabela pequena e simples junto com a sequência não analisada. Eles usam a única abordagem geral com chance de obter resultados consistentemente bons: correspondência parcial ponderada classificada com um colossal banco de dados de resultados validados.

Se você deseja instruções de entrega, ainda é recomendável manter a sequência não analisada, pois ela pode conter qualquer coisa .

Observe que nos dois casos eu recomendo manter a string não analisada. Isso é porque

  • é útil por si só
  • um dia você vai descobrir como analisá-lo
  • alguns dias depois, você descobrirá como analisá-lo corretamente
  • isso nunca acaba

Indiscutivelmente, um endereço é sempre instruções de entrega, contendo pelo menos um identificador de local. Uma carta endereçada à "123 Main st, Emerald 4702" codifica três locais: RMC na parte norte de Rockhampton, Emerald e um endereço da rua. Os correios de Rockhampton simplesmente o enviarão para o RMC. O RMC o enviará para os correios Emerald, e esperamos que ele saiba onde encontrar a 123 Main Street.

Peter Wone
fonte
"O que é um endereço, afinal? ... você pode argumentar igualmente bem que são instruções de entrega" - Ponto muito bom. Eu acho que o aspecto "local" de um endereço e o aspecto "instruções de entrega" devem ser campos separados no banco de dados nesse caso.
precisa
3

Eu já implementei um sistema como esse antes, embora na Holanda. O problema é que esse tipo de informação pode mudar de mais maneiras do que você pensa. As ruas são renomeadas, as cidades são mescladas e assim por diante. É bom poder atualizar esse tipo de informação sem analisar os endereços como uma única sequência.

Sebastiaan van den Broek
fonte
3

Separar o código postal / CEP, o nome do edifício e o nome da estrada pode fazer sentido. Mas então, quando você começa a adicionar "cidade", "área" etc., fica questionável, comparado com apenas a linha1, linha2 etc. O problema é que nem eu e minha esposa podemos concordar com o nome da cidade em que vivemos! O nome da “vila” deve ser colocado no campo da cidade ou está na linha abaixo do nome da estrada, com a cidade local sendo colocada nos campos da cidade? (Algumas pessoas ficam ofendidas se você ligar para onde moram uma vila em vez de uma cidade, outras pessoas que moram no mesmo local se ofenderão se você chamar de cidade em vez de vila!)

Portanto, tentar fazer algo sofisticado não é melhor do que o sistema de verificação de endereço que você usa. Mas fica ainda pior. No Reino Unido, TODOS os endereços devem ter um código postal, mas o código postal não é alocado até algum tempo após a construção de uma casa …… Portanto, um sistema deve permitir que todas as regras sobre endereços sejam quebradas!

Ian Ringrose
fonte
2
O Amazon.uk tem o melhor sistema que eu já vi, quando digito o endereço, eles me dão a OPÇÃO de usar o endereço "aprovado" para as correspondências melhores. No entanto, muitas vezes o endereço aprovado é para uma empresa diferente no edifício, ou não inclui o "andar" etc., pois os correios apenas acariciavam onde estava a caixa de correio, e não para onde levar algo para assiná-lo.
Ian Ringrose 29/03
2

Além dos problemas já mencionados em outras respostas, em alguns idiomas - principalmente em alemão - os nomes de ruas tendem a ser compostos. Por exemplo, é comum em muitas cidades / cidades alemãs ter uma "Bahnhofstrasse", a rua que leva à estação ferroviária ("Bahnhof" significa estação ferroviária / ferroviária, "Strasse" significa rua). Certamente você pode separar esses dois componentes, mas agora, se quiser reuni-los novamente (por meio de programação), está se metendo em questões de declínio.

Ou, nos idiomas "romance" ou latino, você costuma ter nomes de ruas com a forma "Rue de la Pais" ou "Boulevard des Champs-Élysées". Agora você tem uma preposição ("de") e um artigo definido ("le" ou "la") na mistura - e eles podem ser combinados. Eles representam parte do tipo ou nome da rua? (Você provavelmente precisará armazená-los em algum lugar, caso contrário, entrará em declínio novamente.)


Uma vez eu modelei algo assim. Mas era uma aplicação muito pequena, para o escritório de manutenção de propriedades residenciais de uma universidade de médio porte (nos EUA). Tornei os endereços muito granulares pelos seguintes motivos:

  • Havia ruas na área com o mesmo nome, mas um "tipo" de rua diferente (por exemplo, "Woods Avenue" vs "Woods Court").
  • Os usuários queriam otimizar o trabalho de manutenção, por exemplo, se houvesse duas ou mais solicitações de serviço no mesmo bloco, essas poderiam ser tratadas ao mesmo tempo.
  • Os usuários queriam poder correlacionar problemas entre diferentes unidades (apartamentos) no mesmo prédio - por exemplo, se mais de um apartamento relatasse temperaturas frias ou água insuficientemente quente.

... e outras razões das quais não me lembro mais. (Isso foi no final dos anos 80).

E, novamente, isso só fazia sentido porque havia um número razoavelmente pequeno de endereços (e regras de formatação de endereços) para lidar. Não acredito que essa abordagem seja dimensionada, mesmo que limitada a endereços nos EUA, por razões já apresentadas em outras respostas.

David
fonte
11
Seu exemplo da década de 1980 é uma ilustração maravilhosa do meu argumento sobre analisar quaisquer dimensões que você precise manipular e "... armazene-as ou você está entrando em declínio" é um bom exemplo de por que é vital manter o texto de origem. Ele inevitavelmente contém todos os tipos de coisas não funcionais que, no entanto, devem ser preservadas. E por falar em coisas irrelevantes, mas interessantes, avenida significa "passeio construído em cima de muralhas defensivas demolidas".
quer